Go-Ethereum

嘗試呼叫結構時出現 BigNumber 錯誤

  • November 7, 2016

考慮以下契約:

contract Test{  
   uint public id;  
   address public addr;  
   bytes32 public name;  

   struct t {
    bytes32 name;
    uint id;
   address addr;  
  }  
  mapping (address => t) addr_map;
   function f1 (uint param_1, bytes32 param_2) returns (bool) {  
      id = param_1;  
      name = param_2;  
   }

  function f2 (uint param_1, bytes32 param_2) returns (bool) {  
     addr_map[msg.sender].name = param_2;  
     addr_map[msg.sender].id = param_1;  
  }  
}

我正在使用 solc 0.4.4 和 web3 呼叫與契約進行互動。無論我嘗試多少呼叫 f1 都會給我一個錯誤(在 web3 片段下方);但是呼叫 f1 沒有這個問題 - 能夠獲得 tx_hash。

testContractInstance.f2(1,"random",{from:accounts[0],gas:1000000}function(err,tx) {
   if (err) {console.log(err);} 
   console.log(tx)});  

任何建議都會很有幫助。以下錯誤:

BigNumber 錯誤:新 BigNumber() 不是數字:新

概括

  • 替換from:accounts[0]from: web3.eth.accounts[0](或),在前面from: eth.accounts[0]添加一個,您的程式碼應該可以工作。,``function

快速程式碼檢查

您的程式碼在 Browser Solidity 中完美執行:

在此處輸入圖像描述


geth部署和執行

環境

Iota:Homebrew bok$ solc --version
Version: 0.4.4+commit.4633f3de.Darwin.appleclang
Iota:Homebrew bok$ geth version
Version: 1.4.18-stable-c72f5459

geth如https://ethereum.stackexchange.com/a/9181/1268中所述在私有鏈上設置。

扁平化你的 Solidity 程式碼

通過將以下程式碼保存到 Test.sol中stripCrLf,我使用如何將 Solidity 源文件載入到 geth中扁平化了您的程式碼:

pragma solidity ^0.4.4;

contract Test {  
   uint public id;  
   address public addr;
   bytes32 public name;

   struct t {
       bytes32 name;
       uint id;
       address addr;
   }  

   mapping (address => t) addr_map;

   function f1 (uint param_1, bytes32 param_2) returns (bool) {
      id = param_1;
      name = param_2;
   }

  function f2 (uint param_1, bytes32 param_2) returns (bool) {
     addr_map[msg.sender].name = param_2;
     addr_map[msg.sender].id = param_1;
  }
}

Iota:BigNumberError bok$ echo "var myTestSource='`stripCrLf Test.sol`'"
var myTestSource='pragma solidity ^0.4.4;contract Test {  uint public id;  address public addr; bytes32 public name; struct t { bytes32 name; uint id; address addr; }   mapping (address => t) addr_map;  function f1 (uint param_1, bytes32 param_2) returns (bool) { id = param_1; name = param_2; } function f2 (uint param_1, bytes32 param_2) returns (bool) { addr_map[msg.sender].name = param_2; addr_map[msg.sender].id = param_1; }}'

執行你的程式碼geth

> var myTestSource='pragma solidity ^0.4.4;contract Test {  uint public id;  address public addr; bytes32 public name; struct t { bytes32 name; uint id; address addr; }   mapping (address => t) addr_map;  function f1 (uint param_1, bytes32 param_2) returns (bool) { id = param_1; name = param_2; } function f2 (uint param_1, bytes32 param_2) returns (bool) { addr_map[msg.sender].name = param_2; addr_map[msg.sender].id = param_1; }}'
undefined
> var myTestCompiled = web3.eth.compile.solidity(myTestSource);
undefined
> personal.unlockAccount(eth.accounts[0], "aaaargh");
true
> var myTestContract = web3.eth.contract(myTestCompiled.Test.info.abiDefinition);
undefined
var myTest = myTestContract.new({from:web3.eth.accounts[0], data: myTestCompiled.Test.code, gas: 1000000}, 
 function(e, contract) {
   if (!e) {
     if (!contract.address) {
       console.log("Contract transaction send: TransactionHash: " + 
         contract.transactionHash + " waiting to be mined...");
     } else {
       console.log("Contract mined! Address: " + contract.address);
       console.log(contract);
     }
   }
 }
)
Contract transaction send: TransactionHash: 0xc1516f0ab41f20ac705df2645b361fc0438f94470942cf6c14381f1d6ffe9148 waiting to be mined...
undefined
> Contract mined! Address: 0x073cc4149857145d1898dd91ef24c3a767929f5f
[object Object]
> myTest.f1(1, "random", {from: eth.accounts[0], gas: 1000000}, function(err, tx) {
   if (err) {
       console.log(err);
   } 
   console.log(tx)
});
> myTest.id()
1
> web3.toAscii(myTest.name().toString());
"random\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
>     myTest.f2(2, "random 2", {from: eth.accounts[0], gas: 1000000}, function(err, tx) {
   if (err) {
       console.log(err);
   } 
   console.log(tx)
});
0xf8814a2e1466b8c55041b6df95a55495616491e035e50dfd3a0039d367678de4
undefined
> myTest.f2(2, "random 2", {from: eth.accounts[0], gas: 1000000}, function(err, tx) {
   if (err) {
       console.log(err);
   } 
   console.log(tx)
});
0xf8814a2e1466b8c55041b6df95a55495616491e035e50dfd3a0039d367678de4
undefined

一切似乎都可以使用正確的函式參數。

尋找您的錯誤資訊

我嘗試在我的函式呼叫中使用accounts[0]而不是eth.accounts[0]並收到以下消息:

myTest.f2(2, "random 2", {from: accounts[0], gas: 1000000}, function(err, tx) {
   if (err) {
       console.log(err);
   } 
   console.log(tx)
});
ReferenceError: 'accounts' is not defined
   at <anonymous>:1:37

與您收到的錯誤消息不同。

我嘗試刪除,函式之前的,但它沒有給出與您相同的錯誤消息:

> myTest.f2(2, "random 2", {from: accounts[0], gas: 1000000} function(err, tx) {
......     if (err) {
.........         console.log(err);
.........     } 
......     console.log(tx)
......     });
(anonymous): Line 1:64 Unexpected token function (and 2 more errors)
> myTest.f2(2, "random 2", {from: eth.accounts[0], gas: 1000000} function(err, tx) {
......     if (err) {
.........     console.log(err);
.........    } 
......     console.log(tx)
...... });
(anonymous): Line 1:68 Unexpected token function (and 2 more errors)

如果您的節點未完全同步,這似乎會發生。也許您嘗試與尚未同步的合約進行通信。所以嘗試與區塊鏈同步並重試。

閱讀:https ://github.com/ethereum/web3.js/issues/434

我已經在 web3js 中嘗試了你的契約和以下片段,它工作正常:

contractInstance.f2(1,"random",{from:web3.eth.accounts[0],gas:1000000},function(err,tx) {
   if (err) {console.log(err);} 
   console.log(tx)}); 

它返回交易雜湊

在此處輸入圖像描述

引用自:https://ethereum.stackexchange.com/questions/9861