Chain区块链协议白皮书

1.  引言

       在本文中,我们提出了Chain协议:一个共享(shared)、多资(multi-asset)产、加密的分类账本。它支持在不同运营商之间,多个独立网络的共存和互操作性,共享通用格式和功能。使用最小权限的原则,使得对资产(asset)的控制与分类账本(ledger)同步的控制相分离。

       Chain协议允许任何参与者通过编写自定义发行程序(issuance programs)来定义和发行资产。当资产发行后,资产的单位由控制程序(control programs)控制。这些程序(发行程序、控制程序)由一个灵活、图灵完备的语言来编写,这个语言可以用于构建复杂的只能合约。

       每个网络由区块签名者(block signers)联合保护。只要有合理数量的区块签名者遵循协议,这个系统就是安全的。为了提升效率,区块的创建委托给了一个区块生成器(block generator)。网络上的任何节点都可以验证区块并向网络提交交易。

       Chain Core是一个实现了Chain协议的企业级软件产品。我们免费提供了一个免费的开发人员版本,并且我们创建了一个基于Chain Core的自由访问的测试网络。

       在第二部分,我们解释了协议设计的背景和动机。

       接下来,我们描述了关键概念 ―― 资产(assets)、交易(transactions)、区块(blocks)、程序(programs)和共识协议(consensus protocol),并讨论了如何执行程序化规则和防止“双花”问题。

       最后,我们讨论了区块链网络的各个方面:安全性(security),规模可扩展性(scalability),架构可扩展性(extensibility)和与其他网络的互操作性(interoperability with other networks)。

2.  动机

       在现代的金融系统中,资产(如货币,证券和衍生)通常以数字化的方式持有和交易。这种神奇的抽象隐藏了系统真正的复杂性:一个相互债务责任、间接拥有、定期结算的分散的网络。转移资产通常需要多个中介之间的点对点交互,以及重复对分类账本的对账。

       这个系统有很多缺点:

l  时间(Time):资产转移或付款的结算通常需要几天。

l  费用(Cost):资产转移涉及向多个中介机构支付费用,并且对账具有昂贵的开销。

l  透明度(Transparency):要查询转移中的状态或者当前资产的所属人是比较困难的。

l  原子性(Atomicity):转移可能没有完成,并且难以使一个资产转移取决于另一个资产转移。

l  安全性(Security):现在系统的复杂性使得难以防止欺诈或盗窃。

l  最终性(Finality):交易是否可逆取决于转移机制,而不是双方的业务要求。

       如果资产所有权记录在单个共享分类账本上,可以解决这些问题中的许多问题。但是,实际和技术限制的结合使这种分类账难以采用。这样的共享分类账本往往需要一个被信任的第三方。这个第三方需要具有实时处理每个交易的技术能力。此外,为了支持可逆的、原子性或复杂的交易,分类账本需要支持比简单所有权更改更复杂的逻辑。

       2009年,中本聪介绍了比特币,比特币的第一个实现使得在没有可信第三方的情况下能够发行数字化的不记名票据,这个分类账本复制系统后来被人们所熟知为区块链。比特币解决了实施分散的(decentralized)数字现金的困难问题,但其安全模型限制了其效率和吞吐量,其设计仅支持单个本机资产,并且其虚拟机对确定资产移动的自定义程序(有时成为只能合约)仅提供有限支持。

       以太坊(Ethereum),于2015年推出,将区块链的概念概括为完全可编程的状态复制机制。虽然它包含了更强大的编程语言,但它对可扩展新性和效率提出了额外的挑战。它的通用计算模型使得工程师难以理解其应用的安全性。

       与比特币和以太坊相反,他们设计在公共互联网(高度敌对的环境),大多数金融活动发生在有限制的金融机构网络中。在这个网络中运行共享的分类账本可以展示区块链的技术优势,而不牺牲金融机构所需的效率、安全性、隐私、灵活性。

3.  数据模型

       Chain区块链网络的目的是管理发行、所有权和控制数字资产。通过将交易发行到网络来发行、转移、交换资产。这些交易被排序,并打包到区块中,他们一起形成了一个不可变的区块链。

资产

       一个Chain区块链可以支持多种类型的资产。

       每种类型的资产都有资产标识,或叫资产ID。资产ID是一个256位长度的字符串,被设计为全局唯一,不是在一个区块链唯一,而是在所有区块链中唯一。

       每个资产ID对应一个发行程序,这个程序定义了该资产的发行单位的规则。一旦发布,用于支持的规则由控制程序确定。

