构建区块链应用程序时,为了在网站上显示状态(例如支持postgres数据库),在非以太网应用程序中保存数据的最佳做法是什么。
一些具体问题:
在松露宠物店教程中,他们有一个返回整个链条的视图
getAdopters() public view returns (address[16])
http://truffleframework.com/tutorials/pet-shop
答案 0 :(得分:1)
为什么批量访问列表/数组/等被描述为在Solidity中痛苦?
有几个原因:
返回复杂的对象很麻烦。如果列表包含结构,则不能简单地将结构本身返回给客户端。你必须返回分解的项目。将结构转换为分解的数组很难看:
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);
}
迭代数组仍需要气体。即使您不支付气体费用(在constant
功能中执行此操作时),当您的阵列变得非常大时,您仍然可以没有气体异常。 Truffle宠物店的例子可以解决这个问题,因为它明确地将数组限制为16个元素。
捕获区块链事件和更新离线数据库的最佳方法是什么。
&#34;最佳&#34;方式取决于您的业务目标和对陈旧数据的容忍度。但是,最常见的方法可能是设置watch on contract events。当您收到活动时,您将使用自己填充的自定义数据更新数据库。但是,您还必须确保处理孤立的块(元数据中有一个名为removed
的字段,它告诉您由于块是孤立的,事件是否不再有效)。收到孤立事件时,请将其从数据库中删除。在进行了12次后续块验证后,您可以放心地认为该事件不会成为孤儿。
验证离线数据库完整性的最佳方法是什么(等等)
同样,这取决于您的业务要求的容差级别。如果您可以延迟使用来自数据库的信息,直到您确定块验证为止,那么您只需保留阻止或时间戳信息,以便让您的应用知道数据库中的数据反映了区块链中验证的内容。如果您担心负责观看事件的客户端进程失败,则需要具有故障转移监视客户端,或允许重复持久性(随后进行重复数据删除),或跟踪已验证的块编号(或者某些组合) 3)。我确信你还可以为此设计很多其他选项。
您是否可以避免使用支持数据库并直接查询区块链?
是的,有可能,假设您可以通过constant
函数避免上述气体限制问题,并且您不必在合同中对您的应用程序进行任何复杂的数据后处理。由于constant
函数在本地EVM中运行,因此您只需确保您的专用节点已启动并正在运行。为此,您很可能希望多个服务器作为完全同步的节点运行。