以太坊python中的直观的实体合同返回值

问题描述 投票:0回答:1

我正在玩以太坊和python,遇到了一些我无法理解的怪异行为。我在使用python w3客户端调用协定函数时难以理解返回值如何工作。这是一个最小的示例,它以几种不同的方式使我感到困惑:

合同:

语用强度^ 0.4.0;合同测试{功能测试(){}函数return_true()公共返回(布尔){返回true;}函数return_address()公共返回(地址){返回0x111111111111111111111111111111111111111;}}

Python单元测试代码

从web3导入Web3,EthereumTesterProvider从solc导入compile_source从web3.contract导入ConciseContract导入单元测试导入操作系统def get_contract_source(file_name):使用open(file_name)as f:返回f.read()类TestContract(unittest.TestCase):CONTRACT_FILE_PATH =“ test.sol”DEFAULT_PROPOSAL_ADDRESS =“ 0x11111111111111111111111111111111111111111”def setUp():#从MIT许可证的https://github.com/ethereum/web3.py/tree/1802e0f6c7871d921e6c5f6e43db6bf2ef06d8d1复制#稍作修改即可与此单元测试一起使用contract_source_code = get_contract_source(self.CONTRACT_FILE_PATH)已编译_sol = compile_source(contract_source_code)#已编译的源代码contract_interface =编译的溶胶[':test']#web3.py实例self.w3 = Web3(EthereumTesterProvider())#实例化并部署合同self.contract = self.w3.eth.contract(abi = contract_interface ['abi'],字节码= contract_interface ['bin'])#从已部署的合同获取交易哈希tx_hash = self.contract.constructor()。transact({'from':self.w3.eth.accounts [0]})#获取收据以获取合同地址tx_receipt = self.w3.eth.getTransactionReceipt(tx_hash)self.contract_address = tx_receipt ['contractAddress']#简洁模式下的合约实例abi = contract_interface ['abi']self.contract_instance = self.w3.eth.contract(address = self.contract_address,abi = abi,ContractFactoryClass = ConciseContract)def test_return_true_with_gas():#失败为HexBytes('0xd302f7841b5d7c1b6dcff6fca0cd039666dbd0cba6e8827e72edb4d06bbab38f')!= Trueself.assertEqual(True,self.contract_instance.return_true(transact = {“ from”:self.w3.eth.accounts [0]}))def test_return_true_no_gas(self):#通行证self.assertEqual(真实,self.contract_instance.return_true())def test_return_address(self):#失败并出现AssertionError:'0x1111111111111111111111111111111111111111111'!='0x0111111111111111111111111111111111111111111'self.assertEqual(self.DEFAULT_PROPOSAL_ADDRESS,self.contract_instance.return_address())

我有三种方法对合同中的功能进行测试。在其中之一中,返回非True值,而是返回HexBytes。在另一个函数中,Contract函数返回一个地址常量,但是python看到的值与期望值不同。在另一种情况下,我在没有气体的情况下调用return_true合约函数,并且True常量被python看到。

  1. 为什么用return_true调用transact={"from": self.w3.eth.accounts[0]}会使函数的返回值为HexBytes(...)
  2. 为什么return_address返回的地址与我期望的地址不同?

我认为我对gas如何影响函数调用有一些根本性的误解。

python ethereum solidity web3
1个回答
0
投票
  1. 返回值是区块链上的交易哈希。进行交易时(即,使用“交易”而不是“调用”时),区块链会被修改,您正在使用的库将返回交易哈希。在该过程中,您必须已支付以太币才能修改区块链。但是,在只读模式下运行完全不花费任何醚,因此无需指定气体(实际上您不能指定)。

  2. 开头以“ 0x”折扣,以太坊地址的长度为40,但是在您的测试中,您使用的是39长的地址,因此此处缺少“ 1”。意思是,测试是正确的,您输入的内容有误。

Offtopic,return_truereturn_address在Solidity中均应标记为view,因为它们实际上并未修改状态。我很确定您会在混音中收到警告。一旦这样做,就无需使用“交易”和支付以太币来访问这两种方法,并且可以免费使用“通话”来进行这两种方法。

编辑

[忘记提及:如果您需要在使用transact之后访问事务哈希,则可以对返回的.hex()对象调用HexBytes方法。这将为您提供交易哈希作为字符串,通常比HexBytes更有用。

希望对您有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.