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() 用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值