使用web3.py解码智能合约的返回值?

2024-09-22 16:31:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我重新提出这个问题,因为它没有被很好地描述

我正在开发一个智能合约,当我使用web3.py用python脚本调用它时,它应该返回1,但是我的python scirpt中没有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

有人能帮忙吗


Tags: pytestimport脚本address解码intweb3
1条回答
网友
1楼 · 发布于 2024-09-22 16:31:23

transact()方法提交事务并返回事务哈希。您应该首先等待挖掘事务,然后使用w3.eth.waitForTransactionReceipt获取事务收据。如果您打算使用事务而不是调用,则可以通过改变状态,然后通过调用view函数或改变状态并生成event来读取结果状态,从而获得函数的结果

在您的情况下,您不会改变状态,因此可以将函数标记为view

function test(int a) view public returns (int)

然后使用call而不是生成事务:

contract.functions.test(52).call()

你可以读here about the difference between a transaction and a call

另外official web3py documentation还有许多调用智能合约函数的示例

相关问题 更多 >