Solidity函数选择器与ABI编码原理,是何原理?🤔

2026-06-03 18:555阅读0评论SEO优化
  • 内容介绍
  • 文章标签
  • 相关推荐

说实话, 你有没有好奇过当我们调用智能合约中的某 差点意思。 个函数时EVM是怎么知道我们要调用哪个函数的?🤔

哈哈,其实这背后全靠函数选择器和ABI编码的功劳! 我天... 咱就是说今天咱们就来好好聊聊这个。

《纸上谈兵·solidity》第 12 课:Solidity 函数选择器与 ABI 编码原理

函数选择器:干啥用的?

函数选择器是啥?简单它就是一个函数的“身份证”😂,或者说是用来标识你到底要调用哪个函数的。

是不是? 它的生成方式是:对函数的签名进行keccak256哈希运算,然后取前4个字节。你可能会问,那为啥是前4个字节呢?害,这主要是为了节省空间,一边也够用了。

selector = keccak256") 前 4 个字节

举个例子, 比如transfer这个函数的选择器,就是0xa9059cbb。你可以用Solidity内置的keccak256函数自己算算看,到时候…..。

代码实践:获取函数选择器

站在你的角度想... // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract SelectorExample { function getSelector public pure returns { return this.transfer.selector; } function transfer public pure returns { return true; } }

// 输出:0xa9059cbb

ABI编码:咋编码的?🤔

ABI是以太坊智能合约交互的标准。可以理解为,它定义了数据怎么序列化,怎么反序列化。

Solidity中,ABI编码有几个关键函数:abi.encode, .encodePacked, .encodeWithSelector, .encodeWithSignature等。 内卷。 你可能已经蒙了😵,别急,一个个来说。

.encodeWithSelector

.encodeWithSelector: 这个函数先把函数选择器加上,然后再加上参数的编码后来啊。你可以理解为,它就是用来构造一个完整的函数调用数据的。

挖野菜。 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract ABIEncodingExample { function encodeWithSelectorExample public pure returns { address to = address; uint256 amount = 100; bytes4 selector = .selector; return .encodeWithSelector; } }

.encodeWithSignature

.encodeWithSignature: 这个和.encodeWithSelector类似, 不过它不需要你手动计算函数选择器,直接传入函数签名(比如"transfer")就行。它内部会帮你计算选择器,卷不动了。。

EVM如何处理这些编码数据?🔍

EVM收到一笔交易时 会先查看data字段的前4个字节(即函数选择器), 是不是? 然后;如果没找到,通常会revert。

Solidity代码示例:call调用与ABI编码👀

反思一下。 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract TestContractCall { function callTransfer public returns { bytes memory data = abi.encodeWithSignature", to, amount); // 不对不对, 这里应该用 .encodeWithSelector data = .encodeWithSelector")), to, amount); // 应该这么写 = target.call; // 调用目标合约的 transfer 函数 require; // 检查调用后来啊 return success; } };

EVM施行流程简析🕵️‍♂️

EVM接收到交易,检查: 如果非空,取出前4字节作为.... … .... 这玩意儿就像一把钥匙,帮助EVM快速找到你要施行的那个合约里的具体方法。你看完这篇, 应该就能明白Solidity里头这些关于ABI编码、还有那个“.”都是怎么一回事儿了吧~ 👏 话说回来这个技术细节其实相当重要,特别是对于那些搞合约开发、平安审计什么的人来说,官宣。。

说实话, 你有没有好奇过当我们调用智能合约中的某 差点意思。 个函数时EVM是怎么知道我们要调用哪个函数的?🤔

哈哈,其实这背后全靠函数选择器和ABI编码的功劳! 我天... 咱就是说今天咱们就来好好聊聊这个。

《纸上谈兵·solidity》第 12 课:Solidity 函数选择器与 ABI 编码原理

函数选择器:干啥用的?

函数选择器是啥?简单它就是一个函数的“身份证”😂,或者说是用来标识你到底要调用哪个函数的。

是不是? 它的生成方式是:对函数的签名进行keccak256哈希运算,然后取前4个字节。你可能会问,那为啥是前4个字节呢?害,这主要是为了节省空间,一边也够用了。

selector = keccak256") 前 4 个字节

举个例子, 比如transfer这个函数的选择器,就是0xa9059cbb。你可以用Solidity内置的keccak256函数自己算算看,到时候…..。

代码实践:获取函数选择器

站在你的角度想... // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract SelectorExample { function getSelector public pure returns { return this.transfer.selector; } function transfer public pure returns { return true; } }

// 输出:0xa9059cbb

ABI编码:咋编码的?🤔

ABI是以太坊智能合约交互的标准。可以理解为,它定义了数据怎么序列化,怎么反序列化。

Solidity中,ABI编码有几个关键函数:abi.encode, .encodePacked, .encodeWithSelector, .encodeWithSignature等。 内卷。 你可能已经蒙了😵,别急,一个个来说。

.encodeWithSelector

.encodeWithSelector: 这个函数先把函数选择器加上,然后再加上参数的编码后来啊。你可以理解为,它就是用来构造一个完整的函数调用数据的。

挖野菜。 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract ABIEncodingExample { function encodeWithSelectorExample public pure returns { address to = address; uint256 amount = 100; bytes4 selector = .selector; return .encodeWithSelector; } }

.encodeWithSignature

.encodeWithSignature: 这个和.encodeWithSelector类似, 不过它不需要你手动计算函数选择器,直接传入函数签名(比如"transfer")就行。它内部会帮你计算选择器,卷不动了。。

EVM如何处理这些编码数据?🔍

EVM收到一笔交易时 会先查看data字段的前4个字节(即函数选择器), 是不是? 然后;如果没找到,通常会revert。

Solidity代码示例:call调用与ABI编码👀

反思一下。 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract TestContractCall { function callTransfer public returns { bytes memory data = abi.encodeWithSignature", to, amount); // 不对不对, 这里应该用 .encodeWithSelector data = .encodeWithSelector")), to, amount); // 应该这么写 = target.call; // 调用目标合约的 transfer 函数 require; // 检查调用后来啊 return success; } };

EVM施行流程简析🕵️‍♂️

EVM接收到交易,检查: 如果非空,取出前4字节作为.... … .... 这玩意儿就像一把钥匙,帮助EVM快速找到你要施行的那个合约里的具体方法。你看完这篇, 应该就能明白Solidity里头这些关于ABI编码、还有那个“.”都是怎么一回事儿了吧~ 👏 话说回来这个技术细节其实相当重要,特别是对于那些搞合约开发、平安审计什么的人来说,官宣。。