【问题标题】:Data missmatch between web3.js 1.0 and Solidityweb3.js 1.0 和 Solidity 之间的数据不匹配
【发布时间】:2018-05-27 02:06:28
【问题描述】:

我对 Ethereum/Solidity/Web3.js 很陌生。我正在尝试使用 web3.js web.eth.sendsendTransaction() 方法来在私有链上的已部署合约中运行函数。

我尝试执行的功能是:

contract Matematicas{
    uint256 ultimaSuma;
    uint256 ultimaMultiplicacion;
    uint256 contador;
    uint256 factorA;
    uint256 factorB;
    uint256 sumandoA;
    uint256 sumandoB;
    bytes datosMensaje;...

    function multiplica(uint256 a, uint256 b) public{
        datosMensaje=msg.data;
        factorA=a;
        factorB=b;
        ultimaMultiplicacion=(a*b);
    }
... 
}

我从运行以下 JavaScript 代码的 Mist 浏览器中调用 multiplica:

var contracAddress="0xXXXXXXXX";
var contractABI=[{"constant":false,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"multiplica","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},...];
var functionABI=$.grep(contractABITercero,function(metodo,index){ return metodo.name=='multiplica';});
functionABI=abiDelaFuncion[0];
var abiByteCode= web3.eth.abi.encodeFunctionCall(functionABI,[document.getElementById('firstNumber').value,document.getElementById('secondNumber').value]);
var transactionObject={from:"0xxxxxxxxxx",to:contractAddress,data:abiByteCode, gas:10000000};
web3.eth.sendTransaction(transactionObject, function(error,hash){......});

如果我设置 firstNumber=1000 和 secondNumber=2000 那么 abiByteCodes 恰好是:

0x38e836df0000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000000000p

0x38e836df是函数签名的sha,正确;

03e8 是 1000(firstNumber) 的十六进制数

07d0 是 2000(secondNumber) 的十六进制数

但是存储在区块链中的数据是:

datosMensaje:0x38e836df0000000000000000000000000000000000000000000000000000000000的 9e0 强> 3e80000000000000000000000000000000000000000000000000000000000的 9e0 强> 7D0 P>

因素A: 8520680 (0x8203E8)

因素B: 8521680 (0x8207D0)

我做错了什么?

我在 Windows 10 64 位桌面上使用 geth 1.7.3 和 Mist 0.9.2。

谢谢

附:我知道还有其他方法可以调用合约函数,例如通过 new web3.eth.Contract(contractABI,contractAddress) 实例化合约,但我正在考虑一个需要使用 sendTransaction() 方法的项目

【问题讨论】:

  • 假设您复制并粘贴了代码,您在第一行拼错了“contractAddress”:var contracAddress="0xXXXXXXXX"; 您的transactionObject 有一个空的to 字段。
  • 感谢亚当。在实际代码中,指定了真实地址,我只是在这里写了 0xXxxx... 以避免复制孔号
  • 我指的不是价值。我指的是变量名。您在“contractAddress”中缺少一个 t。在 transactionObject 中设置时,它拼写正确(因此是一个不同的变量)。

标签: ethereum solidity web3


【解决方案1】:

经过无数小时后,我意识到这是由于 remix IDE 在调试选项卡中显示值的方式出现错误。如果我使用 web3.js 1.0 版方法 getStorageAt(address,key) 从区块链中恢复数据,我会得到预期值。

谢谢亚当

【讨论】:

    猜你喜欢
    • 2021-11-10
    • 1970-01-01
    • 2019-08-15
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2014-08-30
    • 1970-01-01
    相关资源
    最近更新 更多