DMCH“隐私”智能合约平台简介
我们在Darma Cash匿名公链技术(五)一文中介绍了DMCH通过BLOCK-DAG技术优化了比特币PoW共识机制存在的不足,其PPoS经济激励机制在把比特币“矿池+矿机”生态映射为“PPoS节点+持币质押”生态的同时,也进一步加速了DMCH去中心化分布式区块链小世界网络的建设,对DMCH生态应用起到了至关重要的作用。
在这篇文章中我们重点阐述DMCH项目的匿名智能合约平台。项目之间的竞争在于项目的生态是否能够多元化的发展,而多元化的生态又建立在项目的智能合约平台上,因此可见智能合约的重要性。目前整个区块链市场智能合约平台生态发展最成功的项目是以太坊,大多数人平时使用最多的ERC20-USDT就是以太坊上的智能合约。根据目前DMCH官方公告的消息,DMCH的开发人员已经完成把智能合约移植进门罗框架的工作,DMCH智能合约基于WASM、使用PLONK零知识证明、提供完整的C/C++语言和GO语言编译环境、支持“匿名”合约且非常容易移植以太坊的智能合约到DMCH智能合约平台。
老祖先简单像社区成员介绍下行业里智能合约的大致情况,帮助大家对智能合约有个形象认识,然后像大家介绍DMCH智能合约的特点,以及这些特点对DMCH项目生态的重要性。本文最后将给出总结,时间紧的社区成员可以直接看结论。
(一)智能合约概述
1.简介
智能合约是一种无需中介、自我验证、自动执行合约条款的计算机交易协议,近年来随着区块链技术的日益普及而备受关注。区块链上的智能合约具有去中心化、去信任、可编程、不可篡改等特性,可灵活嵌入各种数据和资产,帮助实现安全高效的信息交换、价值转移和资产管理,最终有望深入变革传统商业模式和社会生产关系,为构建可编程资产、系统和社会奠定基础。如果一个公链项目支持智能合约功能,那么这个公链本质上就是一个平台,是一个提供智能合约服务的平台,在这个平台上会有各种智能合约,我们就称之为生态,这里的关键词就是“平台”和“生态”,也是具有智能合约公链的核心业务,“平台”和“生态”好不好,是决定公链价值的一个重要因素(见下图)。
基于比特币图灵不完备字节码语言的比特币脚本可以看做是最早应用于区块链的智能合约, 但由于其表达和计算能力非常有限, 不支持循环语句, 只能实现基本的算术、逻辑运算及验证加密功能, 早期的智能合约通常无法具有复杂逻辑。以太坊作为世界上首个内置了图灵完备编程语言并正式引入智能合约概念的公有区块链, 是目前最为流行的智能合约开发平台。以太坊的核心是可执行任意复杂算法编码的以太坊虚拟机(Ethereumvirtual machine, EVM), 所有部署在以太坊上的智能合约都将被编译成EVM字节码, 在矿工本地隔离的EVM中执行。用户可以按照自身意愿在以太坊平台上高效快速地开发出包括加密货币在内的多种智能合约和建立在智能合约上的去中心化应用(Decentralized applications, DApps)。以太坊的出现改变了区块链及智能合约的应用格局, 使其不再局限于数字货币, 开始有机会构建更宏观的金融系统并应用到其他社会领域。以太坊是目前最大的智能合约平台,每天在以太坊上运行着数百个DAPP和数千个智能合约,因此在接受度和影响力方面,以太坊毫无疑问坐稳市场第一霸主的交椅。
事实上提供智能合约功能的项目有很多(见下图),每个项目都有自己的特点,但是即便这么多项目提供智能合约,依然无法撼动以太坊的市场份额,因此老祖就不在这里一一介绍他们的优劣势了。
2.智能合约运行机制
智能合约的运行机制(如下图),智能合约一般具有值和状态两个属性, 代码中用If-Then和What-If语句预置了合约条款的相应触发场景和响应规则, 智能合约经多方共同协定、各自签署后随用户发起的交易(Transaction, Txn)提交, 经P2P网络传播、矿工验证后存储在区块链特定区块中, 用户得到返回的合约地址及合约接口等信息后即可通过发起交易来调用合约。矿工受系统预设的激励机制激励, 将贡献自身算力来验证交易, 矿工收到合约创建或调用交易后在本地沙箱执行环境(如以太坊虚拟机)中创建合约或执行合约代码, 合约代码根据可信外部数据源(也称为预言机, Oracles)和世界状态的检查信息自动判断当前所处场景是否满足合约触发条件以严格执行响应规则并更新世界状态。交易验证有效后被打包进新的数据区块, 新区块经共识算法认证后链接到区块链主链, 所有更新生效,对于智能合约来讲,这里说的“共识算法”的重要环节是,其它收到的节点也运行相同的合约代码,期待和矿工执行结果一致。
(二)DMCH隐私智能合约
老祖先把自己对“隐私”和“匿名”这两个概念的理解与社区成员分享下。首先,从文字层面来说隐私这个词要比匿名好,在行业里匿名(anonymity,anonymous)是国外单词直接翻译成中文的,但是实际上国外讨论匿名的目的是要保护人的隐私,所以用隐私这个词,更符合项目要解决的问题,匿名不是目的,目的是要保护人们的隐私;其次,从技术层面来说匿名是隐藏发生关系双方的身份,而隐私是即隐藏发生关系双方的身份,又隐藏发生关系双方的行为。
现在我们对行业“隐私”的发展过程做一些回顾:
第一阶段:比特币是一个完全公开透明的公链项目,只需知道钱包地址,就能知道比特币的进出,这样很容易查出帐户与帐户之间的关系,将比特币钱包地址和现实中的使用者关联起来,就能让人重新成为互联网时代的“透明人”,毫无隐私性可言,打个比方,你支付宝里有一些资金,这些资金给了谁,给了多少,都能被所有人公开查询,你是否愿意呢?为了解决比特币隐私性问题,开发者们提出了以混币原理为核心的解决方案,混币原理就是由许多人参与比特币的转入和转出,但是很难在转入和转出中找到一一对应的映射关系,转入和转出是被割裂的,无法从一端找出另一端的,从而保护了使用者的隐私问题。
第二阶段:一些开发者为了从根本解决隐私问题,开发了从原理上直接支持隐私保护的公链项目,市面上主流的保护隐私的公链可以分为四类:混币器类、环签类、零知识证明类和 MimbleWimble系,各自的代表项目分别是 Dash、Monero、Zcash 和Grin/Beam。但这些注重隐私保护的公链本身都不支持智能合约,只是单纯作为数字资产工具使用。
第三阶段:2018 年后,开发者们开始意识到对智能合约进行隐私保护的需求在不断增加,于是作为协议层的隐私层项目开始活跃在各种场景中,也就是在公链之上的智能合约提供隐私保护,注意隐私层协议可以建立在第一阶段的公链之上,也可以建立在第二阶段的公链之上。同第二阶段保护隐私的公链项目不同,隐私层项目可以结合各个公链的体系就行跨链操作,相对来说更加灵活,而且可以满足用户和开发者特定的隐私需求,这就是所谓的隐私智能合约了。分布式资本合伙人黄凌波直言隐私层项目将在 2020 年迎来大爆发。
目前在以太坊(ETH)上著名的隐私智能合约项目有 NuCypher,Aztec Protocol 和 Zether。那么在门罗系(XMR)项目上的隐私智能合约项目就是DMCH了。DMCH开发人员对于DMCH智能合约的定位非常清晰,那就是在门罗的基础上对标以太坊做出易用、安全、隐私、高效的智能合约平台,以服务于DMCH的生态业务发展(见下图)。
1.DMCH的UTXO模型与账户模型的适配
我们知道比特币是UTXO模型,以太坊(ETH)是账户模型,DMCH是门罗系项目,因此也是UTXO模型,那么DMCH作为UTXO类型的项目为何能够与以太坊相提并论呢?DMCH是如何做到与以太坊兼容的呢?DMCH的智能合约的运行机制是怎么样的呢?
让我们先来了解下以太坊(ETH)智能合约的运行机制。以太坊在整体上可看作是一个基于交易的状态机:起始于一个创世(Genesis)状态, 然后随着交易的执行, 状态逐步改变一直到最终状态, 这个最终状态就是以太坊世界的权威版本。以太坊中引入了账户的概念以取代比特币未花费交易输出(Unspent transaction output, UTXO)模型, 账户分为外部账户和合约账户两类, 两类账户都具有与之关联的账户状态和账户地址, 都可以存储以太坊专用加密货币以太币, 区别在于外部账户由用户私钥控制, 没有代码与之关联, 合约账户由合约代码控制, 有代码与之关联。
用户只能通过外部账户在以太坊中发起交易, 交易可以包含二进制交易负载数据(Payload)和以太币, 交易执行过程中可能产生一系列消息调用。当交易或消息调用的接收者为以太坊指定地址Ø时, 创建合约。新合约账户地址由合约创建者的地址和该地址发出过的交易数量Nonce计算得到, 创建合约交易的Payload被编译为EVM字节码执行, 执行的输出作为合约代码被永久存储。当接收者为合约账户时, 合约账户内代码被激发在本地EVM中执行, Payload作为合约的输入参数, 可信数据源则为合约提供必要外部世界信息。所有执行结束后, 返回执行结果, 完整交易经矿工广播验证后和新的世界状态一起存入区块链。
考虑到以太坊交易伴随带宽消耗, 存储消耗, 计算消耗等, 为了激励全球算力的投入和合理分配使用权, 避免系统因恶意程序走向失控, 以太坊中所有程序的执行都需要支付费用。各种操作费用以Gas为单位计算, 任意的程序片段都可以根据规则计算出消耗的燃料数量, 完整交易的发起者需支付所有执行费用。交易完成后, 剩余的燃料以购买时的价格退回到交易发送者账户, 未退回的费用作为挖出包含此交易区块的矿工的奖励.若交易执行过程中发生燃料不足(Out of gas, OOG)、堆栈溢出、无效指令等异常而中止, 交易将成为无效交易, 已消耗Gas仍作为矿工贡献其计算资源的奖励。
为了支持智能合约的账户模型,DMCH引入了“匿名账户模型抽像层”设计。因为抽像层的存在,对于普通的UTXO账户和智能合约来讲,都是透明的:即从普通的交易视角来讲,智能合约的创建和调用只是一种类型不同的匿名交易,没有账户模型的概念,而从智能合约开发者的角度,使用的是账户模型,也感知不到UTXO账户的存在。老祖以最常见的通过智能合约转账来描述两种账户模型的互相转换过程,假如A用户要通过合约B向C用户转账,则:
1.A用户构建一笔到合约地址B的合约交易,合约交易的功能是调用B的转账函数,为该函数传入C用户的接收地址和转账金额,通常是C的子地址;
2.合约B收到交易后,执行合约代码,完成C的子地址到合约账户的映射,并触发转账流程;
3.对于合约账户来讲,意味着两笔交易,A账户的支出和B账户的减少,同时B的支出和C的收入,合约代码将更新合约账户余额;
4.合约代码运行结束,自动触发一笔到C的子地址的普通转账;
这样,从UTXO账户模型的角度来讲,有两笔匿名交易,A到B和B到C的交易。从智能合约内部,则完全是三个合约账户的余额更新。
DMCH在很多时候都能吸取别人的长处并进行改良,在智能合约这块DMCH又进行了同样的操作,DMCH将其子地址(前几篇文章有具体解释)映射成一个合约账户,从而完成了UTXO到账户模型合约的转变,使得DMCH成功站在了以太坊(ETH)的肩膀上。因此DMCH的智能合约与上述以太坊智能合约的运行机制完全一样。
2.DMCH对于隐私(匿名)智能合约的诠释与设计
当DMCH使用子地址映射方式实现账户模型后,实际上可以将DMCH的智能合约直接理解为以太坊(ETH)智能合约了,那么DMCH剩下要解决的问题就是如何处理匿名这块工作了。根据国外社区的技术交流,DMCH项目在实际大规模运行过程中定义了以下几种场景:
· 合约内容透明+透明DRC20-TOKEN (ETH的合约币是ERC20,DMCH的合约币是DRC20)
· 合约内容透明+匿名Dmni-TOKEN(Omni在BTC上透明资产,Dmni在DMCH上匿名资产)
· 合约内容匿名 (通过PLONK实现,由于全匿名,无所谓其中代币是用哪种)
上述三种情形,涵盖了智能合约应用的99.99%场景,不难看出DMCH提供了用户根据实际情况选择智能合约的种类,老祖在很多偏执的项目中看到社区一定要开发队伍实现合约内容匿名,这是非常荒诞的,实际上大部分情况下隐私、匿名合约要保护的不是合约的全部内容,而是参与者和资产。在某些情况下,合约的执行内容是不能隐藏的,假设A与B通过智能合约完成一次交易,如果说合约的内容(条款)是不可见的,也就是说A和B不知道合约是不是他们约定的样子就完成了交易,这显然是不可接受的。
简单来说,DMCH智能合约是可选匿名智能合约,第一种“合约内容透明+透明DRC20-TOKEN”模式与以太坊合约完全一样,属于所有信息全透明,这使得DMCH智能合约具有潜在的庞大的用户基础;第二种“合约内容透明+匿名Dmni-TOKEN”模式在第一种模式的基础上实现了参与方的保护,也就是合约资产是谁的受到了底层匿名技术的保护。第三种“合约内容匿名”实现了合约内容的完全匿名,由于使用了Merkel树及零知识证明,这种合约隐私保护方案有一定的缺点,计算量极大、gas 成本很高,一个块里不能容纳太多的这种交易,可供特定场景下的使用。
下面我们来简单说下DMCH智能合约体系用到的技术:
2.1基于WASM——使智能合约代码兼容性高于以太坊智能合约代码
WebAssembly(WASM)是谷歌和微软等大型IT公司共同支持的一种中间型代码。WASM会生成一种叫做字节码的中间语言,字节码可以编译成机器码后执行,或者可以使用解释器直接执行。所有其他编程语言编写的程序都可以编成基于WASM字节码的程序,这大大降低了开发人员的学习成本。WASM除了易于学习之外还具有以下优点:
· 高性能:由于WASM采用二进制编码,因此在程序执行过程中性能优越;
· 低存储成本:相对于文本格式,WASM的二进制编码文本占用的存储空间更 小;
· 支持多种编程语言:开发人员可以使用C、C++、GO、RUST等多种语言编写智能合约并编译成WASM格式的字节码。
另外,根据DMCH项目在2020年3月披露的信息,DMCH项目还将提供编写智能合约所需的各种语言的类库,提升开发人员的工作效率。
值得一提的是,以太坊2.0智能合约也将升级到WASM,使用所谓的EWASM来代替EVM。
2.2全匿名合约-使用PLONK零知识证明和Merkel树
2.2.1 零知识证明
零知识证明(Zero—KnowledgeProof)指的是证明者A能够在不向验证者B提供任何与信息C有关信息的情况下,使验证者B认为信息C是正确的。举例,A通过微信向B发消息“我的微信号没有被黑”,这时B想确认A的微信号是否真的没有被黑,B通过微信发送消息让A用A的“私钥”加密一句话“xxxx年x月x日,我吃了披萨”,A通过微信向B发加密的信息,B用A的“公钥”解密信息,得到“xxxx年x月x日,我吃了披萨”,信息一致。因为A的“私钥”只有A拥有,因此B可以确认A的微信没有被黑,注意AB双方通过密码学方法,且由B根据密码学知识推断出了“A的微信没有被黑”这个结论,而没有去透露“A的微信没有被黑”的具体内容。
上述这个零知识证明,在A和B之间还是通过一些交互(互相发送微信信息,加密解密)证明了“微信没有被黑”这个结论。在这个基础上数学家们又发明了还有很多方法可以避免这个交互,比如预先获悉一些只有A知道的信息,且B预先知道确实只有A知道。
应当清楚的是,零知识证明不会“解决”隐私问题。取而代之的是,它们是隐私保护系统的基础。不同类型的零知识证明可以为这些系统提供不同的功能。
在区块链行业,一般提到零知识证明,指的是zk-SNARKs(零知识证明-简洁的非交互式自适应知识论证),“非交互式”意味着zk-SNARKs不需要验证者来询问证明者。相反,证明者可以提前发布其证明,验证者可以确保其正确性,类似于对文件进行哈希处理。最后,“自适应论证”是指某种计算的知识证明。到底是什么意思?想象一下,您的小学数学老师给您一个复杂的算术问题。zk-SNARKs能让你证明自己知道答案,无需实际演示答案或解题。
但是,SNARK的最大结构缺陷是所谓的设置阶段。比如说小学数学老师在给你解题的时候必须预先和你说好题目是加减法,那么所有的加减法都可以解决;如果出现了乘除法,那么就要重新进行“预先和你说好”这个过程,这里不做过多的解释了。由于存在这一限制,SNARK不太适合运行任意的图灵完备的智能合约-每个新合约都需要一个新的设置阶段。
PLONK是由Aztec的CTO Zac Williamson和Protocol Labs的Ariel Gabizon推出的一种全新的ZK-SNARK结构,注意Protocol Lab就是提出libp2p组织的,老祖很好奇,为什么DMCH总是用Protocol Lab的东西,不得不让老祖联想是不是DMCH团队里有Protocol Lab的人。虽然PLONK仍旧像其他Zcash SNKARs一样的可信设置(Trust Setup)过程,但是其可信设置是通用且可更新的。这意味着所有程序都可以重用此单个设置而不必对每个程序进行单独设置。由于PLONK对Gas费要求不高,因此非常适合在智能合约中使用,而且在基准测试中PLONK比MiMC上的Groth16快 2.5 倍。以太坊创世人Vitalik曾在推特上公开称赞 PLONK将降低创建零知识证明的复杂性,使更多人能够更容易使用它。
简单来说PLONK是一个给合约提供匿名转账的记忆模块,并且可以大幅度降低GAS。
2.2.2 默克尔树
Merkle树(Merkle tree,MT)是一种哈希二叉树。在计算机科学中,二叉树是每个节点最多有两个子树的树结构,每个节点代表一条结构化数据。通常子树被称作“左子树”和“右子树”,二叉树常被用于实现数据快速查询。Merkle树结构由一个根节点(root)、一组中间节点和一组叶节点(leaf)组成。叶节点(leaf)包含存储数据或其哈希值,中间节点是它的两个子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成,底层数据的任何变动,都会传递到其父节点,一直到树根,所以Merkle树也称哈希树(见下图)。
Merkle树的一个直接应该用就是零知识证明:例如如何证明某个数据(D0……D3)中包括给定内容 D0,很简单,构造一个默克尔树,公布 N0,N1,N4,Root,D0拥有者可以很容易检测 D0存在,但不知道其它内容。相对于哈希列,Merkle树的明显的一个好处是可以单独拿出一个分支来(作为一个小树)对部分数据进行校验,这个很多使用场合就带来了哈希列表所不能比拟的方便和高效。正是源于这些优点,Merkle树常用于分布式系统或分布式存储中。
DMCH的全匿名解决方案是把交易过程分成两步,第一步,不是把钱直接从发送方发送给收款方,而是先由发送方发到Merkel树上。再从Merkel树上钱存到收款方,这两步都用PLONK零知识证明保护。Merkel树大小不固定,可以动态调整,交易的隐私保护密集高,就调大一点,密集低,就调小一点。这两步涉及到四个基本操作:发送、接收、明文转密文、密文转明文,相应的门电路见下图。
2.3基于比特币Omni的Dmni方案
Omni协议,Omni协议是一种基于比特币区块链的数字资产方案(最早是MasterCoin Protocol, 见下图)。其核心原理是,将资产类的相关操作信息(如资产发行、转账等操作),附加到比特币协议中的OP_RETURN信息中。原生比特币协议中,OP_RETURN信息可以是任意内容,并受比特币区块链保护,不可篡改。Omni协议层附加在比特币区块链上运行,并维护一个本地数据库。Omni协议分析所有比特币交易中的OP_RETURN信息,若符合其协议定义,便会执行其中的操作,更改本地数据库中记录的资产信息。Omni协议本质上是一种染色币(Colored Coin)方案,也可以认为是最成功的染色币方案。Omni协议最成功的应用就是Omni-USDT,因此我们期待Dmni-USDT的出现。
DMCH利用现有的匿名技术框架(环签+一次性地址+RingCT),抽像了一套类Omni技术框架,这意味着,可以在DMCH上,轻松发行自己的匿名数字资产,而不用发行自己的主链或智能合约,甚至不需要编写一行代码。
2.4基于ERC-20的DRC-20方案
DRC-20 Token是一类遵循DRC-20标准的DMCH智能合约。DRC-20 标准中定义了一系列数字资产操作常用的接口,并便于DMCH的C和GO语言(基于WASM)实现。请注意,DRC-20 只是一系列接口定义,并不包含具体实现。换句话说,数字资产开发者需要自己编写智能合约呈现DRC-20标准中规定的方法。与其他一般智能合约一样,DRC-20 Token的最终执行,本质上是DMCH虚拟机(DVM)中运行一段智能合约程序。DMCH协议本身并不关心合约的业务逻辑,因此一个具体的DRC-20 Token的表现,完全依赖于其开发者的编程水平。以太坊(ETH)最成功的应用是ERC20-USDT,因此我们期待DRC20-USDT的出现。
(三)总结
老祖在本文花了大量的时间和篇幅介绍智能合约的来龙去脉以及DMCH智能合约的情况,这么做的原因是因为智能合约对于一个目标是生态应用且注重DeFi的公链项目来说太重要了。目前整体看下来DMCH的智能合约用形象的说法就是如德国战车般稳重,如瑞士军刀般万能:
1. DMCH的智能合约通过子地址技术完成了UTXO模型到账户模型的映射,使得DMCH智能合约完全站在以太坊(ETH)智能合约的一切优势之上。
2. DMCH的匿名智能合约提供了三种模式,即全透明、半透明和全匿名,三种方式的计算开销从小变大,用户可以根据自己的需求完全选择需要的智能合约方式。其中:
· 全透明方式类似于以太坊(ETH),可能出现的应用是对标以太坊ERC20-USDT的DRC20-USDT;
· 半透明方式是保护了资产属性,类似于比特币的Omni协议,但完全继承了DMCH的匿名属性,可能出现的应用是对标透明Omni-USDT的匿名Dmni-USDT;
· 全匿名方式借助零知识证明和底层Merkle树完成所有信息的保护,通过发送、接收、明文转密文、密文转明文,相应的门电路完成。
3. DMCH的智能合约运行的沙盒DVM相对于以太坊智能合约运行的沙盒EVM,使用了WASM技术,这一点更加体现了DMCH充分考虑市场需求和推广需求。
从技术层面看,DMCH的智能合约平台可谓集大成者,项目组在务实地整合了行业正确理念的同时又关注业务的实际需求,这使得DMCH的生态应用有了夯实的基础,也赋予了DMCH项目更大的空间。