Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在没有abi文件的情况下调用智能合约方法,web3py实现

在没有abi文件的情况下调用智能合约方法,web3py实现

作者头像
Tiny熊
发布于 2022-02-22 10:17:48
发布于 2022-02-22 10:17:48
2.4K00
代码可运行
举报
运行总次数:0
代码可运行

本文作者:auok007[1]

源起

前几天,回答了一个问题,感觉还可以,写成一篇文章记录一下。问题在:如何用 web3py 调用闭源合约[2]

问题中提到的交易记录在Binance Transaction Hash (Txhash) Details[3]

首先查看交易记录,bscscan 不能解析出来函数名,也就是 abi 没有公开。

确定函数调用签名

也就是 0xb45112b2

区块链中合约代码执行,需要指定某个合约地址的某个函数,其中这个执行的函数是使用 Keccak-256(SHA-3)编码后的散列,取散列的前四个字节作为函数签名。官方定义:"签名被定义为没有数据位置说明符的基本原型规范表达式,即具有带括号的参数类型列表的函数名称"。通俗的说就是:将函数名,带顺序的变量类型以及参数括号进行 Keccak-256 编码后,取前四个字节的二进制字符串,即以太坊的合约函数签名。

1,搜索网上的签名数据库:https://www.4byte.directory/signatures/ 搜索结果如下:

说明还没有上传函数的 abi 定义 2,没有函数的 abi 信息,就没办法调用了吗?当然不是!只需要找到函数的定义,就相当于,你定义一个函数指针,签名只是这个函数指针,函数的参数保证调用堆栈不出错,而函数签名我们是有的。3,找到函数原型,找到合约 点击合约地址 0x217 这个

合约代码不公开

点击 bytecode-decompiler,得到这样的代码:

搜索函数签名,得到函数原型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def unknownb45112b2(uint256 _param1): # not payable
 require calldata.size - 4 >=32
 require _param1 == _param1
 require ext_code.size(heroContractAddress)

4,构建函数名不一样,函数参数一样的函数 这个函数有返回值,只是为了方便演示效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function greet3(uint256 num) public view returns (string memory) {
        return "greet3";
    }

用你的合约生成调用接口 在使用的时候,address 为合约地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
greeter = w3.eth.contract(
    address='0xB5816B1C17ce9386019ac42310dB523749F5f2c3',
    abi=jsobjs['abi']
)

再就是调用方法

搞定问题

1,查看 webpy 的代码,显然这样的调用是不支持的。2,自己修改 webpy 的代码,支持签名替换 我开源的代码里面提供了,修改过的,contract.py[4]替换即可使用。github 上有修改说明。代码里面有个例子,一个合约里面提供 2 个函数,函数签名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function greet2(uint256 num) public view returns (string memory) {
        return "greet2";
    }

    function greet3(uint256 num) public view returns (string memory) {
        return "greet3";
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* greet2 函数签名 '0xf9220889'
* greet3  函数签名 '0x02d355dc'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(greeter.functions.greet3(456).call(sigfn="0xf9220889"))

打印

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
greet2

开源代码在:daodao2007/e001: call smart contract method without abi file [5]

大家如果需要其他语言、框架的版本可以联系我。

参考资料

[1]

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

[2]

如何用web3py调用闭源合约: https://learnblockchain.cn/question/3036

[3]

Binance Transaction Hash (Txhash) Details: https://bscscan.com/tx/0xa3c53ab27fda6f341f2caefeb356051e1de56e27549a586c79fbc67209a9c53d

[4]

contract.py: https://github.com/daodao2007/e001/blob/master/contract.py

[5]

daodao2007/e001: call smart contract method without abi file: https://github.com/daodao2007/e001

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

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

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

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

评论
登录后参与评论
暂无评论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验