其他地方(在非以太网应用程序中)持久化数据的教程,并使用dapps与其进行交互并验证数据完整性

时间:2018-03-26 15:45:04

标签: ethereum solidity truffle

构建区块链应用程序时,为了在网站上显示状态(例如支持postgres数据库),在非以太网应用程序中保存数据的最佳做法是什么。

一些具体问题:

  1. 为什么批量访问列表/数组/等被描述为在Solidity中痛苦? relevant
  2. 捕获区块链事件和更新离线数据库的最佳方法是什么。
  3. 验证离线数据库完整性的最佳方法(频率等)
  4. 您是否可以避免使用支持数据库并直接查询区块链?
  5. 在松露宠物店教程中,他们有一个返回整个链条的视图 getAdopters() public view returns (address[16]) http://truffleframework.com/tutorials/pet-shop

1 个答案:

答案 0 :(得分:1)

  

为什么批量访问列表/数组/等被描述为在Solidity中痛苦?

有几个原因:

  1. 在Solidity中没有用于迭代集合的内置机制。你可以使用它的长度对数组进行循环标准,但是你不能用映射来做这个。
  2. 返回复杂的对象很麻烦。如果列表包含结构,则不能简单地将结构本身返回给客户端。你必须返回分解的项目。将结构转换为分解的数组很难看:

    struct MyStruct {
      uint256 id;
      bytes32 name;
    }
    
    MyStruct[] _structs;
    
    function getAllStructs() public constant returns (uint256[], bytes32[]) {
        uint256[] memory ids = new uint256[](_structs.length);
        bytes32[] memory names = new bytes32[](_structs.length);
    
        for (uint i = 0; i < _structs.length; i++) {
            ids[i] = _structs[i].id;
            names[i] = _structs[i].name;
        }
    
        return (ids, names);
    }
    
  3. 迭代数组仍需要气体。即使您不支付气体费用(在constant功能中执行此操作时),当您的阵列变得非常大时,您仍然可以没有气体异常。 Truffle宠物店的例子可以解决这个问题,因为它明确地将数组限制为16个元素。

  4.   

    捕获区块链事件和更新离线数据库的最佳方法是什么。

    &#34;最佳&#34;方式取决于您的业务目标和对陈旧数据的容忍度。但是,最常见的方法可能是设置watch on contract events。当您收到活动时,您将使用自己填充的自定义数据更新数据库。但是,您还必须确保处理孤立的块(元数据中有一个名为removed的字段,它告诉您由于块是孤立的,事件是否不再有效)。收到孤立事件时,请将其从数据库中删除。在进行了12次后续块验证后,您可以放心地认为该事件不会成为孤儿。

      

    验证离线数据库完整性的最佳方法是什么(等等)

    同样,这取决于您的业务要求的容差级别。如果您可以延迟使用来自数据库的信息,直到您确定块验证为止,那么您只需保留阻止或时间戳信息,以便让您的应用知道数据库中的数据反映了区块链中验证的内容。如果您担心负责观看事件的客户端进程失败,则需要具有故障转移监视客户端,或允许重复持久性(随后进行重复数据删除),或跟踪已验证的块编号(或者某些组合) 3)。我确信你还可以为此设计很多其他选项。

      

    您是否可以避免使用支持数据库并直接查询区块链?

    是的,有可能,假设您可以通过constant函数避免上述气体限制问题,并且您不必在合同中对您的应用程序进行任何复杂的数据后处理。由于constant函数在本地EVM中运行,因此您只需确保您的专用节点已启动并正在运行。为此,您很可能希望多个服务器作为完全同步的节点运行。