【问题标题】:Storing data into the blockchain将数据存储到区块链中
【发布时间】:2018-08-17 04:39:25
【问题描述】:

编写将数据存储到“区块链”中的 DApp。我正在尝试以稳固的方式编写此代码,但我不明白如何将其存储到“区块链”中。我可以这样做吗?这样存储数据安全吗?

pragma solidity 0.4.24;

contract database{
struct Data{
    uint index;
    uint value;
}

Data[] public Datas;

  function AddData(uint _index, uint _data) public {
      Datas.push(Data(_index, _data));
  }
}

【问题讨论】:

  • 是的,您的代码看起来不错。
  • 为了更安全,我可以在每个数据块上添加哈希?导致我试图建立一个数据库来存储数据。我可以更改数组中的特定数据吗?
  • “让它更安全”是什么意思?当然,如果你写了一个函数,你可以改变数据。
  • 不希望它被篡改,所以我认为如果我添加一个哈希和块的前一个哈希会更好。
  • 使用区块链的重点是没有人可以篡改存储在其中的数据。 (你可能想修改你的智能合约,只允许某些账户存储数据,但是一旦部署了合约,就没有人可以更改它的代码,只有它可以控制它存储的数据。)

标签: blockchain solidity smartcontracts


【解决方案1】:

是的!您可以像这样简单地将数据存储到区块链中。

假设您将此合约部署到网络,合约地址为0x1234abc...
现在你再次部署它,这次合约部署在0x987cba...
0x1234abc...0x987cba... 上调用 AddData() 将不一样。
您只是向该合同的that specific instance 添加更多数据。

我不能说以这种方式存储一些数据是否安全,它可以像你想要的那样安全。意思是,这取决于您的具体需求和实施。

目前您的合同看起来永远不会被篡改。
因为您只是附加数据, 不会修改合同中的任何内容。

如果你想修改你的数据,你可以给你的AddData() 函数添加一些修饰符,比如Ownable by OpenZeppelin。所以唯一的所有者可以修改这个合约中的数据。

【讨论】:

    【解决方案2】:

    最好为您的情况使用mapping,因为这使您可以定义自定义index,它不仅可以是0, 1, 2, ..., n,还可以是字符串或任何您想要的。这是一个例子:

    pragma solidity 0.4.24;
    
    contract database{
    
        struct Table{
            uint value1;
            uint value2;
        }
    
        mapping(bytes32 => Table) public tables; 
    
        function addData(bytes32 _index, uint _value1, uint _value2) public {
            tables[_index].value1 = _value1;
            tables[_index].value2 = _value2;
        }
    }  
    

    您还可以使用此表达式通过addData 函数存储数据:

    tables[_index] = Table(_value1, _value2);
    

    它看起来更好,但使智能合约的大小更大!

    【讨论】:

    • 在您的示例中,您是否使用 bytes32 数据类型来索引您的映射,因此映射(bytes32 => Table)公共表?
    • 是的。想象一下,您有必须使用的订单名称。您只需:tables['orderName12345'] 它会显示您的订单。当然,您将字符串作为 bytes32 传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2019-04-22
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多