请选择 进入手机版 | 继续访问电脑版
  • 搜索
  •  找回密码
     立即注册
  • 登录
  • 注册
  • 找回密码
  • 管理
news文章详情

干货:《Qtum技术剖析与智能合约全栈解读》

2018-03-23阅读 1 量子链平台Qtum

钟文斌:《Qtum量子链关键技术解读》

今天我们将就以下几个主要的问题来进行探讨:

1. 为什么要建立Qtum量子链

2. Qtum量子链的技术基础

3. Qtum量子链的技术创新

4. Qtum量子链的生态系统


1.为什么要建立Qtum量子链

首先很多熟悉区块链的开发者朋友肯定会有这样的疑惑,我们已经有了比特币和以太坊为什么还要建立Qtum量子链呢?如果要给Qtum量子链一个定义的话,我个人的理解是:Qtum量子链是首个基于UTXO模型,并采用PoS共识机制的智能合约平台。其中包含了三个概念:UTXO模型、共识机制PoS还有智能合约平台,稍后我会对他们一一进行详解。

 

Qtum量子链项目从2016年3月就已经开始筹划和执行,2017年6月时发布了第一版测试网络,2017年9月时主网正式上线,所以Qtum量子链在产品的更新迭代方面还是比较快的。另外Qtum量子链也可以说是站在了巨人的肩膀上,结合一些成熟的区块链生态的优势,稍后也会解释。


先来看一下Qtum的一些基本参数,区块大小:2MB;出块时间:128秒;共识机制: MPoS;

链上理论最大TPS: 70~100 笔交易/秒;初始发行量:100,000,000 QTUM;当前挖矿奖励:4 QTUM,每四年减半;挖矿奖励总额:约 7,884,000 QTUM;基础代码框架:比特币Bitcoin core;支持以太坊虚拟机EVM。

 

关于Qtum的设计理念,不得不提比特币和以太坊。首先要简单解释一下这两者,比特币是点对点的电子货币系统,它主要考虑的是货币属性,因此会主要考虑安全、稳定、去中心化以及存储、传输价值的特性。此外,从安全性方面考虑,比特币脚本被设计成非图灵完备的。作为数字货币,比特币实际上是比较成功的,从2009年至今,并没有出现过任何一笔错账。但除此之外,你很难再在比特币之上建立复杂应用,因为它从设计之初就仅仅考虑了其货币属性。

 

而以太坊则是目前全球第二大的区块链生态,是以平台的角度去设计的。平台必须能够保证其可扩展性和TPS,从而支持成千上万种DApps。它同时也是个智能合约平台,有用于执行智能合约的环境,比如EVM, x86VM。同时以太坊也需要有合理的经济模型激励开发者,从而促进生态发展。作为平台,多样性、隐私性(不受网络中其他应用的影响)也是需要考虑的问题。以太坊有一套图灵完备的语言,简单说来就是可以支持循环,从而可以实现比较复杂的智能合约逻辑。

 

以太坊作为一台平台可能并不那么成功,首先它的TPS 不够高。举个简单的例子之前在以太坊上有个应用叫云撸猫,就把以太坊给搞宕机了。在安卓系统上你很难想象一个应用会因为另一个应用得影响而遭殃,但是在区块链上这种可能是存在的。就好比云撸猫,TPS都被用于撸猫,那么正常的交易就无法被保证了。以太坊作为一个智能合约平台,它得智能合约功能的确是能支持一些简单的逻辑,但是编程语言仅仅局限于Solidity(还有几种语言基本无人使用),而不是大家比较熟悉得主流编程语言,所以在这一点上有所欠缺。

 

比特币和以太坊各有优缺点,但作为全球最大的两个区块链生态,它们是相互独立的,没有太多交集。Qtum设计的初衷是希望打通比特币和以太坊这两大生态,使开发者既能享受到货币的稳定性和安全性,又能具备去中心化应用平台的便利。根据开源软件思想,Qtum量子链决定不重复造轮子,取比特币和以太坊的精华并在此基础上继续演进。

 

