2

在以太坊专用网络(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(valid_address, 55)
  3. 合同.getLog()
  4. contract.getBalance(地址)
  5. contract.get42(地址)

我得到输出结果:

  1. [通话结束]:T()
  2. [通话结束]:setBalance()
  3. 55
  4. 42

现在我只需在 TData 结构中添加一个新字段:

版本 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(valid_address, 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 回答
0
  1. 对任何操作进行硬编码 Gas 都是一个坏主意。如果你这样做,你将不断陷入这种错误。您应该在启动该方法之前检查气体
  2. 使用估计 Gas API - https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethestimategas
  3. 当你将你的 DApp 公开时,你必须认识到矿工可以在 geth 控制台中调整 Gas 价格。

miner.setGasPrice(gasPrice);

希望有帮助!

于 2017-05-11T02:43:22.000 回答