Skip to content

Latest commit

 

History

History
64 lines (56 loc) · 1.73 KB

File metadata and controls

64 lines (56 loc) · 1.73 KB

ABI编码解码

ABI编码

abi.encode

它讲每个参数填充为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.encodePacked

它与abi.encode类似,但是会把其中的0去掉,所有它的长度会小很多

function encodePacked() public view returns(bytes memory result) {
    result = abi.encodePacked(x, addr, name, array);
}

abi.encodeWithSignature

他在第一个参数加上了函数签名,其他与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.encodeWithSelector

与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解码

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]));
}

Hash

Hash的特性

  • 单一性
  • 高效
  • 抗碰撞
  • 灵敏性

Hash的应用

  • 生成数据唯一值
  • 加密签名
  • 安全加密

Keccak256

哈希 = Keccak256(数据);