交易

       交易把值从输入移动到输出。每个输入用于指定值的来源 ―― 发型的新单位或者来自之前交易的输出。每个输出指定目的地 ―— 即一个控制程序,定义了未来支出产出的规则。

       每个输入和输出指定单个资产ID的数量。一个交易可以混合不同资产ID的输入和输出,或者将输入合并或分割成具有不同数量的输出,只要输入的总值和输出的总值平衡。

       每个输入必须满足发行程序(如果值来源是新发行的单位)或控制程序(如果值来源是以前未花费的输出)。发行者或支出者可以通过见证字段[p1] 将参数传递给程序。例如,发行或控制程序可以通过定义公钥并且通过相应的私钥要求对交易的密码签名来实现授权检查。

       每个交易,以及每个单独的输入和输出,包含一个用于任意应用级用途的参考数据字段。Chain协议指定如何将引用数据提交给区块链,但不强制内容的任何结构或语义。

区块

       一旦交易花费了特定的输出,别的交易就不允许花费这个同样的输出。为了防止“双花”支出,网络维护一个唯一、所有交易排序不可变的由未交易输出(UTXO)组成的区块链状态。交易输入仅允许引用来自UTXO集合里未花费的输出。一旦交易被应用,就会从集合中删除用过的输出,并将新的输出添加到即合理。

       一个区块是批处理要执行多个交易的数据结构。每个区块头包含上一个区块的哈希[p2] 值,将该系列区块转为不可变的区块链。

       一区区块包含区块中所有交易的哈希值和状态的哈希值,比如,当前未花费交易输出的集合。这个区块链状态的“快照”使得网络参与者容易加入正在进行的网络,而不必“重放”区块链的整个历史。哈希是两个Merkle树的根,使得能够紧凑的证明任何给定交易或未花费的输出的存在,并允许其元素的并发下载和验证。

       为了防止未授权的参与者创建区块,每个区块必须满足在前一个区块头中指定的共识程序。共识程序很想发行或控制程序,从新区快的见证字段接受参数。

       比如,共识程序可以指定公共秘钥,并且要求下一个区块的见证字段包含相应私钥的签名,使用区块的哈希作为消息。这是Chain联合共识协议中共识程序的基础。然后,编程语言的灵活性和强大意味着协议可以理论上支持任意共识算法,甚至是基于“工作量证明(PoW)”或者“权益证明(PoS)”的复杂算法。

4.  程序(Programs)

       Chain协议区块链设计为灵活和可编程,支持每个接别的定制逻辑。

l  发行程序指定了资产发行新单位的规则。

l  控制程序指定了当前存在资产单位的花费规则。

l  共识程序指定了接收新区块的规则。

       程序会验证他们使用的数据结构。它们确定性的运行,使用封顶的内存和时间要求,并可以并行的评估。

       程序有足够的灵活性,允许实现广泛的金融工具(例如期权、债券、掉期),安全方案(存储资产)和应用程序(如报价,托管和拍卖)。

虚拟机

       程序的字节码由Chain虚拟机(CVM)的指令编写。CVM是一个堆栈机器:每个指令对数据栈执行操作。

       当验证程序时,CVM使用从见证字段中传递的程序参数初始化数据栈。然后程序执行,并最终执行成功或失败。

       CVM的指令集是图灵完备的。为了防止无限制的使用计算资源,协议允许网络设置程序的运行限制,每个指令根据其运行成本,运行时会消耗一些限制。

       CVM提供了一系列数据处理指令,从算数操作到高级加密函数,如SHA3,CHECKSIG和CHECKMULTISIG。它还支持交易自检指令和灵活的控制流操作。

自检

       交易自检指令允许发行程序或控制程序不仅定义谁可以花费它,而且定义何时以及如何花费。通过允许程序访问和评估交易的字段来做到这一点。

       TXSIGHASH指令可以获取当前交易的哈希值,允许程序检查花费者提供了合法的签名。

       MINTIME和MAXTIME[p3] 指令用于获取交易的最小时间(mintime)和最大时间(maxtime)字段,允许程序在给定截止日期之后或在给定释放时间之前防止支出或发行。

       CHECKOUTPUT指令允许程序验证特定数量的资产是否发送到具有特定控制程序的输出。这允许访问有关花费的输入(ACMOUT,ASSET,PROGRAM和INDEX)信息,自检指令允许开发实现任意状态机来管理资产。

       协议还指定几个区块自检指令(BLOCKSIGHASH,NEXTPROGRAM)。这些指令只能用于共识程序中(因为交易必须能够独立于块头进行验证)。

