计算合约方法的签名

计算合约方法的签名

通过智能合约实现

// 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));

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半山猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值