获取挖掘的块而不是假定的返回值

时间:2019-04-25 12:34:08

标签: blockchain ethereum solidity smartcontracts go-ethereum

我刚刚使用以太坊钱包部署了智能合约。 我获得了智能合约地址,我从混音中复制了它的ABI,并在以太坊钱包中对其进行了验证,它处于活动状态,我可以看到其所有方法。

然后我尝试从我的nodejs服务器调用它。我做到了,没有收到任何错误... 但是没有像下面的方法的返回值那样的经典响应,我得到了挖出的块....我觉得这很奇怪... 我应该如何获取方法的输出(返回)?

此后,我尝试部署另一个合同,这次是一个非常简单的合同,具有相同的方法名称,智能合同名称,参数,但方法内部没有代码,只有基本的硬编码返回。当我也部署此合同时我得到了相同的挖矿智能合约地址...我认为这很奇怪...

我一直在使用1.0.0-beta.46,nodejs,expressjs 当我说eth wallet时,我的意思是...该网站由puppeth生成,位于/#wallet页面

这是我第二次尝试部署的基本智能合约,结果与第一个智能合约相同。

编译强度> = 0.4.22 <0.6.0;

合同BasicContract {

function function1(uint16 a,uint16 b,uint16 c,uint16 d) external payable returns(uint256){
    //a,b,c,d doesn't matter
    return 68;
}


//buy a ticket
function function2(uint128 a,uint16 b) external payable returns(uint128){
    //a,b doesn't matter
    return 94;
}

function function3(uint128 a) external payable returns(bool){
    //a doesn't matter
    return false;
}

}

1 个答案:

答案 0 :(得分:0)

有两种方法可以在智能合约中调用功能:通过发送到网络的交易或通过本地call

交易没有返回值。从用于进行交易的库中获得的收益通常是交易哈希。您调用的函数的所有返回值都将被丢弃。

本地call不涉及到网络的事务,因此不能更改任何状态。但这确实为您提供了返回值。

大多数库默认选择哪种方法取决于函数是否处于状态更改状态。如果将函数标记为viewpure,它会告诉库这些函数不会更改状态,然后可以安全地在本地call处获取返回值。因此,上述代码的一个简单“解决方案”就是使这些功能pure。对于更改状态的函数,您将希望从使用return值切换为发出事件,可以在挖掘事务之后读取这些事件。