当前位置: 首页 > article >正文

计算合约方法的签名

计算合约方法的签名

通过智能合约实现

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract FunctionSelector {
    /*
    "transfer(address,uint256)"
    0xa9059cbb
    "transferFrom(address,address,uint256)"
    0x23b872dd
    */
    function getSelector(string calldata _func)
        external
        pure
        returns (bytes4)
    {
        return bytes4(keccak256(bytes(_func)));
    }
}

部署合约,然后传入对应方法的签名,执行getSelector,就可以获得输出。

通过web3j实现

@Test
public void buildErc20MethodId_transferFrom(){
    String from = "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4";
    String to = "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4";
    BigDecimal amount = BigDecimal.TEN;

    // 构建方法调用信息 transferFrom(address,address,uint256)
    String method = "transferFrom";
    // 构建输入参数
    List<Type> inputArgs = new ArrayList<>();
    inputArgs.add(new Address(from));
    inputArgs.add(new Address(to));
    inputArgs.add(new Uint256(Convert.toWei(amount, Convert.Unit.WEI).toBigInteger()));

    // 合约返回值容器
    List<TypeReference<?>> outputArgs = new ArrayList<>();
    String funcABI = FunctionEncoder.encode(new Function(method, inputArgs, outputArgs));
    System.out.println(funcABI);

    Assert.assertEquals("0x23b872dd", funcABI.substring(0, 10));

}

http://www.kler.cn/a/373872.html

相关文章:

  • Golang | Leetcode Golang题解之第515题在每个树行中找最大值
  • 10进阶篇:运用第一性原理解答“是什么”类型题目
  • OpenCV基础01
  • Python 变量在函数中的作用域
  • 深度学习基础—循环神经网络(RNN)
  • 第三百零二节 Lucene教程 - Lucene搜索文件
  • Terraform Provider 加速方案
  • Mybatis-17.动态SQL-foreach
  • 【Unity】游戏UI中添加粒子特效导致穿层问题的解决
  • Android:ViewPaper动态添加移除第一页
  • ssm017网上花店设计+vue(论文+源码)_kaic
  • Django - 验证码使用
  • Python基础学习(八)断点调试
  • HTML入门教程19:HTML ID
  • 软件项目管理要点
  • 深度学习:yolo的使用--图像处理
  • 任意文件下载
  • 后端Java学习:springboot之文件上传(阿里云OSS存储)
  • object_model_3d_to_xyz 自理解及操作
  • Java设计模式之代理模式(三)
  • nmcli命令网络配置详解
  • 手动写一个new
  • 华为防火墙配置-基于IP地址和端口的安全策略
  • Docker快速安装Loki
  • JavaScript Prototype
  • 控制器一些不常用的的功能说明