Qtum区块链,又称为量子链,是一个基于未花费交易输出(Unspent Transaction Output,UTXO)和权益证明(Proof of Stake,PoS)的智能合约平台,融合了比特币和以太坊生态系统各自的优点 。智能合约可以应用在诸多行业,如金融科技,物联网和身份认证等。智能合约的核心技术是分布式账本,也就是我们常常提到的区块链。Qtum区块链实现了完整的智能合约功能,通过账户抽象层(Account Abstraction Layer,AAL)技术把UTXO模型转换成可供以太坊虚拟机(Ethereum Virtual Machine,EVM)执行智能合约的账户模型,合约开发者不需关心对合约操作相关的UTXO转换细节,即可使用EVM的特性进行开发而且兼容现有以太坊的智能合约。
Qtum量子链采用了互惠权益证明(Mutualized Proof Of Stake, MPoS)共识机制,使得在智能合约下实现更安全的PoS共识。另外,独创性的提出和实现了分布式自治协议(Decentralized Governance Protocol, DGP),DGP是通过内嵌到创世区块的智能合约来治理区块链网络的参数,去中心化的网络自治机制使得区块链网络在一定程度上实现自动升级和快速迭代而无需进行软件升级。
本指南介绍Qtum区块链基本概念和使用的技术,介绍了Qtum的交易类型和智能合约的使用,对Qtum区块链的使用可以有一个基本的了解。
Qtum区块链简介
首先介绍一下区块链相关的概念。
区块链基本概念
区块链是一种去中心化、分布式的账本,账本以冗余的方式存储在所有参与节点。区块链主要由以下底层技术组成:密码学、共识算法、点对点网络。就数据组织方式来看区块链是由一系列的区块链接形成的一种数据结构。最底层的第一个区块是创世区块,随后每个新区块都被放置在前一个区块之上,这些区块有序地链接在一起形成链。区块之间是通过哈希指针进行连接的,哈希指针表示从原区块指向目标区块并且在目标区块存储有原区块的哈希值。区块由区块头和区块记录组成,区块头用于描述本区块的组成信息,区块头最重要的用途是用作记录前一区块头哈希值和区块记录的根哈希值。
简化版区块链示意图
一个或多个新的交易收集到一起成为了一个区块的交易数据,这些数据作为区块记录。为了对数据完整性进行保护,每个交易的副本都会进行SHA256哈希,然后这些哈希作为Merkle 树的节点,对Merkle树节点进行从下到上的哈希运算,最终在 Merkle根节点得到一个根哈希值。该哈希写入到区块头,而区块头也进行哈希运算得到一个哈希值,该哈希值写入下一个区块头部,因此通过写入区块头的根哈希值就可以验证区块记录。
由于区块头里的哈希值与前一个区块相关,如果前一个区块内容发生变化,其哈希值也会发生变化,因此会改变当前区块的哈希值,这个改变会传导到下一个区块,并再传导到下下一个区块,以此类推,直到最后一个区块。因此当改变某个区块记录时,会破坏该区块之后的链接关系,除非对该区块之后所有区块进行相应的更改,即重新计算符合共识的哈希值。共识算法是用来确保重新计算哈希值在一个合适的难度,这样如果想改变区块内容,必须在计算能力或权益大小上超过共识难度,多个区块共识难度的不断积累,使得在概率上保证了最长链的安全性,这是就是工作量证明(Proof of Work,PoW)和权益证明(PoS)共识算法的作用原理。比特币区块链通过工作量证明,而Qtum区块链采用的是权益证明机制改进算法:互惠权益证明(MPoS)。
点对点网络是实现Qtum节点之间进行通信的方法,交易广播、区块同步与广播等都通过点对点网络来实现。通过点对点网络,每个节点共享同一份的账本,并对账本进行验证,共识算法和共识规则是进行验证的标准,由于共识的一致,和密码学结合确保了作恶节点无法篡改和作假账本上的数据。可以看到,密码学、共识算法和点对点网络的结合确保了区块链在去中心化的条件下能实现可信的账本。Qtum在此基础上增加了可以运行智能合约虚拟机,从而实现了一个高度智能化的价值传输网络。
Qtum区块头
Qtum量子链的区块头描述了区块的状态记录,用于管理记录区块交易结果相关的信息和共识算法所需的数据。以下是Qtum区块头数据结构的定义:
Qtum区块头
其中nVersion版本信息描述了当前Qtum区块链软件的版本,hashPrevBlock记录前一区块头哈希值,hashMerkleRoot记录本区块交易ID生成的Merkle树根节点哈希值,nTime记录区块产生的时间,nBit记录当前计算区块头哈希值的难度,nNonce与比特币兼容,但PoS阶段未使用,hashStateRoot记录本区块EVM执行完成后的根状态哈希值,hashUTXORoot记录本区块EVM执行完后产生的UTXO根状态哈希值,prevoutStake为前一区块用于PoS过程的交易输出点,vchBlockSig是PoS时使用的区块签名。
Qtum区块
Qtum交易的基本单位是未花费的一个交易输出,简称UTXO。UTXO是不能再分割,并记录在区块链中。一个交易的输入是一个或多个UTXO,生成交易时对这些UTXO进行签名用于解锁输入,签名标志着对某个地址上Qtum的使用许可。这些签名后的交易广播到Qtum网络中。网络的每一个全节点都可以接收、验证、和在网络中转发这些交易。Qtum区块链每隔一段时间就有挖矿节点产生新的区块,把验证通过的交易记录到区块。
Merkle树是一种哈希二叉树,用于快速归纳和校验大规模数据完整性。这种二叉树的节点包含哈希值。在Qtum区块链中,Merkle树用来组织每个区块中的交易标识(txid)。txid是对交易进行两次哈希算法生成。Merkle树是自底向上构建的,通过对相邻叶子节点的 txid 配对然后做哈希运算,生成为父节点,对所有叶子节点重复这个过程,并对生成的父节点进行类似的操作,只到剩下顶部的一个节点,最终构建了 merkle 树。如下图所示:
Merkle树
在简化支付验证(SPV)提案中指出,Merkle 树允许客户端通过一个完整节点从一个区块头中获取其 Merkle 根节点和中间哈希值列表来验证一个交易被包含在这个区块中。这个完整节点并不需要是可信的,因为伪造区块头十分困难而中间哈希值是不可能被伪造的,否则验证就会失败。
Qtum的PoS区块至少包含2笔交易。这些交易的第一笔是一个特殊的 coinbase 交易,该交易没有Qtum输出。第二笔交易是coin stake交易,它包含了这个区块所有交易费和区块奖励。coin stake交易在之后的 500 个区块内之后才能花费,在Qt钱包上显示staking的Qtum就是参stake之后不够500 个区块锁定的。
MPoS共识算法
Qtum基本的共识算法基于PoSv3共识机制。关于共识机制孰优孰劣的讨论一直在进行中,最常被讨论的共识机制有:工作量证明机制PoW 、权益共识机制PoS 、动态权益共识机制和HyperLedger的拜占庭容错机制 。共识机制的目的是利用分布式算法达成数据的一致性。正如Fischer Lynch & Paterson定理指出,除非所有节点达成100%一致,否则无法达成共识。 在比特币网络中,矿工通过工作量证明机制哈希碰撞参与交易验证。当矿工计算出满足一定条件的哈希值时,矿工可以向全网宣布新区块的诞生:
Hash(BlockHeader) ≤ M/D
M是矿工数量,D是挖矿难度,Hash()代表SHA256哈希运算,输出值范围为[0,M]。比特币的SHA-256哈希运算满足快速验证(方便网络中每个节点对运算结果进行验证)、可调整的难度值(可以根据全网算力进行调整)和相对公平性(也就是说,每个矿工解决哈希计算的概率与其算力成正比)。 在PoSv3交易中,新区块的产生必须满足下列条件:
ProofHash < coins × target
在ProofHash中,StakeModifier 利用未花费输出和当前时间进行运算。由于Qtum实现了智能合约,交易处理需要花更多的时间去和智能合约交互和执行,因此需要更动态的费用机制。这其中有影响Qtum的几个安全隐患。一个比较大的隐患是,攻击者可以通过支付昂贵费用执行恶意程序,但由于这些费用会归于区块生产者,最终攻击者付出的费用会变得很小。基于现有PoS系统的加密货币由于不支持图灵完备的智能合约VM,不会受到这类攻击的影响。Qtum是第一个基于PoS和以太坊智合约的区块链,实现了规范在区块链上允许的计算用途和能力的gas机制。
Qtum进一步对PoSv3做了一个修改,用于部分解决通过垃圾交易攻击而产生的无用satke问题。采用PoSv3一致的共识机制,但改变了区块奖励和交易费用的支付体系。与区块生产者会立即收到区块奖励和交易费用相比,新的方法是奖励和交易费用在网络中多个挖矿者之间互相共享。具体说来,区块生产者在生成区块的时候会收到总费用的1/10,而经过预定的区块确认时间之后,可以接收到另外9个块的费用的1/10。
这个新的方法看起来改动很微小,但它解决了影响Qtum的几个安全隐患。一个比较大的隐患是,攻击者可以通过买入足够的币从而成为有可能的区块生产者,通过某些EVM操作码使网络变得容易遭受DoS攻击。这只需要很小的代价,甚至恶意交易需要消耗交易费用和gas,攻击者可以通过支付昂贵费用执行恶意程序,但由于这些费用会归于区块生产者,最终攻击者付出的费用会变得很小。使用MPoS,就不会出现这种情况,产生区块是只能收到1/10的gas费用,除非他能再挖出连续的9个区块,否则其余9/10的gas费用会因分给网络上其他的挖矿者而丢失。因此会导致这种类型的垃圾交易攻击会变得很昂贵。
当一个区块产生时,区块生产者的奖励交易必须包含至少10个输出。第一个输出属于本区块生产者,可以接收自己用于stake的币和1/10的交易费用,其他九个输出属于500个区块之前的区块生产者。当一个区块产生时,增加一个奖励费用的接收者,同时减去另外一个接收者,因此总接收者数量一直有10个。区块生产者另外9/10的奖励将在500个区块之后,即(+501,+502,...,+509)每个区块奖励的1/10。
AAL和智能合约
智能合约(Smart Contract),以编程方式定义的一系列承诺,包括合约参与方可以在上面执行这些承诺的协议。通过区块链可以实现这种智能合约的编程,并在区块链上执行,因此一旦设立指定后,能够无需中介的参与自动执行。
Qtum实现了满足以太坊虚拟机(EVM)规范的智能合约功能,在Qtum上可以部署和调用智能合约。以太坊虚拟机使用了256比特长度的机器码,是一种基于堆栈的虚拟机,用于执行以太坊智能合约。由于EVM是针对以太坊体系设计的,因此使用了以太坊账户模型(Account Model)进行价值传输。而Qtum量子链的设计是基于比特币UTXO模型,所以在量子链模型设计中加入了账户抽象层(Account Abstraction Layer),用于将UTXO模型转换成可供EVM执行的账户模型。账户抽象层可以隐藏某些特定功能部署细节,并为增强互操作性和平台独立性建立关注划分。
Qtum量子链中的所有交易使用比特币脚本语言,并在其基础上进行了拓展,加入了三个全新的操作符。
- OP_CREATE – 用于执行EVM智能合约的创建,把通过交易传输的字节代码存放到合约RLP数据库,并生成一个合约账号;
- OP_CALL – 用于传递调用智能合约所需要的相关数据(即EVM中的CALLERDATA)和地址信息,并执行合约中的代码内容。该操作符还可为智能合约发送资金。
- OP_SPEND – 将当前合约的ID哈希值作为输入的交易HASH,或发送到合约的UTXO的交易HASH,然后使用OP_SPEND作为花费指令构建交易脚本。
在比特币系统中,只有当解锁脚本(ScriptSig)与锁定脚本(ScriptPubKey)验证通过后才能花费相对应的交易输出。举例来说,锁定脚本通常会把一个交易输出锁定到一个比特币地址上(公钥的哈希值),只有当解锁脚本和锁定脚本的设定条件相符时,