在此之前,在比特币上运行图灵完备的脚本语言是不可能的,所以Qtum建立了一个逻辑上的抽象层使之成为分层的结构也就是AAL账户抽象层。还有就是目前所有的公有链的通病在于治理协议比较混乱,所谓的治理协议其实就是软件的升级和迭代。在中心化的公司或者平台比如App store上面开发者只要把更新好的App上传供用户下载就可以了,但是在去中心化的系统上就不一样了。一个用户要对软件进行更新,其他人不一定会支持,那么就需要一个治理协议去决定整个生态应该如何进行治理。Qtum量子链对这个问题有自己的想法,也就是DGP分布式治理协议,能够自行对区块链参数进行动态调整而不必进行硬分叉,实现了区块链的自治。

 

从共识角度来说,我们知道比特币和以太坊所使用的都是PoW共识机制,优点大家很清楚就不赘述了,但是缺点同样突出那就是对能源消耗巨大。比如矿机非常耗电,这些电力也成为了比特币的挖矿成本。所以Qtum量子链使用的使PoS共识机制作为更好的替代方案,其实它已经被提出很久的时间,目前Qtum用到现在经过很多次迭代也运行良好。另外一个使用PoS的原因是移动设备和物联网设备上很难实现PoW。另外正如之前提到的以太坊虚拟机仅支持Solidity这个比较冷门、年轻的语言,有多少开发者会去为了智能合约的编程再去重新学习一门全新的语言?所以Qtum目前在研发x86虚拟机,能让大部分开发者用熟悉的主流编程语言比如C、C++更简单地开发智能合约。这样就能大大提高社区内开发者的工作效率,让更多去中心化应用能够落地。


2. Qtum量子链的技术基础

首先是UTXO模型,英文是Unspent Transaction Output(未花费的交易输出)。我们来看一下比特币和以太坊网络上的两个典型交易。以太坊上的交易对于普通人来说相对好理解,就是从一个地址到另一个地址,一笔Token的传输。而比特币交易就没那么简单了,它是由若干个input和output组成的,Output当它未被花费的时候就是UTXO,将成为下一笔交易的输入。所以所有比特币网络上的交易都是由input和output串联起来的。UTXO的可取之处在于:

-安全性(解决双花问题,支持原生多重签名)

-匿名性(拥有多个地址,找零地址)

-可扩展性(并行,离线交易)

-轻钱包(SPV,支持移动端验证交易的合法性)

目前除了Qtum以外基于UTXO模型的各种币的底层脚本语言都不是图灵完备的,,所以Qtum量子链才会开发账户抽象层AAL使UTXO模型与以太坊虚拟机账户模型能够无缝交互。