控制流

       程序可以使用JUMP和JUMPIF指令实现条件分支合循环,这允许分支到程序中的静态定义的地址。运行限制的存在确保了无限循环是不可能的。

       程序可以使用CHECKPREDICATE指令来验证其他程序,该指令将任意字节字符串作为具有给定参数的程序进行计算。

       该指令允许签名的泛华,其中,签名者不是签署特定消息(例如交易哈希),而是以其字符串形式对断言进行签名。签名和断言的组合是“签名程序”,对于断言求职为true的任何消息,都被视为有效签名。当与自检指令结合使用时,签名程序在花费交易上有更大的灵活性,而不是通过签名哈希还授权特定交易,花费者可以签署交易必须满足的一组条件(包括特定的哈希)。这允许在交易完成或平衡之前对交易进行部分签名。

       CHECKPREDICATE开启了许多强大的功能,包括承诺每个分支哈希的“Merkleized程序”(参见Jeremy Rubin等人的MAST),但不要求显示分支内容,除非它需要被执行。

 

5.  共识

       如上所述,共识程序能让区块链实现任意共识协议。Chain协议第一个版本的默认共识协议基于区块签名者联盟批准(approval from federation of block signers[p4] )。

       共识程序指定一组N个公钥,并使用CHECKMULTISIG和BLOCKSIGHASH指令来确定区块哈希上区块见证人包含M个有效签名(M和N是算法的参数)。

       每个公钥对应一个区块签名者。区块签名者不应该签名两个具有相同高度的区块。只要不超过 2M – N – 1 个区块签名者不违反这个规则,区块链就不会分叉。

       由于这个规则,区块签名者必须协调以确保他们对统一区块签名。为了确保这一点,他们一来区块生成器。区块生成器收集交易,周期性的将有效数据一起打包到区块。

       生成器将每个建议的新区块发送给区块签名者。区块签名者只签名已经被区块生成器签名过的区块。

       然而区块生成器不能使区块链分叉,它确实有一个特权角色。区块生成器具有对网络活性(network liveness)的控制:如果区块生成器崩溃或者因为其他方式停止生成新区块,区块链将会停止。区块生成器还可以通过向不同的区块签名者发送不一致的区块来使网络死锁。另外,区块生成器具有对时间戳的控制,并且可以产生具有人为“慢”时间戳的块。

       对于大多数的权限网络,基于当前业务用例,这些权衡对于协议来说是可以接受的。让一个公司或者市场效应来负责持续运行的网络是说的通的。区块生成器的高可用性是可以通过复制来解决的工程问题,而不需要拜占庭容错分布。如果区块生成器表现出恶意,或被故意关闭,网络停止的话可能更好(对这些用例来说)。这些不当行为可以在带外(out-of-band)被检测和处理。

       因此,这个共识协议并不试图解决拜占庭协议的一般问题。它需要相对于拜占庭容错算法异常强的信任假设,但相对于集中化的数据库弱的多。在实践中,它们对于许多现实世界的部署是合理的。Chain协议以后的版本将会让共识协议具有更广泛的适用性以及较弱的信任假设。

6.  安全性

       Chain协议旨在针对特定用例的现实威胁模型下是安全的。

直接资产所有权(Direct asset ownership)

       资产通常有秘钥控制。Chain协议支持N的M个(M-of-N)多重签名控制程序和发行程序,来帮助减少基于M-1个秘钥损坏的盗窃风险。协议使用高度安全的Ed25519秘钥,越来越多的被采用为行业标准。私钥可以生成并存储在硬件安全模块(HSM)中。使得损坏秘钥更加困难。HSM的集成是Chain核心企业版的一个功能。

隐私(Privacy)

       传统分类账通过限制对各方的信息访问和一个受信任的第三方机构来实现隐私级别。相比之下,区块链系统通过通知所有交易给网络参与者避免了这些条件。隐私仍然可以保留,然而通过破坏另一个地方的信息流来保持隐私:保持公钥的匿名性。网络可以看到发生的交易,但是交易不相关的人缺少将连接交易到指定身份的信息。

       Chain协议的实现,Chain核心(Chain Core),为每个控制程序使用唯一公钥,以防止观察者将多个输出连接到一个账户。单个秘钥源自单个主秘钥,以使秘钥管理更安全。Chain核心实现了秘钥求导方案,允许从公共主秘钥独立的求出公钥和私钥,因此允许创建唯一公钥而无需访问私钥。

       促进多方合同的合约可能取决于敏感数据,如期限、价格、利率。这些可以通过只包含每个分支哈希值的Merkleized程序(请参阅MAST)来隐藏,只有在执行分支需要时,才会在执行期间显示。这种智能合约可以允许以两种方式之一支出:通过提供所有人对新交易的签名(允许各方同意如何解决合同,同时保护隐私),或通过透露和执行私人智能合约代码。这类似于合同在现实世界中的工作方式 —— 然而在法院执行合同通常要求公开合同的条款,大多数合同都是私下结算的,公共系统只是作为隐含的支持。

       Chain协议还可以扩展额外的保密功能,这部分在区块链扩展和Chain协议路线图中描述。

