前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >再谈无ABI函数调用

再谈无ABI函数调用

作者头像
Tiny熊
发布2022-02-22 18:19:10
发布2022-02-22 18:19:10
99700
代码可运行
举报
运行总次数:0
代码可运行

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
代码运行次数:0
运行
复制
//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
代码运行次数:0
运行
复制
//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
代码运行次数:0
运行
复制
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
代码运行次数:0
运行
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一些问题
  • 一个演示
    • 合约
    • 测试代码
    • 输出
    • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档