如何解码以太坊区块链中智能合约存储的原始文本数据
SimpleStorage合约交易参数解码方案
待解析合约代码
contract Simplestorage { string data; function store(string memory _data) public { data = _data; } function retrieve() public view returns (string memory) { return data; } }
待解析交易数据
AttributeDict({'hash': HexBytes('0x81bd6e7c3a02100cc79b96f05197f4cfab26e1dcce43b1ef3f9d6b34c494a55b'), 'nonce': 35, 'blockHash':HexBytes('0x0b66c58c5158cc03135ce8c866923f3110ffa1a0a17a14f1003fe123824a76ef'), 'blockNumber': 36, 'transactionIndex': 0, 'from': '0xe67E47A0B42d20643c723E31D0dBA0cE64e5c071', 'to': '0xdef7b161ef19A9d79d94B8244750cdddcbA41206', 'value': 0, 'gas': 43468, 'gasPrice': 20000000000, 'input': '0x131a06800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a686920686f772061726520796f7520686f772061726520796f75000000000000', 'v': 2710, 'r': HexBytes('0xd1acd5be3dad14eb0ee9e5078aa7dde1e494e31723e12e4765f475ffeddec431'), 's': HexBytes('0x4ba1b8e2778fc2d350d866bd2876d7fdedeefebe5fd5452ac352600c4ed6f1e9')})
核心结论
解码交易中存储的原始文本完全不需要私钥。EVM链上的交易输入数据是公开的,所有合约调用参数都按照ABI规范明文编码在交易的input字段中,直接按规则解析即可。私钥仅用于交易签名阶段,交易上链后参数解析不需要任何签名相关的密钥信息。交易结构里的v/r/s字段仅用于校验交易发送者身份,和参数解码无关。
解码规则与步骤
EVM合约调用的input字段遵循ABI编码规范,针对本次调用store(string)的场景,解析步骤如下:
- 第一步:提取前4字节(8个十六进制字符)为函数选择器,值为
0x131a0680,对应函数签名store(string)的Keccak256哈希前4字节,确认调用的是目标存储函数。 - 第二步:函数选择器之后的32字节为动态参数偏移量,本次值为
0x20(十进制32),代表字符串参数的起始位置在选择器之后偏移32字节处。 - 第三步:从偏移位置开始读取32字节为字符串长度,本次值为
0x1a(十进制26),代表存储的文本共26字节。 - 第四步:从长度字段之后读取对应26字节的内容,按UTF-8/ASCII编码转码即为原始文本,末尾补位的0值直接丢弃即可。
本次交易解析结果
提取到的26字节内容段为686920686f772061726520796f7520686f772061726520796f75,转码后得到原始存储文本:
hi how are you how are you
内容的提问来源于stack exchange,提问作者Naresh Muthumula
相关产品推荐
相关产品推荐

