我在玩以太坊和python,遇到了一些我无法理解的奇怪行为。在使用pythonw3客户机调用契约函数时,我很难理解返回值是如何工作的。下面是一个很小的例子,在几个不同的方面让我感到困惑:
合同:
pragma solidity ^0.4.0; contract test { function test(){ } function return_true() public returns (bool) { return true; } function return_address() public returns (address) { return 0x111111111111111111111111111111111111111; } }
Python单元测试代码
^{pr2}$我有三种方法来测试合同中的功能。在其中一个中,返回一个非True
值,而是返回HexBytes
。在另一种情况下,契约函数返回一个地址常量,但python看到的值与预期值不同。在另一个例子中,我调用了没有gas的return_true
契约函数,True
常量被python看到。在
transact={"from": self.w3.eth.accounts[0]}
调用return_true
会导致函数的返回值是HexBytes(...)
?在return_address
返回的地址与我期望的不同?在我想我对gas如何影响函数调用有一些基本的误解。在
返回值是区块链上的交易哈希值。当交易时(即,当使用“transact”而不是“call”时),区块链将被修改,而您正在使用的库将返回事务哈希。在这个过程中,你必须支付以太币才能修改区块链。然而,在只读模式下操作根本不需要乙醚,所以不需要指定气体。
如果不考虑开头的“0x”,以太坊地址的长度为40,但在测试中使用的是39个字符长的地址,因此缺少一个“1”。意思是,测试是正确的,你的输入有错误。
离题的是,}都应该标记为
return_true
和{view
,因为它们实际上并没有修改状态。我敢肯定你在混音中得到了警告。一旦您这样做了,就不需要使用“transact”和paying ether来访问这两个方法,您可以使用“call”免费进行访问。在编辑
忘了提一下:如果在使用
transact
之后需要访问事务哈希,那么可以调用返回的HexBytes
对象上的.hex()
方法。这将把事务散列作为一个字符串,它通常比HexBytes
更有用。在我希望这有帮助!在
相关问题 更多 >
编程相关推荐