ethers计算函数选择器与事件选择器

Posted sanqima

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ethers计算函数选择器与事件选择器相关的知识,希望对你有一定的参考价值。

    在Solidity中,函数选择器是对函数头进行keccak256()计算取前4个字节,事件选择器是对事件头进行keccak256()计算取完整的32字节。在ethers.js里对这个keccak256进行了封装,变成了ethers.utils.id()

函数选择器

const ethers = require('ethers')

//函数功能: 计算函数选择器
//input: funcHead 是函数头部申明,去掉""funcion"关键字,去掉参数名字,只
//          保留函数名+参数类型,去掉所有的空格
//return: 返回4个字节的字符串
function getFunctionSeletor(funcHead) 
    return ethers.utils.id(funcHead).slice(0,10)

事件选择器

const ethers = require('ethers')

//函数功能: 计算事件选择器
//input: eventHead 是事件头部申明,去掉""event"关键字,去掉参数名字,只
//          保留事件名+参数类型,去掉所有的空格
//return: 返回32个字节的字符串
function getEventSelector(eventHead) 
    return ethers.utils.id(eventHead)

案例

  • 计算 function allowance(address owner, address spender) external view returns (uint256) 的函数选择器
    //1)计算函数选择器
    //原函数:function allowance(address owner, address spender)
    //精简化: allowance(address,address)
    strfunc = 'allowance(address,address)'
    funcSeletor = getFunctionSeletor(strfunc)
    res = strfunc + '='
    console.log(res,funcSeletor)

得到 allowanc()的函数选取器为: 0xdd62ed3e

  • 计算event Approval(address owner, address spender, uint256 value)的事件选择器
     //2) 计算事件选择器
    //原事件: event Approval(address owner, address spender, uint256 value)
    //精简化: Approval(address,address,uint256)
    strEvent = 'Approval(address,address,uint256)'
    eventSelector = getEventSelector(strEvent)
    res2 = strEvent + '='
    console.log(res2,eventSelector)

得到 Approval()的事件选择器为: 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925

完整代码

// 2_select.js

const ethers = require('ethers')

//函数功能: 计算函数选择器
//input: funcHead 是函数头部申明,去掉""funcion"关键字,去掉参数名字,只
//          保留函数名+参数类型,去掉所有的空格
//return: 返回4个字节的字符串
function getFunctionSeletor(funcHead) 
    return ethers.utils.id(funcHead).slice(0,10)


//函数功能: 计算事件选择器
//input: eventHead 是事件头部申明,去掉""event"关键字,去掉参数名字,只
//          保留事件名+参数类型,去掉所有的空格
//return: 返回32个字节的字符串
function getEventSelector(eventHead) 
    return ethers.utils.id(eventHead)


function doMain() 
    //1)计算函数选择器
    //原函数:function allowance(address owner, address spender)
    //精简化: allowance(address,address)
    strfunc = 'allowance(address,address)'
    funcSeletor = getFunctionSeletor(strfunc)
    res = strfunc + '='
    console.log(res,funcSeletor)

    //2) 计算事件选择器
    //原事件: event Approval(address owner, address spender, uint256 value)
    //精简化: Approval(address,address,uint256)
    strEvent = 'Approval(address,address,uint256)'
    eventSelector = getEventSelector(strEvent)
    res2 = strEvent + '='
    console.log(res2,eventSelector)


doMain()

效果如下:

图(1) 函数选择器与事件选择器

附录

    需要安装ethers.js依赖包

npm install ethers@5.5.1

参考文献

    ethers.js 文档 utils.id() 用法

以上是关于ethers计算函数选择器与事件选择器的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 选择器与事件

jQuery选择器与事件学习笔记

CSSCSS 复合选择器 ③ ( 并集选择器 | 并集选择器与后代选择器示例 )

CSSCSS 复合选择器 ① ( 基础选择器与复合选择器 | 后代选择器 )

jQuery选择器与JavaScript易出错知识点

jquery 选择器与 css3 选择器的性能