共识安全(consensus security)

       分叉的安全问题,如历史记录安全,编辑或者双花问题,由共识协议强制执行。

       共识协议保证安全,如只要至少2M-N-1个区块签名者遵守协议,区块链不能够分叉显示两个不同版本的历史记录。只要区块生成器和最少M个区块签名者遵从协议,协议就能保证活跃。

       如果签名者尝试使区块链分叉,这种行为可以被观察者检测和证明。最后,监控区块头的任何参与方都可以发生时检测历史记录的编辑。

       可以针对每个区块链网络不通的配置参与者和区块签名者数量,已在网络活性、效率和安全性之间提供不通的权衡。在网络内,随着网络的需求发展,这些参数可以随着时间(随着法定数量的区块签名者的批准)而改变。

本地策略(Local policy)

       区块生成器可以实现过滤掉不符合交易的本地策略。这允许实施超出协议范围的业务或监管要求(例如KYC/AML规则)。本地策略可以随时间自由修改,因为他们不被其余网络节点强制和验证。

严谨证明(Compact proofs)

       区块头包含了区块中Merkle的根以及当前UTXO状态,这允许使用给定区块链部分进行Merkle严谨证明。例如交易是否已经被接受,或者一个特定的UTXO是否保持未被使用。Merkle将一段数据连接到区块头,参与者可以从中检查时间戳和区块签名者的签名。

       因此,实体可以参与网络,而不会看到与他们所没有涉及的交易。他们只需要验证区块头,以及相关交易 和/或者 UTXO的严谨证明。

       严谨证明还可以保护网络参与者不受行为不当的区块签名者的影响。如果一个区块签名者在同一个高度签名了多个不同的区块,参与者可以使用不一致的签名来构造欺诈证据以警告其他节点或提供用于带外执行的证据。

7.  可扩展性(Scalability)

       Chain协议做出多个设计决策以支持可扩展交易处理。

       首先,UTXO模型使得可以并行的验证交易(可能在单独的服务器上)。这使得交易更简单,与“可编程状态机(programable state-machine)”模型相比,例如以太坊的,他要求每个交易按顺序执行。程序不计算或者修改状态,而是由交易完全指定状态转换,并且每个程序验证指定状态转换是否有效。因此,程序可以独立的验证每个输入的程序。类似的,区块中的交易也可以进行并行的验证(除非必须在UTXO用完之前创建UTXO,并且每个UTXO只能用一次)。

       其次,Chain协议不要求参与者跟踪整个区块链状态。参与者只需要记住未用输出的哈希值,因为交易包含了可以针对哈希进行验证的详情,如资产ID,数量和控制程序。这将交换内存带块,使参与者更容易避免昂贵的磁盘访问。

       最后,只要用户信任一个法定数量的区块签名者,严谨证明允许用户仅验证他们所关注的部分,而不用处理和验证所有交易。这种证明的一个例子就是证明给定交易或为花费输出是否被包含在特定区块中的Merkle路径。为了额外的安全性,客户端可以将监控整个区块链的任务委托给他们信任的服务器。

8.  可扩展性(Extensibility)

       Chain协议是可扩展的,允许修复错误和添加新的安全功能,同时保持所有网络节点与区块兼容。可以通过使用“软分叉(soft fork)”方法应用更改,这个方法保留区块向后和向前的兼容性,允许过时的客户端继续验证区块链。

       区块,资产,交易和程序各自具有版本号和可扩展字段。新版本可以修复安全漏洞或添加新功能,比如向VM添加新指令,完全更改VM或引入全新的会计系统和新类别的资产。

       如果客户端不识别区块或交易中的字段的版本号,它将其视为“未知”,并假定它是有效的。这允许过时的客户端继续使用旧规则验证区块链的一部分,使用新规则的区块将忽略,推迟给区块签名者验证。如果一些参与者检测到未知的版本号,并希望在操作之前升级软件,他们可以选择停止执行敏感操作,比如签名交易或者接收支付。

