调用智能合约方法的 data 字段
date
Oct 28, 2022
slug
blockchain-contract-calling-process
status
Published
tags
Blockchain
summary
只是单纯的想了解一下
type
Post
下面是一个示例合约:
pragma solidity ^0.4.24;
contract GetterAndSetter {
int value;
function setValue(int newValue) public returns (int) {
value = newValue;
return value;
}
function getValue() public view returns (int) {
return value;
}
function increment() public returns (int){
value += 1;
return value;
}
}调用函数
setValue(1000) ,产生的 data 字段为:0x5093dc7d00000000000000000000000000000000000000000000000000000000000003e8 ,它拥有 72 个十六进制,换算一下总共是 288 位(72 × 4 = 288)。看了一下某个区块链 Java SDK 的源码,前面的
5093dc7d 是由函数签名经过 Keccak-256 运算后,截取哈希值的前八位。Keccak-256("setValue(int256)") = 0x5093dc7d|5b11a7a3cf7e0a8d2320b72c85c29a8ab58f7f7e43d313adfb2ed41f 。而后面的 3e8 则是具体函数的值。 直观上看,前 32 位表示函数的签名,后 256 位表示函数的值。
如果调用函数
setValue(-1000) ,产生的 data 字段为:0x5093dc7dfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18 。可以断定后 256 位存的是具体数字的补码。Keccak-256("setValue(int256)") = 0x5093dc7d5b11a7a3cf7e0a8d2320b72c85c29a8ab58f7f7e43d313adfb2ed41f
methodId = 0x5093dc7d0000000000000000000000000000000000000000000000000000000000000000
value = 0x 00000000000000000000000000000000000000000000000000000000000003e8
data = methodId + value
data = 0x5093dc7d00000000000000000000000000000000000000000000000000000000000003e8