python - 使用 web3.py 解码智能合约的返回值?
问题描述
我重新发布了这个问题,因为它描述得不好。
我正在研究一个智能合约,当我使用 web3.py 使用 python 脚本调用它时,它假设返回 1,但是我的 python 脚本中没有 1,而是收到一个 hexbytes 对象。我想我需要使用 ABI 和 web3.py 对其进行解码,但我不知道如何?
我有一个这样的功能:
pragma solidity ^0.5.10;
contract test {
function test(int a) public returns (int) {
if(a > 0){
return 1;
}
}
}
当我用我的 python 脚本调用它时:
import json
import web3
from web3 import Web3
#To connect to ganache blockchain:
ganache_url = "http://127.0.0.1:7545"
web3 = Web3(Web3.HTTPProvider(ganache_url))
#this script will be the account number 1 on ganache blockchain:
web3.eth.defaultAccount = web3.eth.accounts[1]
#smart contract: abi, address and bytecode
abi = json.loads('....')
address = web3.toChecksumAddress("0x4A4AaA64857aa08a709A3470A016a516d3da40bf")
bytecode = "..."
#refering to the deploy coontract
contract = web3.eth.contract(address = address, abi = abi, bytecode = bytecode)
con = contract.functions.test(52).transact()
print(con.hex())
我有这样的结果:
<class 'hexbytes.main.HexBytes'>
0x3791e76f3c1244722e60f72ac062765fca0c00c25ac8d5fcb22c5a9637c3706d
有人可以帮忙吗?
解决方案
该transact()
方法提交交易并返回交易哈希。您应该首先等待交易被挖掘,并使用w3.eth.waitForTransactionReceipt
. 如果您打算使用事务而不是调用,则可以通过改变状态来获取函数的结果,然后通过调用view
函数或改变状态并生成event
.
在您的情况下,您不会改变状态,因此您可以将函数标记为view
:
function test(int a) view public returns (int)
然后使用call
而不是生成事务:
contract.functions.test(52).call()
官方的 web3py 文档也有很多调用智能合约函数的例子。
推荐阅读
- javascript - 使用 .then 并发送 res 使用 Nodejs
- javascript - 反应 - 不能调用 onClick()
- c# - 在 iText 7 段落中拆分溢出文本
- c - 在用 C 中相邻元素的平均值替换每个元素后,从原始数组中重现值
- azure - 数据工厂不会加载大列
- python - CodingBat practice question - Python Strings
- javascript - Apex Chart - 反向条形图,所以 0 是最大值
- php - 如何仅在访问并离开 Woocommerce 中的结帐页面后清除购物车内容?
- json - Apache Spark SQL get_json_object java.lang.String 无法转换为 org.apache.spark.unsafe.types.UTF8String
- excel - Excel VBA功能区 - 根据工作表上的值设置启动时编辑框的值