以太坊python中不直观的solidity契约返回值

2024-09-22 16:36:21 发布

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

我在玩以太坊和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看到。在

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

我想我对gas如何影响函数调用有一些基本的误解。在


Tags: 函数testtruereturnaddress地址functionpublic
1条回答
网友
1楼 · 发布于 2024-09-22 16:36:21
  1. 返回值是区块链上的交易哈希值。当交易时(即,当使用“transact”而不是“call”时),区块链将被修改,而您正在使用的库将返回事务哈希。在这个过程中,你必须支付以太币才能修改区块链。然而,在只读模式下操作根本不需要乙醚,所以不需要指定气体。

  2. 如果不考虑开头的“0x”,以太坊地址的长度为40,但在测试中使用的是39个字符长的地址,因此缺少一个“1”。意思是,测试是正确的,你的输入有错误。

离题的是,return_true和{}都应该标记为view,因为它们实际上并没有修改状态。我敢肯定你在混音中得到了警告。一旦您这样做了,就不需要使用“transact”和paying ether来访问这两个方法,您可以使用“call”免费进行访问。在

编辑

忘了提一下:如果在使用transact之后需要访问事务哈希,那么可以调用返回的HexBytes对象上的.hex()方法。这将把事务散列作为一个字符串,它通常比HexBytes更有用。在

我希望这有帮助!在

相关问题 更多 >