再谈无ABI函数调用

2022-02-22 18:19:10 浏览数 (1)

auok007[1]

发了在没有 abi 文件的情况下调用智能合约方法,web3py 实现 [2]之后,联系我的朋友不少,看来对这块有需求的朋友不少,在和他们交流的过程中,我发现不少人对这块还有一些误区。

一些问题

1、调用合约函数,需要合约完整的 abi 吗?

不需要,只需要调用函数的函数定义

2、调用别人的合约需要什么?

合约地址,合约函数定义,合约签名, 如果函数能识别,可以直接复制函数定义,定义空函数。

3、会不会因为语言不一样?

不会,本质上都是通过网络连接进行 rpc 调用,所以需要的东西是一样的。通过地址调用合约函数,只需要函数签名和参数。

4、目前实现签名替换有语言有哪些?

目前 python 的已经实现,参考我前面的文章在没有 abi 文件的情况下调用智能合约方法,web3py 实现 | 登链社区 | 深入浅出区块链技术 (learnblockchain.cn)[3]node ether.js 已经实现,放在登链集市ether.js 无 abi 调用合约函数,关键代码 - 作品详情 - 登链社区 (learnblockchain.cn)[4]

请能用到觉得有点用的朋友支持,如需要其他语言定制版的请联系我。技术讨论,可以直接评论。

一个演示

部署 Greeter2 合约,用 Greeter 的 abi 进行调用,测试代码中有注释。

合约

代码语言:javascript复制
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

contract Greeter {
    string private greeting;

    constructor(string memory _greeting) {
        greeting = _greeting;
    }

    function greet() public view returns (string memory) {
        return greeting;
    }

    function greet2(uint256 num) public view returns (string memory) {
        return "greet2";
    }

    function greet3(uint256 num) public view returns (string memory) {
        return "greet3";
    }

    function setGreeting(string memory _greeting) public {
        greeting = _greeting;
    }
}
代码语言:javascript复制
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

//import "hardhat/console.sol";

contract Greeter2 {
    //string private greeting;

    constructor() {}

    function greet3(uint256 num) public view returns (string memory) {
        return "kjljlkjljlkjlkjgreet3";
    }
}

测试代码

代码语言:javascript复制
it("Should return the new greeting once it's changed", async function () {
        const Greeter2 = await ethers.getContractFactory("Greeter2");
        const greeter2 = await Greeter2.deploy();
        await greeter2.deployed();
        console.log("sportFactory:", greeter2.address)
        const greeter = await ethers.getContractAt("Greeter", greeter2.address) //使用Greeter的abi greeter2的地址
        const gg = await greeter.greet2(123, "0x02d355dc"); //调用greeter2 的greet3函数,函数签名模式
        console.log("greet2 greet2 sign:", gg.toString())
        const gg2 = await greeter.greet3(123);   //直接调用greeter2 的greet3函数
        console.log("greet2 greet3:", gg2.toString())
    })

输出

代码语言:javascript复制
sportFactory: 0xF1b66c6FB483574744D5C418c1c8464F1EEd81fa
greet2 greet2 sign: kjljlkjljlkjlkjgreet3
greet2 greet3: kjljlkjljlkjlkjgreet3

参考资料

[1]

auok007: https://learnblockchain.cn/people/6025

[2]

在没有abi文件的情况下调用智能合约方法,web3py实现 : https://learnblockchain.cn/article/3506

[3]

在没有abi文件的情况下调用智能合约方法,web3py实现 | 登链社区 | 深入浅出区块链技术 (learnblockchain.cn): https://learnblockchain.cn/article/3506

[4]

ether.js 无abi调用合约函数,关键代码 - 作品详情 - 登链社区 (learnblockchain.cn): https://learnblockchain.cn/goods/33

0 人点赞