9.  互操作性

       Chain协议可以同时使用多个区块链网络。虽然他们使用相同的协议,但他们的资产ID或被锚定到网络的初始块,使得他们在全球唯一。

       可以使用交叉链(corss-chain)交换协议进行跨账交互,如Interledger。例如,CVM能够支持加密条件的SHA-256,PREIMIAGE,PREFIX,THRESHOLD和ED25519特征组合的加密条件。这些协议允许参不同区块链上的参与者彼此交互,以及与不同类型的区块链和分类账的参与者交互。

       Chain协议使用标准加密工具,如SHA-2和SHA-3哈希函数和安全签名算法ED25519。

10.      结论

       本文提出了Chain协议:一个可以支撑现在金融网络的共享,多资产,加密的分类账。此协议是为大规模应用程序设计的,提供了包含了可扩展数据模型的灵活、强大的编程环境。

       Chain协议允许参与者使用数字签名和自定义规则,以编程方式发行和控制资产。交易的发出和资产的控制被收集到一个共享分类账的加密区块链中。区块签名者遵循联盟共识协议来在所有节点上复制分类账的单个副本,以防止交易逆转和双花交易。

       Chain核心是一个实现了Chain协议的软件。使用Chain核心,组织可以在他们的市场上推出区块链网络,或者连接到已有的网络中,这可以减少金融系统中的资产转移和保管的时间,成本和复杂性,并且可以产生在传统基础设施上难以或者不可能实现的新产品和服务。

深入阅读

联合共识

区块链程序

区块链可扩展性

协议路线图

数据模型规范

虚拟机规范

密钥求导规范

Chain核心文档

 [p1]这个见证字段不包含在交易ID中,因此不被交易的签名所覆盖,这就是为什么这种签名本身就可以包括在见证字段中的原因。这种设计部分受到“隔离见证人”建议的启发,在Pieter Wuille等人的BIP 141中。这预计将在2016年年底被比特币网络采用。

 [p2]哈希是对给定输入数据运行确定性单向哈希函数的结果。良好的哈希函数是抗冲突的:它不可能找到两个输入通过哈希函数得到相同的输出。这个属性使得区块链不可变,因为通过不修改哈希而修改区块是不可能的,并因此改变所有后续区块头中的哈希。

 [p3]MINTIME和MAXTIME指令(及其相关的交易字段)提供类似于比特币的CHECKLOCKTIMEVERIFY的功能。

CHECKOUTPUT指令提供类似于MalteMöser,Ittay Eyal和EminGünSirer在其比特币协议文件中提出的CHECKOUTPUTVERIFY指令的功能。

 [p4]Chain协议的区块签名者联盟批准共识机制和Nick Szabo描述的Secure Property Titles with Owner Authority类似,发布于1998年。

转载于:https://my.oschina.net/xuchenglong/blog/826400

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Go语言实现区块链的基本步骤: 1. 定义区块结构体 ```go type Block struct { Index int Timestamp string Data string PrevHash string Hash string } ``` 2. 创建区块链结构体 ```go type Blockchain struct { chain []*Block } ``` 3. 实现创建区块的方法 ```go func (bc *Blockchain) createBlock(data string) *Block { prevBlock := bc.chain[len(bc.chain)-1] newBlock := &Block{ Index: prevBlock.Index + 1, Timestamp: time.Now().String(), Data: data, PrevHash: prevBlock.Hash, } newBlock.Hash = calculateHash(newBlock) bc.chain = append(bc.chain, newBlock) return newBlock } ``` 4. 实现计算区块哈希值的方法 ```go func calculateHash(block *Block) string { record := strconv.Itoa(block.Index) + block.Timestamp + block.Data + block.PrevHash h := sha256.New() h.Write([]byte(record)) hashed := h.Sum(nil) return hex.EncodeToString(hashed) } ``` 5. 实现验证区块链的方法 ```go func (bc *Blockchain) validateChain() bool { for i := 1; i < len(bc.chain); i++ { currentBlock := bc.chain[i] prevBlock := bc.chain[i-1] if currentBlock.Hash != calculateHash(currentBlock) { return false } if currentBlock.PrevHash != prevBlock.Hash { return false } } return true } ``` 6. 创建区块链实例并添加创世块 ```go func main() { bc := Blockchain{[]*Block{createGenesisBlock()}} bc.createBlock("Data for block 2") bc.createBlock("Data for block 3") fmt.Println(bc.validateChain()) } ``` 以上是使用Go语言实现区块链的基本步骤,其中包括定义区块结构体、创建区块链结构体、实现创建区块的方法、实现计算区块哈希值的方法、实现验证区块链的方法以及创建区块链实例并添加创世块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值