调用智能合约方法的 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 
 

© therainisme 2025