再来说一下共识机制的问题,首先回顾一下什么叫区块链,刚才提到交易,接下来用户对每一笔交易进行签名以保证其安全性,拥有私钥才能花费一笔资产。每十分钟内的所有交易被打包为区块,每个区块中所有交易的组织形式为Merkle树(https://zhidao.baidu.com/question/1047592469520906459.html),它是一个二叉树,每个叶子节点都代表一笔交易,而非叶子节点均为其子节点的哈希值,任何一笔交易被篡改都会影响根节点的哈希值。最后,每个区块都有一个指向上一区块的哈希指针。所以简单来说区块链就是一个不可篡改的分布式数据库,那为什么需要挖矿呢?这里以PoW挖矿为例。首先,区块链主要分为:公有链、私有链和联盟链。它们的核心区别在于记账权,公有链是去中心化的,赋予网络上的每个节点记账的权力,而私有链和联盟链的记账节点为少数几个指定节点。只有公有链才需要挖矿,因为要维持节点不断地在网络上记账,那么挖矿就成了网络对记账节点的激励机制。依靠区块奖励鼓励节点记账,共同维护区块链网络的生态。那为什么大家挖矿用户也要去监听记录别人的交易呢?因为手续费也会作为区块奖励。挖矿的另一个原因了保证记账节点的的随机性,否则固定的记账节点很容易被DoS攻击。另外,挖矿也是一个代币分发的过程,从而把币随机地分发出去,而不是只在个别人手中。整个比特币的精髓就在于它的激励机制,但PoW共识机制也并非没有问题,比如:

-加入网络的门槛较高,需要花费很多钱买矿机才能成为比特币的全节点进行挖矿

-越来越趋性中心化,大部分的挖矿所得被少数几个大矿池占据

-能源耗费巨大


基于这些问题,2012年时有人提出PoS(权益证明机制),原理很简单,只要用户拥有该网络的Token并证明这一点,就可以参与记账。另外,代币持有人也更有动力维护网络的安全。PoS机制同样也能达到比特币的随机性、安全性和Token分发等功能,而且相比于PoW来说显得更加去中心化。中本聪在设计PoW共识机制时并没有想到会有矿机的出现从而使得比特币越来越中心化,而PoS的挖矿根本不需要使用矿机,只需要一台普通电脑、树莓派就可以参与。

 

除此之外还有几种共识机制比如DPoS(代理权益机制)选出一些代理人来进行记账。pBFT,dBFT等则是改进后的拜占庭容错机制解决方案。上述几个共识机制都是相对比较偏中心化的,比较容易导致一些中心化的问题或者被攻击。像某些网络的计算节点比较少,一些节点挂掉就会导致整个网络瘫痪,但这些在比特币或者Qtum上都没有发生过。

 

第三个技术基础就是智能合约,简单来说就是可以在区块链上运行且达成共识的一段代码。以太坊是目前最流行的智能合约平台,目前以太坊虚拟机也是唯一一个可以真正意义上运行智能合约的虚拟机,但是它却有不少缺点:

-移动端不友好

-solidity等少数语言,具有局限性

-安全性(DAO,Parity)

 

第四个技术基础是去中心化网络。只有在去中心化的网络上Token才有它的价值,否则就跟Q币没什么区别,只能在腾讯的体系内使用而并不会有什么价值的提升。说了去中心化那么多好,也来谈谈它的缺点。在分布式领域有个CAP理论也就是一致性、可用性和分区容忍性不能同时满足。所以去中心化的程度与TPS是有矛盾的,去中心化程度越高越难达成共识,那就很难再很短时间内达到交易的确认。所以如果用户希望追求比较高的TPS,那必然会牺牲去中心化。但如果真的想要两者兼得,则要借助分层网络来实现,闪电网络、雷电网络这些技术都能够用来实现较高的TPS。比特币上的闪电网络和以太坊的雷电网络目前都在开发中且发布了测试版。而Qtum量子链因为能够兼容这两个生态,所以日后这两个技术开发完备之后Qtum也都能使用。


3. Qtum量子链的技术创新

首先是AAL账户抽象层,因为Qtum量子链兼容两种生态,UXTO模型不支持智能合约功能,所以我们需要账户抽象层的上层兼容以太坊虚拟机编写智能合约。这种分层设计能够让上层的应用层和底层相互解耦,Qtum设计的抽象层使上下层能够通信适配。

 

至于如何实现其实是在比特币脚本中增加3个新的opcode:OP_CREATE:创建智能合约、

OP_CALL:调用智能合约(向合约发送QTUM)以及OP_SPEND:花费智能合约中的QTUM。这样一来比特币底层就可以识别上述三种操作,并将他们作为信号发送给上层的以太坊虚拟机,使其在运行智能合约的同时也能将一些信息反馈回底层。

 

所以对于开发者来说,这还是一个比较容易理解的账户模型,而它的底层还是跑在UTXO这样一个比较安全的模型上的。账户抽象层的优势如下:

-允许EVM在UTXO模型上运行

-兼容多种虚拟机(不仅是以太坊虚拟机,还有目前以太坊,eos正在研发的webassembly和未来Qtum的 x86虚拟机)

-底层具有比特币的安全性

-智能合约开发者只需要关注“账户模型”

-解除底层协议与上层应用的耦合


这里我想再强调一下PoS共识机制,它一共经历了3次大的迭代:

-PoS1.0:依赖“币龄”,长期不在线,双花问题

-PoS2.0:移除“币龄”,增强安全性

-PoS3.0:针对“short-range”攻击,采用区块时间和交易时间确认UTXO的年龄


想解释一下为什么Qtum没有用PoS3.0,因为它存在一个问题,攻击者可以通过支付比较昂贵的gas发起一些恶意的智能合约从而伤害到整个网络。刚刚也提到矿工是可以获得transaction中的gas作为奖励的,那也就是说这些攻击者能够将他们用于攻击的gas全部收回,那么他们就可以不断地进行攻击。


但是为何现有用PoS共识机制的区块链项目就不会有这个问题,因为它们大部分只支持非图灵完备的脚本语言,但是在Qtum上既要保证PoS,又要能够调用智能合约有可能出现这个问题。所以Qtum的解决办法就是:通过和其他节点分享收益并将收益延迟化,增加攻击的成本。换句话说,攻击的成本如果能很快还给攻击者,那么他会不断进行攻击,但如果延迟五个小时再还给他,那么势必能有效降低攻击的频率,让攻击者要花上很多倍的成本进行攻击。

 

接下来我再解释一下我们的MPoS机制,它基于基于PoS 3.0: 修改激励机制,每个区块所得10人平分,其余奖励延迟500区块。1/10 奖励立刻获得,其余9/10奖励在500个区块之后连续9个块中获得。挖矿奖励 = 区块所得+手续费+运行智能合约gas费用。这是Qtum在激励机制上做的一个简单的改进,但是效果还是不错的。

 

很多朋友肯定会比较关心如何进行Qtum的挖矿,其实非常简单,只要你拥有一定数量的Qtum,下载Qtum钱包,把Qtum打入Qtum钱包,等待500个区块确认之后,只要钱包是未加密状态你就可以开始挖矿了。这其实币比特币的挖矿要简单地多,一台PC就可以搞定,你也可用用树莓派等设备或者其他带有Qtum节点的物联网设备上进行挖矿。

 

比特币目前全球的全节点大约是12000个,以太坊接近20000,而Qtum运行了6个月到现在已经拥有了3000多个全节点,分布在全球各地。正式因为进入的门槛低,所以才会有那么多的节点。全节点数量和网络的去中心化程度是成正比的。

 

下一个Qtum量子链的技术创新是DGP分布式自治协议,治理我们之前有提到,在一个去中心化网络怎样对软件系统进行升级、迭代等等问题。比特币之前分叉成BTC和BTH,分叉的分歧就仅仅于区块大小问题,正因为比特币是个去中心化网络所以导致这个争论持续了很长一段时间。分叉并不能说是绝对意义上的坏事,但我们认为为了这个问题争论了那么久、浪费如此多的口舌是挺没有意义的。影响分叉的因素分为以下三类:

-算法、功能的改变(共识算法、加密算法、交易脚本、虚拟机)

-策略、参数类(区块大小、出块时间、交易数量、Gas策略)

-关键漏洞(DAO、Parity多重签名钱包)


策略方面的的因素其实是最容易达成共识的,另外两类有事必须通过分叉来解决。而比如区块大小的改变并不一定需要通过分叉来进行。所以Qtum就考虑是否能让区块链进行无缝的升级,分布式自治协议DGP就是这么来的。其实它本身也是通过智能合约来实现的,其基本的治理结构是这样,在整个社区内部的矿工、区块生成者和持有者都是区块链治理的参与者,通过投票去完成治理的过程。最终让区块链能够实现自我管理、升级和迭代的系统。

 

那么Qtum分布式自治协议技术选择有两种:自治协议的实现需要某种可编程技术,UTXO和EVM提供这种特性。一是基于交易脚本,通过在交易脚本上实现协议逻辑,非图灵完备,实现比较复杂。二是基于智能合约,具有图灵完备的可编程能力,可以灵活实现复杂的逻辑。

 

自治协议核心逻辑的实现,是由一系列的智能合约组成,区块链核心代码在共识过程中执行协议的智能合约,获得当前的共识状态。同时它能通过Transaction完成区块链网络的状态转换,升级无需区块链网络软件更新。出于安全性考虑,智能合约本质是一段代码。理论上,采用了图灵完备的智能合约可以实现任意复杂度的协议设计,甚至是区块链的核心协议,如共识部分的代码等;权衡效率、安全等;当前协议仅适用于在安全范围内对特定参数进行更改,同时对参数生效时间采取一定的时间限制。而参数的更改提案通过后,在一定数量的区块后生效,避免产生可能分叉。

 

在合约部分:创世块嵌入了常见的区块链参数治理的智能合约,每个治理的主题都由独立的智能合约控制(模板),这意味着每个功能有独立的治理、授权机制以及内置限制条件Block size,  Min GasPrice,  Block GasLimit,  Gas Schedule。此外DGP合约还具备自毁功能,能在提案治理上发生意外时启动,治理参数退回到默认状态。


最后我们再来说一下Qtum x86虚拟机,以太坊虚拟机的缺点很多,之前也提过,再罗列一下:

-编程语言局限性(Solidity)

-缺少标准库

-256bit整数,大部分处理器不能原生支持,运行效率降低

-Gas模型不合理,难以估计Gas消耗

-生成的bytecode较大,浪费区块存储资源

-难以测试和调试

 

那么针对以太坊虚拟机的这些弊端呢,我们Qtum正在设计x86虚拟机,设计目标如下:

-支持多种主流编程语言: C/C++/Go/Rust 等等

-丰富的标准库,提高开发效率

-更加优化的Gas模型  -- 为标准库函数设定合理的gas,便于估计,利用DGP

-解锁AAL的强大功能 合约P2SH交易,segwit

-冯诺依曼结构,加强版的智能合约 代码即数据,多任务协作,中断和恢复

-第一类Oracles 无需运行合约即可获得某些合约数据

-区块链动态分析 -- 更全面地分析区块链状态

-选择性数据存储,节省宝贵的区块链上资源

-清晰的依赖关系树,有可能并行运行智能合约,降低gas费用

 

我们技术创新方面也就介绍到这里了。我们的slogan是“重新定义区块链经济”,让不同种类的应用能够快速落地,这也反映了我们Qtum团队真正想让区块链技术快速会渗透到人们的生活中去。


4. Qtum量子链生态系统

Qtum目前的生态系统对于在座各位更多的是如何去体验,我们的桌面钱包可以支持:

收发QTUM、收发QRC20 Token、智能合约交互、调用智能合约、部署智能合约、发Token

和PoS挖矿,这是我们比较主要的一个钱包,几乎拥有一切功能。另外就是手机移动端钱包,Qtum的一个优势就在于你可以在手机端收发Token,只需要花上20秒。你同样也可以使用它发行Token和crowdsale。上述的这一切在网页版钱包中也是可以实现的,它甚至可以从其他客户端恢复钱包和发送离线交易。

 

那比较注重安全性的用户会比较倾向于使用冷钱包,也就是硬件钱包。那用的比较多的比如Ledger钱包也是可以支持Qtum的,并且可以配合Electrum使用。Qtum Electrum是可以支持多重签名轻钱包,也同样能够支持Qtum的收发和智能合约,而且还可连接硬件钱包。

 

另一个就是区块链浏览器,可以说它是区块链世界的入口,在上面可以查询到区块记录、追溯每个区块的出块时间、大小、还有交易时的ID等等。

 

除了这些,对于Qtum感兴趣的朋友可以去查看以下链接,所有的资源都是开源的,如果大家有一些比较细节的问题,在这里也可以找到详细的答案:

Qtum官方开源仓库:https://github.com/qtumproject

Qtum开发者指南:https://github.com/qtumproject/qtumbook

Qtum百科:https://github.com/qtumproject/qtum/wiki

Qtumjs:https://github.com/qtumproject/qtumjs

非官方Qtum Web.js:https://github.com/bodhiproject/qweb3.js


最后呢Qtum的生态系统发展到现在已经拥有超过50个去中心化应用了,其中几个比较具有代表性的像预测市场菩提、还有清洁能源的交易解决方案Energo等。这些项目就不一一介绍了,大家有兴趣也可以登陆http://eco.qtum.org,更加鼓励大家投入到Qtum的网络上开发自己的去中心化应用。


5. 总结

今天我分享了关于Qtum量子链的一些设计理念或者技术创新等,在座各位一定也有很多想法,如果你是认同这些观点的,那你一定是天然的Qtum开发者,欢迎大家上Github为我们的底层技术做些贡献,也会获得比较丰厚的回报。当然也会有人不认同我们的观点,比如你认为去中心化没用,TPS反而更重要或者PoW才是最佳共识机制。我们的社区也同样欢迎类似的开发者以质疑的态度做一个全新的产品。说这些是想告诉各位Qtum的社区对任何开发者都会秉持开放的态度,只要开发者是真心愿意去为整个区块链生态做一些努力和开发工作,Qtum量子链也会为他们提供一些技术支持和经济支持。谢谢大家!


Howard:《智能合约全栈解读》

今天我主要为大家简单介绍一下智能合约的开发,相信在座各位当中程序员居多但是真正有智能合约开发经验的却很少,希望我的分享能对大家有帮助。我将就以下几个主要的点来为大家解读智能合约:

1. 为什么要智能合约?

2. 什么是智能合约?

3. 去中心化应用/智能合约/以太坊虚拟机全栈解读

1. 为什么要智能合约?

区块链本质上是基于共识机制的,共识机制又是层层递进的,为了达到所谓的social scalability,这样的信任和共识会逐步从个人扩展到亲友,再到社区、城市、国家乃至全球。区块链和智能合约的存在就是要提高人与人之间的合作,共同创造社会价值。合作的前提是信任,但是有时候熟人都难以相信,更别说是陌生合作者了,所以许多区块链先驱就认为,人与人的信任应该建立在区块链上。那么就算合作双方互不信任,智能合约也能帮助降低他们合作的风险,达成共识,不打翻他们友谊的小船。

 

所以从另一个角度来说,智能合约可以理解成为一种“社交科技”,促成具备信任基础的“点对点对话”、“多对多的撮合”。在区块链技术出现以前各国政府都需要花费大量成本维持社会秩序和信任基础,这些支出与GDP的占比从36%-58%不等。所以区块链出现的也是为了能够让计算机代替人肉。比如原来的社会治安需要警察、社会正义需要法官律师维护,但是有了区块链,许多社会规则规范就可以写在算法中,利用算法维持社会稳定。以往双方在进行合作之前需要签订合约,需要有律师和公证人、在发生问题的时候需要仲裁。所以在一纸合约的背后是一个巨大的信任体系,但是智能合约可以用计算机代替类似多种成本。


2. 什么是智能合约?

那么具体智能合约长什么样呢?可以参照一下亚马逊的 LAMBDA,它是与智能合约最像的一个服务。


本质上它是一个云计算平台,用户可以将编写好的函数上传上去并得到一些反馈的结果。与传统的 PHP 与 Java 服务不同的是,它并不是一个持续运行的程序。有请求来了,它才执行一下。

 

Lambda 平台负责处理外部的请求,把数据传递给业务逻辑去处理,最后平台再把结果输出给终端用户。

 

用户上传到平台上的是单纯的业务逻辑。智能合约也只是单纯的业务逻辑。

来看一个最简单的例子,是一个计数器,大家可以看到increment的递增函数,它所做的是吧计数器的count变量+1。这个合约的编程语言叫Solidity。

合约最重要的概念就是它的存储。合约的存储是长存的。它不像内存,执行完毕就销毁。

 

之前我们看到在调用 increment 这个函数的时候它修改了count 这个变量,但它并不像普通编程语言的变量,它更像是往数据库写入的一个键值。


为什么智能合约如此有趣,是因为它不仅可以执行一些简单的逻辑和存储,它还具有金融属性,可以处理一些与财富相关的内容。

 

如果你在自己的服务器上面写一个处理钱的东西还要求别人往你的服务器上打钱这事情是不会有人愿意去干的。

 

但如果你将它实现在智能合约上,信任是由以太坊或者Qtum量子链这样的平台担保的,就完全不一样了。

 

我们这边做了一个“功德香火链”的概念,透明化香火钱。每捐赠一次香火就可以在功德簿上记上一次。具体捐了多少,几次,什么时间,这些信息都是在链上公开的。

“功德香火链”的需求如上图。

 

我们需要初始化和设定管理员,就比如我们可以选一位德高望重的方丈,具有管理合约和取款的权限。

 

但如果其他小和尚要碰这个钱就不可以了。

 

当然任何人都可以捐款。我们也可以设定一些条件比如捐赠金额下限。

 

最后,我们限制只有有管理员可以取款。

这个“功德香火链”的代码很少,一共也就 20 多行。

先看一下这个初始化的函数,它是一个构建函数。

 

在这里我们可以看到 msg.sender,这是当前创建该合约的人。

 

我们有 owner 这个变量,我们可以拿来存储管理员的地址。

 

构建函数做的事情就只是把 msg.sender 存储在 owner 这个变量。

接下来我们再来看看 donate 这个函数,也就是捐款的函数。

 

我们可以看到 require 断言,也就是如果我们想要调用函数的话必须需要满足的一些要求。

 

msg.value 则是用户打款的金额,我们要求必须大于千分之一个以太坊。

 

如果打款金额符合要求,智能合约就会记录一次 “阿弥陀佛保佑你” 的日志, 也就是 AmitabhaBlessYou 这个事件类型。


这个函数执行完毕,msg.value 的金额就会存入我们这个香火链的余额。

接下来我们再看看取款的这个函数。

 

刚刚在捐款的部分我们说过 msg.value 这个变量,只要大于千分之一个以太坊,就可以被计入功德簿。

 

这边的 withdraw 函数的功能就是把链上存储的钱转出给他人。

 

大家可以看到这边的 require 函数的要求,执行withdraw的必须是管理员,也就是方丈。

 

那如果合约中的资金不足怎么办呢,比如方丈要取2个以太坊但事实上合约中只有1个。如果合约的余额不足,owner.transfer 这边就会报错,合约的状态全部回滚。

 

也就是说这笔交易会被拒绝。

智能合约平台和传统的web服务有相似之处但也不尽相同。

 

比如web服务通常是由供应商提供服务器支持,有供应商买单来支付运算的费用,但是在EVM平台的话用户需要做的计算产生的费用都是由自己来买单,这也就是gas模型的概念,执行每一项操作都会产生成本。

 

另一点就是由用户掌握权限,比如以往我们使用支付宝转账,是由支付宝的服务器来判断是否允许进行该操作。

 

但在 EVM上,类似的权限是由用户自己在客户端上控制的。只要用户本人签名,在服务端验证之后即可执行。

 

性能上来说,区块链网路的每一个节点都是在重复运算,而且每一条数据都会在每一个节点上重复存储。虽然以太坊拥有20000多个全节点,但实际上它们做的事情是一样的,并没有任何性能的提升。

比起我们所熟悉的web服务平台,在中心化平台上做应用还是有很多的障碍。速度慢、成本高、易用性差、Transaction的生命周期复杂。

 

而且只能合约没有网络请求,无法通过 API 去调用一些数据。所有的数据必须是由用户递交上来的。

 

目前区块链是一个相对封闭的系统,很难去获取一些外部的数据。比如物流信息、地产信息等等。要构建链上和链下的关联非常困难。

 

另一点就在创建去中心化应用时,智能合约的代码无法更新的问题。一旦出现bug或其他问题,代码无法修改。

 

所以当你在设计去中心化应用的时候还是要谨慎地考虑清楚哪些内容需要去中心化哪些不需要。去中心化程度与信任之间的关系是很密切的。


3. 去中心化应用/智能合约/以太坊虚拟机全栈解读

我们一起来看看当用户在 DApp 的 UI 做了一个操作,后面会引发一连串的什么事情。

这里有个为 SimpleStore 的合约。它做的事情很简单,只有一个 set 方法,让我们去改变 value 这个存储变量的值。

我们可以比较一下 Web 2.0 和 Web 3.0 的架构有什么不一样,不同层做不同的事。

 

在前端,Web 2.0 就是 HTML5,在微信、浏览器或者手机端运行。在web 3.0中大家说的是 DApp。这里差别不到。

 

用户做一个操作,Web 2.0 的应用就会向后台发送请求做一些处理。在web 3.0上用户需要做的事情时在本地签名去创建 transaction,把它再递交给区块链让区块链去处理。

 

在 web 2.0大部分 API 使用了 JSON 编码,而在 web 3.0 传递给服务的数据格式是 ABI encoding。

 

数据递交给后端了,在 web 2.0中,我们使用的是服务器。而在 web 3.0 我们则是使用智能合约去实现商务逻辑。

 

服务层之下,web 2.0 就是对接 Linux 或者 Windows 这些操作系统,提供数据存储或者网路请求。web 3.0 的操作系统就是 EVM,除了执行业务逻辑,它还提供了一些金融的服务,比如转账,或者调用其他合约。

 

在最下层,在web 2.0 中数据一般是会存储在关联数据库中。而在web 3.0中数据会存储在 Merkle Tree 的数据结构。Merkle Tree 就像一个 Git 仓库。

我们展开看看前端要做的事情。

 

其实很简单,前端就是将链上的数据结构化,再展现给用户。它也可以有一些输入框让用户递交数据,传递到链子上。

 

但我们要看看普通 web 和 DApp 的纯客户端有何区别。

 

大家接触最多的可能是 coinbase 或者 binance 这些交易平台。虽然他们涉及区块链,但他们并不是真正意义的 DApps。这些平台控制着权限,用户并没有掌控权。用户必须相信这些平台不会作恶(或者被黑)。

 

 

DApp 更讲究的是让用户自己去控制权限和私钥。所有的授权由用户在本地签名。

我们看看 REMIX IDE,这是针对以太坊设计的一个可以用于代码编写的应用。

 

这里我们看到有一个 set 的按钮, 和相对应的输入栏。我在这里输入666再按下 set,它就会发送一个事务去调用智能合约,把它的变量修改成666。

按下按钮之后,RPC会递交这个事务。

 

我们这边可以看到的是 ETH_SENTRANSACTION 这个 RPC 请求.

 

它需要传两个参数,from 是从哪个账号发这个事务,data 就是我们具体需要传输的数据。

 

在 QTUM 上面相对应的 RPC 方法是 sendToContract, 基本是一样的概念。

在我们递交了RPC请求后,该请求就会被传播到整个点对点的网络上面。过一会儿事务会被网路接受,执行,并确认下来。

 

在这个界面可以看到刚刚我们 RPC 上传的这个事务。

 

这里关注一下Input Data,这是我们传入的数据。

我们再来了解一下智能合约的编码。

 

当我们传递数据给智能合约的时候,我们必须要以 ABI 编码的形式去格式化数据,智能合约才会知道要去处理。

 

事务传递上去的数据可以分成两个部分,前四个字符是它的方法选择器,后面是参数。

 

方法的名字和它参数的类型取一个 Hash,再取该前四个字节。

 

参数是 000...29a, 也就是之前传的 666,用 16 进位。

交易传递到网路上,矿工就会去处理。

 

处理这笔交易的节点会把合约的代码从链上读取并加载到EVM中进行执行,把事务的数据加载到合约的工作区域。

EVM不仅是个虚拟机,同时也是个操作系统,它能够执行一些高阶的服务。

 

我们这边可以看到智能合约会编译成EVM的字节码。这里面有很基本的加减乘除。但最关键的是最后面的 sstore的指令,它的效果是把 666 的这个数据存入区块链。

将EVM的字节码写成伪代码方便大家理解。

 

calldata 就是事务的数据,我们获取前四个字节,作为方法选择器。

 

接下来,我们要匹配方法选择器匹配上了要跳转到哪里去。在这个例子,如果匹配上了,会跳到 tag_4 去继续执行。

 

接下来会从 calldata 读取参数。

 

最后调用 sstore 把值存储到 0x0 这个位置。

sstore 这个指令就是写入数据库了。

 

以太坊的底层数据库很像Git的数据仓库。我们写入的书这个树结构的底层。只要数据修改,从子叶到根的路径的哈希全部都会变。

 

这个图里面的 TopHash 可以理解为数据库的版本号。我们只要知道数据变了,版本号一定会变,就够了。

数据库有变化,MerleTree 的版本号就会边。这个变动会被矿工写入到区块里面。这就是我们最终的目标。

 

今天关于智能合约的分享就到这里了。


活动视频:


关注Qtum量子链(qtumchain)公众号,回复关键字查阅Qtum量子链相关资料,以下是部分文档关键字


回复:‘白皮书’,查看《Qtum量子链白皮书,设计原理,实现方案,及应用》


回复:‘未来’,查看《Qtum量子链未来2年技术路线规划-简略版》


回复:‘指南’,查看《首篇Qtum量子链区块链开发指南系列面世》


回复:‘专访’,查看《Nasdaq专访Qtum:区块链会成为世界最大的信任服务商》


回复:‘文档’,查看英文版本《Qtum量子链实现文档》


回复:‘中文文档’,查看中文版本《Qtum量子链实现文档》




分享到:

相关文章