Tezos — 自我进化的加密账本
据Ambcrypto消息,Tezos Agora近日发布了一个新版本的主网暂存分支。根据该最新公告 ,Tezos对这个新版本进行了一些改进,包括使用新的存储后端,使之更加可靠和高效。Tezos还表示,将在启动节点时提示用户更新其存储版本,并引入了新命令“ reconstruct”,以帮助将完整节点转换为归档节点。此前在8月份,Tezos宣布了Agora平台,以支持Tezos的链上修改过程。
白皮书
L.M Goodman
2014 年 9 月 2 日
“我们的论点并不是简单的循环
逻辑,其背后有着独到之处。”
— Willard van Orman Quine
摘要
本白皮书向您介绍 Tezos, 一个通用的且能够自我进化的加密数字账本。
Tezos 的最大优势是可以吸收任何一种基于区块链的账本好的方面,其将常
规区块链上的各种操作以单纯的功能模块的方式实现。通过网络壳(Shell)
利用这些操作处理网络层任务。比特币,以太坊,Cryptonote 等等都可以
在 Tezos 内通过网络层接口实现,进而被表征。
更重要的是,Tezos 支持元数据升级:即可以通过自我修正代码进化协
议。为此,Tezos 从一个种子协议开始定义一整套流程来让持币的用户来
对代码进行修正,以及修正这套流程所必须的投票体系本身。这和哲学家
Peter Suber 的 Nomic[3] 博弈观点不谋而和,该观点的博弈构建主要围绕
一整套内省规则。
除此之外,Tezos 的种子协议被放在一个纯粹的股权证明系统(POS)上,
支持图灵完备的智能合约。Tezos 通过 OCaml 语言进行实现,该语言是一
套功能强大的函数式编程语言,提供高速,非歧义语义和语法以及整个生态
系统。所有的这一切让 Tezos 成为一个形式化正确性证明的很好的候选者。
以下的白皮书要求读者要对比特币协议的一定程度的了解和并理解基本
的加密学知识。
1
目录
1 简介 4
2 自动进化的加密数字账本 4
2.1 数学表达 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 网络 Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.1 时钟 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.2 链选择算法 . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.3 网络层防御 . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 功能表述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3.1 验证链 . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3.2 协议进化 . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.3 RPC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3 种子协议 9
3.1 经济 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.1 币量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.2 挖矿和签名奖励 . . . . . . . . . . . . . . . . . . . . . . 9
3.1.3 丢失的币 . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.1.4 修改规则 . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 股权证明机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.1 概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.2 时钟 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2.3 随机种子生成 . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.4 Follow-the-coin 过程 . . . . . . . . . . . . . . . . . . . 13
3.2.5 挖矿 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2.6 区块签名 . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2.7 链的权重 . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2.8 公开谴责机制 . . . . . . . . . . . . . . . . . . . . . . . 16
3.3 智能合约 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3.1 合约类型 . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3.2 起源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3.3 交易 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2
3.3.4 存储费用 . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.5 代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.6 交易费 . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4 总结 18
3
1 简介
在白皮书的第一部分,我们将讨论抽象区块链的概念以及自动修正的
加密账本的实现。在第二部分,我们将具体展开描述我们提出的种子协议。
2 自动进化的加密数字账本
一个区块链协议包含三层不同的协议:
- 网络协议,发现并广播交易。
- 交易协议,定义有效交易。
- 共识协议,形成针对唯一链的共识。
Tezos 实现了一个一般性的 Shell。该 Shell 是对交易协议和共识协议是
透明的。我们把交易协议和共识协议统称为区块链协议。我们将首先给区块
链一个数学描述,再描述 Tezos 中区块链的实现选择。
2.1 数学表达
一个区块链的协议本质上是一个全局状态并发突变的单子 (monadic)
的实现,以区块为单位操作全局状态。区块的自由类群 (free monid) 从创始
状态开始形成一个树状结构。一个全局标准状态就是这个树的满足一定顺
序的最小叶。
以下是其抽象的表达:
- 定义 (S, ≤) 为一个完全排序的,可以被计数的,可能状态的子集。
- 定义 ⊘ ∈/ S 为一个特殊的无效的状态
- 定义 B ⊂ S
S∪{⊘} 为区块集合。这个有效的区块集合是 B ∩ S
S
.
在 S 之上的顺序被延续,所以这里 ∀s ∈ S, ⊘ < s。这个顺序决定哪个
叶在区块树上将被认可。B 中的区块可以看做是在这个状态上的操作。
总而言之,任何一个区块链协议1,不论是比特币,莱特币,点点币,以
太坊,还是 Cryptonote,等等,都可以用以下元组来决定:
(
S, ≤, ⊘, B ⊂ S
S∪{⊘})
1GHOST 是一种可以基于树特性对叶子进行排序的方法。然而,这样的方式在理论和实践上都存在问
题。与之相比,在主链添加挖矿证明几乎总是更好的解决方案。
4
这些区块链的网络层协议基本相同。其挖矿算法却发展迅速,激励着区
块的创建。
在 Tezos 中,我们设计能够自省的区块链协议,让区块在协议层上运
作。这样我们就能够递归地表示这组协议:
P =
{(S, ≤, ⊘, B ⊂ S
(S×P)∪{⊘})}
2.2 网络 Shell
仅有一个形式的数学表述并不足以让我们立刻建立一个区块树。我们
还需要一个连接 Gossip 网络和协议的网络 Shell。
这个网络 Shell 通过维护客户端所知的最优链进而运作。它将从三种对
象那里接受信息。前两个分别是交易和区块,确认有效后广播。第三个是协
议,即用来修改现有协议的 OCaml 模块,对此我们稍后再进行详细描述。
现在我们主要关注交易和区块。
网络 Shell 最艰巨的部分是保护节点免于遭受 DOS 攻击。
2.2.1 时钟
每个区块都有时间戳,这个时间戳只对网络外壳可视。如果一个区块是
当前的,并且其时间戳在系统时间的几分钟之内,则该区块会被缓冲,否则
将会被拒绝。这个协议设计必须能够容忍合理的时钟漂移,而且必须假设时
间戳可能会被伪造。
2.2.2 链选择算法
该 Shell 维护一条单一的链,而不是一个完整的区块树。这个链只有在
客户端获悉严格意义上的更优链时才会被覆盖。
从网络通信的角度,维护一个区块树会更加节省资源,但也会让网络更
加容易被 DDOS 攻击,尤其是当一个攻击者产生大量的低得分但有效分叉
的时候。
但仍然存在一种可能,一个节点谎报了链的得分,客户端可能会在处理
大量的区块,发现和揭露该信息谎报,。随后这个欺骗节点将被忽略。
幸运的是,对于协议而言,低得分的链创建区块的等级越低。因此,客
户端可能只需要查看一个弱分叉的几个区块,就可以判断它是不是某链的
得分是不是欺骗。
5
2.2.3 网络层防御
此外,Shell 还具备防御性。它尝试连接不同 IP 端的对等节点,发现掉
线的节点以及禁止恶意节点。
为防御某些 DOS 攻击,协议可提供 Shell 依赖区块大小和交易限制的
环境。
2.3 功能表述
2.3.1 验证链
我们可以通过以下的 OCaml 类型有效捕捉几乎所有的抽象区块链结构
的继承类。从定义区块头开始:
type raw_block_header = {
pred : Block_hash . t ;
header : Bytes . t ;
operations : Operation_hash . t l i s t ;
timestamp : f l o a t ;
}
我们故意没有把区块头域强制类型化,以致于其能够表征任意内容。但
我们有必要明确类型化 Shell 的相关操作。这些包括前区块的哈希,一个操
作哈希的列表以及时间戳。在实践中,包含在一个区块内部的操作和区块一
起在网络层上传播。操作本身可表征为任意的 blobs 结构.
type raw_operation = Bytes . t
Context 模块封装了一个基于磁盘的不可变化的键值对存储,在其帮
助下表征状态。键值对结构十分通用,允许我们有效且广泛表征许多种状
态。
module Context = sig
type t
type key = string l i s t
val get : t -> key -> Bytes . t option Lwt . t
val set : t -> key -> Bytes . t -> t Lwt . t
val del : t -> key -> t Lwt . t
(* . . . *)
end
为避免磁盘操作的阻塞,函数使用异步单子 Lwt[4]。注意,这个操作
在上下文中是纯函数式的:当 set 和 del 都返回一个新 Context 对象时,
6
get 操作使用 option 单子而非抛出异常。Context 对象模块将内存缓存
和磁盘存储结合有效提供不可变化的存储环境。
现在我们能够定义任意区块链协议的模块类型:
type score = Bytes . t l i s t
module type PROTOCOL = sig
type operation
val parse_block_header : raw_block_header -> block_header option
val parse_operation : Bytes . t -> operation option
val apply :
Context . t ->
block_header option ->
( Operation_hash . t * operation ) l i s t ->
Context . t option Lwt . t
val score : Context . t -> score Lwt . t
(* . . . *)
end
不是和数学模型做状态比对,相反,我们利用 score 函数将 Context
对象映射到一个字节列表。字节列表首先按长度排列,其次依照字母顺序。
类似于软件的版本化,这是一个相当通用的结构,在表示不同排序时有着广
泛应用。
为什么不在协议模块中定义比较函数?首先表征一个完全排序函数的
需求很难执行。这经常可以从得分映射上得到验证(在上一个区块哈希的基
础上破坏连接)。其次,原则上我们需要有对比不同协议状态的能力。具体
的协议修改规则可能让这个发生的可能性变得非常低,但是网络 Shell 对此
并不知晓。
在决定中继操作或者添加区块至本地区块树状数据库之前,parse_block_header
和 parse_operation 操作将暴露给网络 Shell,并允许其将完全类型化的
操作和区块送至协议层,还要检测这些操作和区块是否经过严格封装。
协议的核心是 apply 函数:
- 当传一个区块头部以及附属的操作列表时,它会计算上下文中做出的
变化,返回一个修改过的副本。在内部,只有变化才会保存,和版本
系统中一样,类似版本处理一样使用区块的哈希。
- 当只是传操作列表时,它将贪心地试图尽可能生效更多的操作。对于
协议自身而言该函数不是必须的,但对于试图形成有效区块的矿工来
7
说却有极大的用处。
2.3.2 协议进化
Tezos 最强大的特性是它的协议自我修正能力,主要通过暴露给协议两
个过程函数实现:
- set_test_protocol 函数,使用新协议替代测试网络中使用的协议
(通常是持币者投票决定的协议)。
- promote_test_protocol 函数,用当前通过测试的协议替代目前正
在运行的协议。
这些函数通过改变目前相关联的协议来转换 Context 对象。当下一个
区块在链上产生,新的协议开始生效。
module Context = sig
type t
(* . . . *)
val set_test_protocol : t -> Protocol_hash . t Lwt . t
val promote_test_protocol : t -> Protocol_hash . t -> t Lwt . t
end
protocol_hash 函数是.ml 和.mli 文件 sha256 哈希的 tarball 打包。
这些文件在运行中编译,有获取较少的标准函数库权限,但被装在沙箱内,
可能无法调用系统函数。
这些函数通过协议的 apply 函数调用,返回新的 Context 对象。
很多条件可能会触发协议的修改。在最初的简单版本上,持币者可以通
过直接投票进行协议修改, 而之后更复杂的协议可以通过逐步投票而获得接
受。例如,当一个持币者希望一个修改案被通过,他会被要求提供计算机可
以验证的证据来证明他的提案将会尊重协议的某些特性。这是对协议修改
合规性在算法上的有效检测。
2.3.3 RPC
为了简易化图形化工作,这个协议暴露了 JSONRPC 的 API。该 API
自身可以被描述为一个代表各种过程类型的 json 模式。通常涞说,诸如
get_balance 的函数都可以通过 RPC 来实现。
8
type service = {
name : string l i s t ;
input : json_schema option ;
output : json_schema option ;
implementation : Context . t -> json -> json option Lwt . t
}
这个名字是一个字符串列表,其目的是允许过程中出现命名空间。输入
和输出是通过可选择性使用 json 模式刻画。
注意这个指令被用来在一个指定的上下文中,而这个上下文通常是最
高得分叶子节点的最近一个祖先。例如,在最高得分叶子节点之上查询上下
文 6 个区块,将会显示具有六个确认的账本状态。
界面本身可以裁剪至特定的协议版本,或者是由 JSON 数据继承而来。
3 种子协议
Much like blockchains start from a genesis hash, Tezos starts with a seed
protocol. This protocol can be amended to reflect virtually any blockchain
based algorithm. 更像是区块链开始于一个创世哈希,Tezos 开始于一个种
子协议。这个协议可以被修改来反映几乎任何一个基于区块链的算法。
3.1 经济
3.1.1 币量
Tezos 一开始就会有一百亿个币,这些币小数点后保留两位。一个币被
称作 1tez,而最小的单位是分。我们也建议使用 ꜩ (ua729, “Latin small
letter tz”) 拉丁字母来代表一个 tez。这样的话,一分等于 0.01tez,等于百
分之一 tez。
3.1.2 挖矿和签名奖励
原则 我们认为任何一个去中心化的货币要保证安全性都需要给予参与者
金钱上的奖励。正如在我们的定位白皮书中提到的,仅仅依赖于交易费进行
激励会受到公共地悲剧影响。在 Tezos 中,我们提供一个债券和现金奖励的
二元激励体系。
9
债券是矿工所购买的一年期的安全存款。当出现双重签名的情况下,这
些债券将会被收回。
一年以后,矿工除了债券以外还将获得另外的奖励,作为他们机会成本
的补偿。债券和奖励的价值是系统安全的最主要保证,而它们的价值将仅占
全部价值的一小部分。
债券的真正目的是减少奖励的总量,并利用人对损失的普遍抗拒心理
来提高网络的安全。
细则 根据种子协议,每挖一个块将获得 512Tezos 币现金奖励以及需要
1536 币的债券。而每个区块签名将获得 32∆T
−1 个 tez 的奖励。这里 ∆T
代表以分钟为单位的区块和先前区块之间签名的时间间隔。每个区块至多
有 16 个签名,但签名不需要持有债券。
假设出块率为每分钟一个区块,那么有 8% 的最初货币供应量在第一年
www.2492777.com,后应该以安全债券的形式被持有。
我们的奖励的计划被设定为 5.4% 的通货膨胀率。这个名义上的通货膨
胀应该是中性的,它不会让有的人变富,而让其他人变穷。2
.
本文由www.2492777.com发布于集团财经,转载请注明出处:Tezos发布了带有新存储后端的主网暂存分支