德甲

比原链首席架构师James比原链的虚拟机

2019-12-04 07:27:36来源:励志吧0次阅读

比原链首席架构师James:比原链的虚拟机、合约及开发

2018年11月17日,“2018比原链全球开发者大会”正式在杭州国际博览中心(G20会馆)开幕,这是杭州第一次由开源组织举办的技术型峰会,也是杭州被誉为区块链之城以来规模最大的一场区块链开发者大赛,100+开发团队历经4个月激烈厮杀,16支团队将在本次大会上展开最终角逐。

11月18日上午,比原链首席架构师James带来了题为“比原链的虚拟机、合约及开发”的演讲。

以下为现场速记,巴比特整理发布:

大家好,我今天在这里分享的话题是“PO智能合约”。什么是PO?PO其实就是面向过程式的编程。

首先我来介绍一下过程式编程。在现在的编程语言中,大多数是结构式编程,比如说C++、GO语言。你想做什么事情的时候,其实你是要对对象创建一个抽象的结构体,任何的func其实都是结构体上可调用的函数,以多结构体交互的模式完成复杂的功能。

过程式编程不一样,中间没有结构体的概念,过程式编程只有无数的func(函数),func可以在任何时间被调用,func可以被自身调用,也可以被别的func调用,以一个流程图的形式完成整套过程。过程式编程有经典的作品,比如说Liunx内核、git以及Apache HTTP服务器,其实都是基于过程式编程来完成的。

Equity是全新的智能合约。之前和很多开发者交流的时候,他们会问我很多问题,比如可不可以直接把以太坊的智能合约放到比原链上跑,或者我想把EOS某个功能在比原链上实现,怎么做?其实Equity有自己的独特特性,所以我今天通过表格的方式来阐述它的特性。

先说最底层的虚拟机。从最底层来说,大多的公链虚拟机都是基于堆栈的形式构成的。虽然不同虚拟机的OP不同,但是架构是相同的。所以回到之前的一个问题,如果你愿意创建一个编译器把以太坊的智能合约成比原链虚拟机的OP CODE,你可以把以太坊合约在比原链上跑,包括EOS合约的原理也是一样的。

第二个重点是合约语言。比原链是面向过程的合约语言,它的特点形成也跟BUTXO相关。我们知道面向过程没有一个结构体、没有一个对象,其实这是天然契合UTXO的模型,我们知道UTXO的特性是我不可能花一半,我只能销毁一个UTXO并且创建一或多个新的UTXO,其实这是一个过程流的模式。这跟以太坊完全不同,以太坊是账户模型,甚至你可以把以太坊账户理解成一个结构体,因为你的账单其实是结构体里的balance。

在上层来说,比原链想做的是资产上链,我们想把任何资产放到区块链上,然后用智能合约进行可信任的交易。比如说你的房产或者公司的股权,以太坊和我们要做的不同,他们想做的其实更像一个虚拟机运行各种合约。所以不同的需求导致了很多事情有差异。

我们为什么设计Equity,为什么我们选用过程式编程?这里有两点:一是安全;二是应用型。

从安全来说,去年Parity钱包被攻击,导致51.37万个ETH冻结。为什么被攻击Parity钱包代码安全,但问题在于它调用底层库,底层库被攻击,导致钱包毁掉。

在以太坊的世界中,其实每一个合约就像一个结构体,是一个指针,在别的合约调用它的时候,通过指针调用func。这里有两个例子,左边米色是比原链合约例子,右边粉色是以太坊上的例子。

比如我们有两个合约,第一个是金库,我们提供的功能是存钱、取钱、贷款,第二个是公司股权,股权可以转让、抵押或者解锁。因为这两个合约涉及到资产转移,所以对数学要求安全,做交易的时候要做易存易出的检测,所以假设我们都有一个数据库保证加减乘除是安全的。在以太坊的世界中,其实库是一个子合约,在金库合约和公司股权合约的时候,它其实是调用合约。如果合约被攻击了,合约毁掉就导致金库合约和公司股权合约崩掉也不能运行。这就是为什么Parity出问题的原因。

左边是Equity基于面向过程形式的合约展示形式,我们也有公司股权和金库两个合约,但是数学检查合约是作为这两个合约的子func存在,这代表了什么?从攻击角度来讲你不可能攻击func,原因是func相同的输入永远会产出相同的输出。而结构体因为内部数据改变,相同的输入会导致不同的输出。

所以说func是定性的,所以在Equity写合约的时候,如果你在合约写成的时候,你确定合约是安全可用的,以后就不会有外部因素让合约失效。

从应用来说。我们这么设计Equity,第一要天然契合UTXO模型特点。因为我们的账户模型很怪,账户要有balance,那在资产流入流出的时候我们要更新账单。但是UTXO其实是没有这个概念,UTXO的概念是什么?它的概念就是我花费了或者我没花费。所以虚拟机只能有两个状态:一个是true和false,就代表这个UTXO是否可以被解锁。也是通过这两个状态,可以保证多资产在原子级操作下可以进行交易。

什么意思?如果我有一万个BTM,我想换一个比特币,双方其实都想得到保障:我的确收到了我的钱,我才付出去。在面向对象的情况下,其实它是用func来保证的,但是Equity在虚拟机底层通过两个合约,都返回特性,再加上交易是原子级,保证任何情况下交易都能得到真正的互换,还不会说钱已经打给了A,但是A的钱没有过来的情况。

