LOUD:比原链开发者大会 | 比原链首席架构师James:比原链的虚拟机、合约及开发_LOUD价格

点击蓝字关注比原链公众号

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

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

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

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

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

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

JEX发布周ETH欧式期权0524行权公告:JEX发布周ETH欧式期权0524行权公告,周ETH看涨0524期权,行权价格为 698.8900 USDT。 最终履约价格为 598.3396 USDT,小于行权价格,每张合约到期行权收益为 0。

周ETH看跌0524期权,行权价格为 698.8900 USDT。 最终履约价格为 598.3396 USDT,,小于行权价格,可以行权,每张合约到期行权收益为 1.005503 USDT。[2018/5/24]

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

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

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

JEX发布周BTC欧式期权0523行权公告:JEX发布周BTC欧式期权0523行权公告,周BTC看涨0523期权,行权价格为 8218.1900 USDT。 最终履约价格为 7879.5115 USDT,小于行权价格,每张合约到期行权收益为 0。 周BTC看跌0523期权,行权价格为 8218.1900 USDT。 最终履约价格为 7879.5115 USDT,小于行权价格,可以行权,每张合约到期行权收益为 0.3386785 USDT。[2018/5/23]

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

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

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

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

JEX发布周BTC期权0425合约到期行权的公告:JEX发布公告称,按照周BTC看涨期权0425合约规定,该合约的行权价格为8109.9900USDT。最终市场产生的履约价格为9425.4969 USDT,大于行权价格,可以行权。周BTC看涨期权0425,每张合约到期行权收益为1.3155 USDT。按照周BTC看跌期权0425合约规定,该合约的行权价格为8109.99USDT。最终市场产生的履约价格为6833.4385 USDT,大于行权价格。周BTC看跌期权0425,每张合约到期行权收益为0。[2018/4/25]

比如我们有两个合约,第一个是金库,我们提供的功能是存钱、取钱、贷款,第二个是公司股权,股权可以转让、抵押或者解锁。因为这两个合约涉及到资产转移,所以对数学要求安全,做交易的时候要做易存易出的检测,所以假设我们都有一个数据库保证加减乘除是安全的。在以太坊的世界中,其实库是一个子合约,在金库合约和公司股权合约的时候,它其实是调用合约。如果合约被攻击了,合约毁掉就导致金库合约和公司股权合约崩掉也不能运行。这就是为什么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不动;自身锁是第三种概念,我有一个条件,你可以解锁它,但是解锁之后的资产锁回相同的合约之中。

为了更好说明,我做了一个例子。这是公益众筹,众筹条件是我需要在指定条件内众筹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合约更强大的功能,欢迎大家使用开发,同时希望大家给我们提更多更好的意见,让我们做出更好的合约编译器服务你们,让你们通过更好的合约,让资产更好在比原链上流通。谢谢大家,这是我今天的演讲。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

大币网

[0:0ms0-3:308ms