Copyright © 2022-2024 aizws.net · 网站版本: v1.2.6·内部版本: v1.23.3·
页面加载耗时 0.00 毫秒·物理内存 67.3MB ·虚拟内存 1300.5MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
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 工厂合约是一种批量部署合约的方式。通过一个工厂合约创建部署合约,并记录下所有部署合约的地址。// SPDX-License-Identifier: MITpragma solidity ^0.8 ...