Solidity 哈希算法 keccak256

Solidity 的哈希算法使用一个内置函数 keccak256。

keccak256函数原型:

keccak256(bytes) returns (bytes32)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Hash {
    function hash(string memory _text, uint _num, address _addr) 
    public pure returns (bytes32) {
        return keccak256(abi.encodePacked(_text, _num, _addr));
    }
}

我们通常使用 abi.encodePacked 打包所有数据,然后再进行 keccak256 哈希。

但是,我们使用 abi.encodePacked 要非常小心,当将多个动态数据类型传递给 abi.encodePacked 时,可能会发生哈希冲突。

abi 编码函数除了 abi.encodePacked 外,还有函数 abi.encode。 abi.encodePacked 只是将参数转为 16 进制,再直接进行拼接,而 abi.encode 需要先进行补零 ,再进行转码拼接。

我们可以看一个例子:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Hash {
    function encode1() external pure returns(bytes memory){
       return abi.encodePacked("aa","bb");
    }

    function encode2() external pure returns(bytes memory){
       return abi.encodePacked("aab","b");
    }
}

两个方法返回的内容都是0x61616262,但两者的输入参数并不同。在这种情况下,您应该使用 abi.encode 代替

或者使用 encodePacked,但是在两个参数之间再添加一个固定数字参数即可。

例如:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Hash {
    function encode1() external pure returns(bytes memory){
       return abi.encodePacked("aa",uint(1),"bb");
    }

    function encode2() external pure returns(bytes memory){
       return abi.encodePacked("aab",uint(1),"b");
    }
}

下一章:Solidity 工厂合约

Solidity 工厂合约是一种批量部署合约的方式。通过一个工厂合约创建部署合约,并记录下所有部署合约的地址。// SPDX-License-Identifier: MITpragma solidity ^0.8 ...