它讲每个参数填充为32个字节数据,并拼接在一起
uint x = 10;
address addr = 0xABCDEFG00000FFFFFFFFFFFFFFFAAAAAAAAAAAAA;
string name = "0XAA";
uint[2] array = [1,2];
function encode() public view returns(bytes memory result){
result = abi.encode(x, addr, name, array);
}
它与abi.encode类似,但是会把其中的0去掉,所有它的长度会小很多
function encodePacked() public view returns(bytes memory result) {
result = abi.encodePacked(x, addr, name, array);
}
他在第一个参数加上了函数签名,其他与abi.encode类似,配合call,调用其他合约的时候使用
function encodeWithSignature() public view returns(bytes memory result) {
result = abi.encodeWithSignature("foo(uint256,address,string,uint256[2])", x, addr, name, array);
}
与abi.encodeWithSignature功能类似,区别是他的第一个参数是函数选择器,也就是 函数签名的哈希的前4个字节
function encodeWithSelector() public view returns(bytes memory result) {
result = abi.encodeWithSelector(bytes4(keccak256("foo(uint256,address,string,uint256[2])")), x, addr, name, array);
}
abi.decode用于解码abi.encode生成的编码
function decode(bytes memory data) public pure returns(uint dx, address daddr, string memory dname, uint[2] memory darray) {
(dx, daddr, dname, darray) = abi.decode(data, (uint, address, string, uint[2]));
}
- 单一性
- 高效
- 抗碰撞
- 灵敏性
- 生成数据唯一值
- 加密签名
- 安全加密
哈希 = Keccak256(数据);