区块链确定性、终止和隔离

Blockchain determinism, termination and isolation

这个矩阵围绕确定性、终止和隔离的参数比较虚拟机(对于以太坊)和 Docker(对于 Hyperledger Fabric)。

这张图片没有很好地捕捉到所有信息。例如,对于 Hyperledger 中的确定性,它提出了合约开发的挑战,而不是 Docker 行为本身。

我很想知道,是什么设计决定导致 Hyperledger Fabric 选择 Docker 作为容器而不是它自己的 VM?

在 Hyperledger Fabric 的早期,有很多关于如何最好地实现智能合约的讨论。各种贡献者一直致力于客户参与/他们自己的项目,并发现了 EVM 中的缺陷(这是有充分理由的,因为尽管 EVM 是图灵完备的,具有操作代码,但它依赖于 gas 和帐户作为构造并且确实很难做到复杂的数据建模等)。

与其尝试创建一种新的合约语言和执行语言,我们决定尝试让人们发挥他们选择的编程语言的全部功能(今天完全支持 Golang,Java 是实验性的,Java脚本将在下一个版本中出现)。

现在为了允许多语言合约而不是创建复杂的嵌入式解释器等,我们选择在进程外编译和 运行 链代码。然后,我们需要找出一种方法来 "isolate"(并在一定程度上管理)这些外部流程,使用 Docker 似乎是一个非常可行的选择。

注意几点: - 链代码进程/容器仅与对等进程通信(即它们启动与对等进程的通信并且不公开自己的端点) - 链码实际上将命令传递给对等方(即,当您执行 Get/Put 状态时,这实际上是通过安全的 gRPC 连接发送给对等方的) - 对等方实际管理/隔离每个链代码调用与其他调用(意味着一个调用不能从另一个调用访问任何状态) - Hyperledger Fabric 本身提供了一种机制,其中链代码必须由对等节点的管理员实际安装(这是 运行 许可区块链的好处)。因此,在实际安装任何链代码之前,节点的管理员/所有者可以检查链代码并确保它没有做任何恶意的事情。

谈到非确定性,我们调查了一些事情。例如,我们研究了将各种语言的某些函数列入白名单。但最后,使用 v1.0 架构确保每个链代码调用的非确定性实际上并不是必需的。 在 v1.0 模型中,每个节点执行链代码,输出实际上是状态 accesses/changes 的 read/write 集。如果成功执行了链代码逻辑,则对等点将对响应进行签名。这称为模拟和背书。背书的数量(即必须成功 运行 链代码的节点)可通过策略配置。一旦为交易收集到足够的背书,它们就会被打包并提交给排序服务,然后排序服务创建有序交易块并将它们交付给同行进行验证和承诺。这个逻辑是 100% 确定性的(检查交易是否格式正确,确保有足够的背书来满足策略,最后进行经典的 MVCC 检查以避免冲突(aka "double-spend")。

希望这对您有所帮助