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()
效果如下:
附录
需要安装ethers.js依赖包
npm install ethers@5.5.1
参考文献
以上是关于ethers计算函数选择器与事件选择器的主要内容,如果未能解决你的问题,请参考以下文章
CSSCSS 复合选择器 ③ ( 并集选择器 | 并集选择器与后代选择器示例 )