首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Go 编写智能合约(7)

使用 Go 编写智能合约(7)

常见问题和最佳实践在与客户一起开发区块链应用程序时,我常常被问及以下问题。
如何将文件(图像、音频、视频、PDF 等)存储在区块链中?以下两种方法在最新的 Hyperledger Fabric (v0.6) 中都有效:
  • 将所有文件/对象存储为 base64 编码字符串。客户端应用程序将文件/对象转换为 base64                    编码字符串,并将它作为输入参数发送给链代码函数。然后链代码将它作为字节数组存储在键/值存储中。
  • 实际的文件/对象内容存储在区块链以外的地方;例如,存储在  中。仅将文件/对象的链接/引用/ID                    连同文件/对象的哈希值一起存储在区块链上。存储哈希值可确保在区块链外对文件/对象的任何篡改都能被相关方/实体检测出来。
如何避免将私有业务逻辑/合同细节泄漏给网络中的所有对等节点?此问题是在一个供应链场景中提出的,区块链解决方案的一个最终用户不满意在对所有对等节点可见的智能合约中共享私有业务逻辑/合同信息(比如与不同供应商谈判的不同价格)。在                v0.6 中,可以使用外部系统集成来处理这种情况。
解决方案:对等节点希望保持为私有的业务逻辑/规则/合同,可以作为一组业务规则在外部应用程序(比如服务)中运行。链代码本身能够执行出站调用。所以举例而言,链代码可对业务规则/逻辑服务执行                REST API 调用并获取结果,以便隐藏逻辑,让实际链代码看不见它。
可以从链代码内与区块链外的系统集成。例如,可以使用链代码与外部数据库、API 等通信。但重要的是确保与这些系统的交互不会让链代码变得不确定。
局限性和问题
  • 修改业务规则服务时无需了解其他对等节点,因为它在区块链外运行。根据区块链网络中不同参与方之间的业务交互类型,这可能导致信任问题。
  • 业务规则服务必须可供区块链网络中运行智能合约/链代码的所有对等节点使用。
  • 该解决方案可能导致链代码变得不确定。链代码必须是确定性的。简言之,如果多方使用相同的参数调用链代码中的同一个函数,那么结果应该是相同的。例如,如果在与响应关联的链代码函数中使用一个时间戳或计数器,那么多方对链代码的调用会导致不同的结果。这将在区块链网络中的不同对等节点之间产生不一致的账本状态。                        请记住,每次调用链代码都会导致一致性网络中所有对等节点在自己的本地账本副本上调用链代码。
备注:在目前正在开发的 Hyperledger Fabric v1.0                中,此问题已通过更改架构本身得到系统解决。
返回列表