首页 > 解决方案 > 获取挖掘的块而不是假定的返回值

问题描述

我刚刚使用以太坊钱包部署了一个智能合约。我得到了智能合约地址,我从 remix 复制了它的 ABI 并在以太坊钱包上验证了它,它是活跃的,我可以看到它的所有方法。

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

之后我尝试部署另一个合约,这次是一个非常简单的合约,具有相同的方法名称、智能合约名称、参数,但方法中没有代码,只有一个基本的硬编码返回。当我部署这个合约时,我得到了相同开采的智能合约地址……在我看来,这很奇怪……

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

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

pragma 可靠性 >= 0.4.22 < 0.6.0;

合同基本合同{

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;
}

}

标签: blockchainethereumsoliditysmartcontractsgo-ethereum

解决方案


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

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

本地call不涉及到网络的事务,因此不能更改任何状态。但它确实给了你一个返回值。

大多数库默认选择哪种方法取决于函数是否改变状态。如果将函数标记为viewor pure,它会告诉库这些函数不会更改状态,然后可以安全地在call本地编辑以获取返回值。因此,上述代码的一个简单“修复”就是制作这些函数pure。对于确实改变状态的函数,您需要从使用return值切换到发出事件,这可以在交易被挖掘后读取。


推荐阅读