2

Ethereum プライベート ネットワーク (geth) では、非常に単純なコントラクト (Solidity) を使用しています。

バージョン 1:

contract T {
   string log;
   function getLastLog() constant returns (string lastLog) { return log; }

   function T() { log = "[call end]: T()\n"; }

   struct TData {
      uint amount;
   }

   mapping (address => uint) balance;
   mapping (address => TData) mystructmap;

   function setBalance(address _user, uint _balance) {
       log = "[call start]: setBalance()\n";

       balance[_user] = _balance;
       mystructmap[_user] = TData({amount: 42});

       log = "[call end]: setBalance()\n";
   }

   function getBalance(address _user) constant returns (uint _balance) {
       return balance[_user];
   }
   function get42(address _user) constant returns (uint _fourtytwo) {
       return mystructmap[_user].amount;
   }
}

コントラクトをデプロイしてから、次のように呼び出します ( web3.jsから):

  1. 契約.getLog()
  2. contract.setBalance(有効なアドレス、55)
  3. 契約.getLog()
  4. contract.getBalance(住所)
  5. contract.get42(アドレス)

そして、私は出力結果として得ます:

  1. [通話終了]: T()
  2. [通話終了]: setBalance()
  3. 55
  4. 42

ここで、TData 構造体に新しいフィールドを 1 つ追加するだけです。

バージョン 2:

contract T {
   string log;
   function getLastLog() constant returns (string lastLog) { return log; }

   function T() { log = "[call end]: T()\n"; }

   struct TData {
      uint somedata;
      uint amount;
   }

   mapping (address => uint) balance;
   mapping (address => TData) mystructmap;

   function setBalance(address _user, uint _balance) {
       log = "[call start]: setBalance()\n";

       balance[_user] = _balance;
       mystructmap[_user] = TData({somedata: 11, amount: 42});

       log = "[call end]: setBalance()\n";
   }

   function getBalance(address _user) external constant returns (uint _balance) {
      return balance[_user];
   }
   function get42(address _user) external constant returns (uint _fourtytwo) {
      return mystructmap[_user].amount;
   }
}

上記と同じ呼び出しを行います。

  1. 契約.getLog()
  2. contract.setBalance(有効なアドレス、55)
  3. 契約.getLog()
  4. contract.getBalance(住所)
  5. contract.get42(アドレス)

しかし、今私は得る:

  1. [通話終了]: T()
  2. [通話終了]: T()
  3. 0
  4. 0

setBalance()」関数が実行されていない (またはどこかで終了している) ようで、ストレージの状態は変更されていません。

助けてください!

ありがとう。

4

2 に答える 2

2

私は以前に同じ問題を抱えていました。私はそれがあなたの要求で送っているガスの量に関係していると確信しています. Web3は推測しますが、これは以前に失敗しました。リクエストに沿って異なる量のガスを手動で送信してみてください。

これが私がやっていることです:

store
.changeProduct(d.id, d.name, d.price, d.description, d.quantity,d.enabled, {from: account, gas:1000000})
于 2016-02-24T15:27:02.270 に答える