下面聊一下比原链上的进阶合约的开发。其实这也是平时跟大家交流时候会碰到的问题。

首先是自身锁。我看Equity上大多数应用只是涉及到一个合约,什么意思?比如说BB交易,我把一些资产锁在合约上,如果谁愿意跟我交易那就交易,其实合约只存在一个UTXO中,UTXO过去就解锁了。我怎么样能够做一些复杂的情况,比如我想众筹一万个BTM,这肯定不是通过一个人来做,可能是多方共同众筹。

在结构式编程上,因为结构体上有一个账单,我只要更新账单,就能更新合约总额。但过程式编程并没有账单概念,所以我们可以想另外的方法,那就是我们的合约可以有多种解锁方式,最普通的是两种:

第一,成功提供所有解锁条件,合约成功解锁;

第二,我没能解锁合约,资产锁在的原有UTXO不动;自身锁是第三种概念,我有一个条件,你可以解锁它,但是解锁之后的资产锁回相同的合约之中。

为了更好说明,我做了一个例子。这是公益众筹,众筹条件是我需要在指定条件(3天)内众筹1万个BTM,这样的众筹才是成功的。UTXO#1就是第一个众筹的参与者,他自己把3千个BTM锁到UTXO当中,以智能合约形式。

因为我们是流程图形式,所以这两个合约有两个解锁方面:

第一

,我到3天了,并没有募集足够的资金,原路退款;

第二,我是第二个人,我认为这个公益很有意思,我想参与进去,所以我从自己的账户中付出4000BTM,4000BTM同时解锁第一个UTXO#1,UTXO#1加上4千个BTM,同时锁到了UTXO#2中,那就是7千BTM。在UTXO#1智能合约中其实有一个检测制度,来保证UTXO#1解锁前必须要到锁到UTXO#2,不能锁其他的UTXO,不然的话其他人就会来攻击把钱拿走了。第三个人过来了,认为这件事情很有意义,他自己也出3000BTM成功创建UTXO#3,众筹完成。

众筹完成之后可以进行条件性解锁,比如说发给需要的人。当然在流程图中,其实UTXO#1、UTXO#2、UTXO#3都可以进行原路退款,如果达到时间、钱没有到账的情况下。

扩展性。如果在某种情况下,我的合约很复杂,怎么办?可能我的合约有一百万行代码,我不可能放在一个UTXO中,这实在太大了,因为我们知道区块体系有上限。代码上限达到,怎么办?这里可以利用pay-to-Script-hash的特性,其实就是比特币两种地址之一。比特币一种地址是Pay-to-Script-hash,即付给你的公钥的hash,第二是付给你一个智能合约的hash。如果你的合约特别大,你可以把它进行模块拆分化。模块拆分化,可能拆成一百个模块,每一个模块有hash。每一个模块之间的调用就是用hash调用,有兴趣可以会后交流。

第二个概念,平行互锁。一个UTXO只能锁定一种类型的资产,如果我想要做多种类型的资产,怎么办?比如我有20种资产,我要做互相锁定的交易,这时候就用平行互锁。平行互锁是什么意思?正常一个UTXO解锁的时候,我管我自己就可以了,但是平行互锁是说我知道有哪些智能合约跟我相关,如果我要解锁我自己,我不仅要满足自身解锁条件,并且要认证所有跟我相关的合约全部得到解锁并满足指定条件。其实并行互锁可能会涉及到很多的资产,我在这里做两个资产,让大家简单了解一下。

比如说借贷,我可能拿了公司10万股权去进行抵押贷款,有50万个BTM。规则是什么?我可以在任意时间偿还借贷。如果到时间我不偿还,公司当然有权利把我的股权拿走。这里面涉及到两个合约:

第一个UTXO,它其实是锁定你的股权,就是借贷方的抵押股权全部锁定在这里;

第二个UTXO,更多是还款合约,代表你还了多少钱。

这是怎么工作的?比如说我有一天说我手头比较宽裕,我愿意还30%3万股权的贷款,那么我自己就同时解锁两个UTXO。

UTXO#1就是要把15万BTM打到UTXO#4的账户里面,另外我自己要建立UTXO#3,就是把我的一部分股权解锁出来。互锁怎么锁?就是在UTXO#1和UTXO#2两个智能合约中,它们其实都会做一些检测,检测UTXO#1保证UTXO#4存在,UTXO#2要保证UTXO#3是存在的。通过这种互锁的方式,保证没有任何一方可以作弊,以这种形式存在。

由于今天时间比较紧,我把一些信息浓缩了。我们在明天会上线1.0.7的版本,解锁了更多Equity合约更强大的功能,欢迎大家使用开发,同时希望大家给我们提更多更好的意见,让我们做出更好的合约编译器服务你们,让你们通过更好的合约,让资产更好在比原链上流通。

宝宝不消化吃什么亚宝药业薏芽健脾凝胶小孩健脾的食物

宝宝晚上咳嗽白天不咳嗽怎么回事
小孩子脾胃虚弱吃什么药
小孩健脾吃什么
小孩儿不爱吃饭
分享到: