【问题标题】:solidity mapping does not persist坚固性映射不会持续存在
【发布时间】:2020-12-09 22:40:52
【问题描述】:

我有这个可靠代码

pragma solidity ^0.6.12

contract Starting { 

    struct itemStatus {
        bool created;
    }
    mapping (bytes => itemStatus) public item;
    
    bool[] public boolArray;    

    function start(bytes memory itemId) public returns (bool[] memory) {
        boolArray.push(item[itemId].created);
        if (item[itemId].created) {
            boolArray.push(item[itemId].created);
            return boolArray;
        } else {
            item[itemId] = itemStatus(true);
            boolArray.push(item[itemId].created);
            return boolArray;
        }
    }
}

前端javascript代码是

  toStart: function () {
    let Instance;
    App.contracts.Starting.deployed().then(function (instance) {
      Instance = instance;
      return Instance.start.call(itemId);
    }).then(function (result) {
      console.log(result);
    }).catch(function (err) {
      console.log(err.message);
    });
  },

我第一次调用 'toStart' 时,我希望 [false, true] 和第二次调用相同的 itemId [false, true, true, true] 和第三次 [false, true, true, true] ,真实,真实]。但是,无论我调用多少次“toStart”,结果始终为 [false, true]。似乎这些值不会持续存在或被存储。为什么会这样?如何更改代码以获得预期的结果?非常感谢。

【问题讨论】:

    标签: solidity


    【解决方案1】:

    cal() 函数只进行调用而不是交易(这会改变合约状态)。

    解决方法:直接调用start()函数生成以太坊交易

    return Instance.start(itemId); // correct
    

    而不是

    return Instance.start.call(itemId); // incorrect
    

    有关更多信息,请参阅有关 making a callmaking a transaction 的 Truffle 文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2012-11-14
      • 2011-02-25
      相关资源
      最近更新 更多