以太坊区块链简介

以太坊区块链到底是什么?区块链有 2 个主要组件:

数据库:网络中每笔交易都存储在区块链上。当你部署合约时,就是一笔交易。当你为候选者投票时,又是另一笔交易。所有的这些交易都是公开的,每个人都可以看到并进行验证。这个数据永远也无法篡改。为了确保网络中的所有节点都有着同一份数据拷贝,并且没有向数据库中写入任何的无效数据,以太坊使用一个叫做工作量证明的算法来保证网络安全。(http://ethereum.stackexchange.com/questions/14/what-proof-of-work-function-does-ethereum-use)

代码:就数据库的层面而言,区块链就是存储交易。那么给候选者投票,检索所有投票的逻辑放在哪儿呢?在以太坊的世界里,你可以通过一个叫 Solidity 的语言编写逻辑/应用代码(也就是合约)。然后用 solidity 编译器将代码编译为以太坊字节码,并将字节码部署到区块链上(也有一些其他的语言可以写合约,不过 solidity 是到目前为止用得最多也是相对更容易的选择)。所以,以太坊不仅仅会存储交易,它还会存储和执行合约代码。

基本上,区块链就是存储数据和代码,并在 EVM(Ethereum Virtual Machine,以太坊虚拟机)中执行代码。为了构建基于 web 的 Dapp,以太坊也有一个非常方便的 JavaScript 库,叫做 web3.js,它可以连接到区块链节点。所以,你可以在一些有名的 js 框架,比如 reactjs,angularjs 等等中直接引入该库构建应用。

在异步的网络模型中,所有的节点由于没有时钟仅仅能根据接收到的消息作出判断,这时完全不能同时保证一致性、可用性和分区容错性,每一个系统只能在这三种特性中选择两种。
不过这里讨论的一致性其实都是强一致性,也就是所有节点接收到同样的操作时会按照完全相同的顺序执行,被一个节点提交的更新操作会立刻反映在其他通过异步或部分同步网络连接的节点上,如果想要同时满足一致性和分区容错性,在异步的网络中,我们只能中心化存储所有数据,通过其他节点将请求路由给中心节点达到这两个目的。

最终一致性允许多个节点的状态出现冲突,但是所有能够沟通的节点都能够在有限的时间内解决冲突,从不一致的状态恢复到一致,这里列出的两个条件比较重要,一是节点直接可以正常通信,二是冲突需要在有限的时间内解决,只有在这两个条件成立时才能达到最终一致性。

拜占庭将军问题

FLP 不可能定理是分布式系统领域最重要的定理之一,它给出了一个非常重要的结论:在网络可靠并且存在节点失效的异步模型系统中,不存在一个可以解决一致性问题的确定性算法。

这个定理其实也就是告诉我们不要浪费时间去为异步分布式系统设计在任意场景上都能够实现共识的算法,异步系统完全没有办法保证能在有限时间内达成一致。

在整个共识算法运行的过程中,Proposer 负责提出提案并向 Acceptor 分别发出两次 RPC 请求,Prepare 和 Accept;Acceptor 会根据其持有的信息 minProposal、acceptedProposal 和 acceptedValue 选择接受或者拒绝当前的提案,当某一个提案被过半数的 Acceptor 接受之后,我们就认为当前提案被整个集群接受了。