猿问

Web3js 调用和 truffle 调用的行为不同

我有一份合同,看起来像这样 -


contract Calculator {

    uint public result;


    constructor() public {

       result = 777;   //note the initial value

    }


    function add(uint a, uint b) public returns (uint, address) {

       result = a + b;

       return (result, msg.sender);

    }

}

当我在松露上调用该函数时,我得到了正确的交易 -


truffle(development)> await calculator.add(5,11)

{

  tx: '0xa66e94bb28810bb2a861c97ee149718afa599d47b7b1c6e55743ea657fdeef56',

  receipt: {

    transactionHash: '0xa66e94bb28810bb2a861c97ee149718afa599d47b7b1c6e55743ea657fdeef56',

    transactionIndex: 0,

    blockHash: '0x6ae4e3ce65f1e177c419306a50662ed46f40c729a6a18ede028b07e63dd12f61',

    blockNumber: 6,

    from: '0x5d88950b52f89ad66906fc263e8c35ddacff04d4',

    to: '0x7c8beb382c70cbf12b41fd4e5d74cfee53fdc391',

    gasUsed: 26074,

    cumulativeGasUsed: 26074,

    contractAddress: null,

    logs: [ [Object] ],

    status: true,

    logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000200000000000000000000000000000000000000',

    rawLogs: [ [Object] ]

  },

  logs: [

    {

      logIndex: 0,

      transactionIndex: 0,

      transactionHash: '0xa66e94bb28810bb2a861c97ee149718afa599d47b7b1c6e55743ea657fdeef56',

      blockHash: '0x6ae4e3ce65f1e177c419306a50662ed46f40c729a6a18ede028b07e63dd12f61',

      blockNumber: 6,

      address: '0x7C8beb382C70CbF12b41fd4e5d74CfEe53FDc391',

      type: 'mined',

      id: 'log_28a5e84f',

      event: 'Added',

      args: [Result]

    }

  ]

}



鸿蒙传说
浏览 87回答 1
1回答

月关宝盒

Web3.js 合约对象与 Truffle 合约对象不同。结构上有细微的差异,当然,因为它都是无类型的 JavaScript,所以你不知道函数将有什么输入或输出。从历史上看,以太坊交易没有返回值。Web3.js 行为早于这个时间,并且可能不支持直接返回交易值。getTransactionReceipt()然而,EIP 1288 记录了如何通过对象获取返回值receipt。要让 Web3.js 修改 EVM 状态,您需要执行send()而不是call(). 这是另一个弱类型问题,因为不应混淆视图和编写函数。尝试:    console.log("Calculator adding: ", await calculatorContract.methods.add(11, 88).send({        from: '0x38e3614A5Cf95f0DBb858D9E3752Ac477DA70ccD'    }));解决 Truffle 和 Web3.js 之间的差异。解决行为差异的最简单方法是根本不使用 Truffle 工件,而是到处使用 Web3.js 合约。诗。我推荐 OpenZeppelin SDK(Node.js / TypeScript)而不是 Truffle。它对于 TypeScript 类型来说更加理智,也可以在前端和后端代码中用作 Web3.js 的替代品。或者使用 Python 和 Web3.py 甚至更好,因为如果你有能力切换语言,那么这些为你的问题中的猜测游戏留下了更少的空间。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答