聊聊比特币BSV上的智能合约(一)

Thinking in BSV 专栏收录该内容
16 篇文章 0 订阅

聊聊比特币BSV上的智能合约(一)

之前的文章谈到过比特币UTXO模型上实现智能合约和以太坊智能合约的区别,没有读过的同学出门左转:

浅谈比特币UTXO模型和以太坊账户模型的优劣

那篇文章里提到,由于UTXO架构和账户制架构的根本性区别,基于比特币UTXO实现合约技术难度比较大,但是一旦实现性能秒杀以太坊。在Genesis升级之后,经过了近一年的发展,现在BSV也涌现出多套智能合约以及Token方案。这篇文章分享一下当前基于BitcoinSV的一些主要方案的实现方法,以及我个人对这些实现的一些想法。

目前基于BSV的智能合约,按照实现的方式大致可以分为如下几类:

  1. 纯二层合约
  2. 纯一层合约
  3. 一层+Oracle

同样,先说结论,我个人认为目前最具备落地前景的方案是一层+Oracle的实现方法,可以实现以太坊可以做的任何事,并且具备极高的性能,同样无需担心扩容的问题(当然也不能完全和以太坊划等号,我之后会解释它们之间的异同)。

纯二层合约(二层Client共识)

此类合约实现起来最为简单,本质上是将比特币区块链当作公共数据库,使用op_return之类的存储数据的方法将合约的状态保存在链上,然后使用特殊的客户端就可以识别和解析这种链上数据,在特殊客户端内重建出合约状态。这类合约的判断标准很简单:需不需要依赖一个全节点以外的客户端来识别和发送合约。

有很多耳熟能详的token方案都采用的是这种方式,例如BSV上的Tokenized,Run等,BCH上的SLP(simple ledger protocol),BTC上的Omni协议(USDT在BTC上的发行方式),以及各种染色币等方案。

这类合约的优点就是实现容易,灵活性大,因为任何程序(不只是智能合约)本质上就是数据+运算,区块链承担了数据硬盘的功能,而二层客户端承担运算以及达成共识的功能。因此此类合约是图灵完备的,可以执行任意复杂的运算。

但是这类合约的缺点非常明显:

  1. 需要达成二层共识。所谓二层共识,就是说整个网络达成一致的状态并不是靠矿工和算力来保障的,而是运行在外部的特殊客户端来维持的,比特币节点和矿工无法识别这类合约的真伪,在矿工看来这类交易和普通交易没有任何区别,统统可以接受,这也就意味着巨大的灵活性(换句话说就是熵值大)。并且因为灵活性太大,需要在OP_RETURN中约定的内容很多规则,而OP_RETURN本身是可以写入任意数据的,外部攻击者的自由度也大,更新版本出错导致污染合约数据的可能性也大,因此维护此类合约共识(高熵系统保持稳定)的难度非常大。
  2. 要引入这类合约,就必须安装客户端,而这个客户端只能由官方进行维护(如果不同的组织维护客户端,很容易因为理念分歧或者代码bug无法达成规则一致的状态),这就引入了中心化风险,如果官方维护的版本出现bug或者官方作恶等情况发生,没有人有能力阻止这类事情的发生。
  3. 二层共识在推广上相对困难,同样因为灵活性大,竞争方案很多,除非拥有绝对的市场垄断,否则说服别人安装和运用这类方案。

纯一层合约(完全基于UTXO的合约)

纯一层合约是另一个极端,就是把所有的合约状态保存在一个或多个utxo中,使用比特币的原生脚本来编写锁定代码和解锁代码,然后通过达成解锁旧utxo的条件,创建新的utxo来改变合约状态。合约的解锁条件就是代码,而解锁脚本就是参数。合约状态的转移是由矿工进行校验,由算力进行保障,换句话说,这就是最纯粹的比特币合约,大家都在追求的基于utxo的终极合约就是这种形态。

注意这里的表述,合约的状态可能由一个utxo表示或一批utxo共同构成(对比以太坊,一个合约的状态只有一个合约地址来构成)。在批量utxo共同组成状态的情况下,一批utxo中的任意一个发生变动,都可以改变整体合约的状态,而这一批中的utxo的变动可以同时发生,互相之间不影响,这就带来了巨大的并发性能。

这里举一个简单的例子来说明上面的论述,以太坊合约的状态就是数轴上x=0的一个点,这个点可以沿着y轴任意上下跳动,纵坐标的y值代表合约的状态。我们规定这个点一秒只能改变一个状态(比如说+1,+3,-5,-10等等变换),也就是只能变换一次y值,合约的状态由y值唯一确定。因此,在以太坊的场景下,变换状态必须一个一个地进行,顺序对状态很重要。

而对于utxo合约来说,合约的状态由x=0,x=1,x=2…x=1000这1000个点共同组成。同样的,每个点只能变换y值,并且一个点一秒只能变换一个状态,但是每个点之间互相独立,也就是一秒钟每个点都可以产生一次变化。整个合约的状态由这1000个点共同组成,这个共同状态其实不难理解,就是一个波(离散波,x越多波形越明显)。这个波表示了utxo大合约的状态(相对应的以太坊是个点),这个波虽然每秒都在变动,但是状态是可以唯一确定的。如果每一个点的变动代表一个utxo的转账,那么1秒钟就可以执行1000次转账。

这种由一个个小状态共同组成大状态的现象在自然界中数不胜数,声波由一个个空气分子振动的状态组成,一个个细胞的状态组成器官状态(心脏跳动其实是每一个心肌细胞独立运作的共同结果),一个脑细胞只会发送电脉冲,而数以亿计的脑细胞可以组成高等的智能,市场中每一个独立个体都自己做决定,然后居然形成了价格以及推动市场运转的无形的手。了解康威生命游戏的同学可以去看看,一些简单的小规则组成的一个个小方块最后能形成怎样的宏大却有规则的状态。这才是真·分布式应该有的样子。

典型的纯一层合约其实大家都了解,我们常用的比特币收款地址(P2PKH),多重签名地址,包括以前的P2SH从广义上来讲都是纯一层智能合约。

BitcoinSV在Genesis之后,解锁了比特币原始的操作码,让比特币脚本具备了图灵完备性。很多人以为到这里为止,比特币的脚本就无所不能了。从某种角度上说,是的,在转移本币(也就是代币bsv)的可编程性上,确实是无所不能,可以设置各种各样的条件来锁定和解锁脚本,但这里的大前提就是“操作BSV”。

但是如果要实现本币之外的编程,目前纯一层还无能为力,下面解释一下困难到底在哪。

假设我们想在bsv上发行一个代币X,想要借助utxo的高并发性,就需要让我们的代币以utxo(比如一个1000satoshi的锁定脚本)的形式存在。我们需要在utxo的锁定脚本中进行编码,将脚本中置入独特的逻辑和标志(比如说置入这个utxo代表什么代币,代币数量多少,代币属于谁,怎么才能花等等信息),我们将拥有这个特殊utxo的人视为拥有代币X,而转移这个特殊utxo,就视为转移代币X。乍一看很像染色币,但是这里有个很大的区别,就是这些逻辑和标志是由比特币脚本编写的,也就是说矿工会识别并且执行这个脚本。

这样确实是可行的,比特币多大的并发量,这个代币X就拥有多大的并发量。

但是刚才的表述忽视了一个问题,就是这个X可以造假。

因为utxo的脚本可以由任何人生成,而且脚本本身无法识别自己是真还是假,单纯依靠utxo脚本的内容无法看出这个utxo能不能代表代币X。一个伪造的utxo属于合法的bsv,但是不属于合法的代币X,代币X其实缩小的utxo的范围,伪造的代币就是范围之外的。

为了解决这个伪造问题,我们之前设想了几种方案,但是都不理想:

  1. 采用外部client来筛选伪造,这个方案根据我们刚才的描述,其实就是layer2共识的方案
  2. 花费代币和校验代币之前,沿着utxo的链条追根溯源到创世交易,如果属于正确的交易就是真币,如果不属于,就是假币。但是这个方案因为每次都要追溯交易,钱包会越用负担越重,越用越难用(使用地越多,需要追溯的链条就越长),无法扩容。
  3. 将代币utxo的祖先utxo信息也存入到utxo脚本中,这样可以在校验utxo的时候,连祖先也一并校验了,随着信用传递,最新的utxo一定是真的,不需要再溯源了。这样其实是一个递归累加,utxo2中包括utxo1的数据,utxo3中包括utxo1与utxo2的数据,utxo4包括utxo1+utxo2+utxo3的数据,以此类推,每个最新utxo脚本其实涵盖了所有的祖先的信息。交易体积会越用越大,最后无法使用,这个问题又称为交易膨胀问题。

除了代币伪造,还有一个问题纯一层合约解决不了,那就是同一个交易中的utxo如何识别其他的utxo的问题,也称为代币感应或者代币发现问题。

在以太坊的defi中经常有这样的场景,tokenX和tokenY进行原子交换,用一定数量的X换一定数量的Y,交换的过程由区块链保证完成,要么交易成功,要么交易失败(gas不够之类的原因导致)。这个场景比特币脚本也可以实现,实现的方法如下:

input中放入tokenX(属于A)的解锁脚本,同时放入tokenY(属于B)的解锁脚本,output中放入等量的tokenX(属于B)和等量的tokenY(属于A)。

同样一笔交易就可以完成这个交换,但是这里有个问题,同样位于input中的tokenX无法识别tokenY是不是真的Y,如果恶意攻击者伪造一个Y来交换X,那么A就要损失财产。

代币伪造问题和代币感应问题的本质,是因为仅仅依靠utxo锁定脚本本身,是无法获知锁定脚本之外的数据的真实性的。目前的比特币交易签名格式(BIP143)以及基于这个的scrypt的PUSH_TX操作码无法支持检验外部数据,除非升级签名格式,但是升级签名会影响已有的交易格式的校验,共识上不兼容,也不符合bsv set in stone的理念。因为这样的原因,我们跟其他开发团队经过深入交流后的一致结论就是纯一层代币目前还无法实现。

那么有没有方法可以绕过这个限制,并且还能利用utxo的高并发性,以及由矿工保证共识的低熵特性呢?

这就要引出我们的一层+oracle方案了。

限于篇幅问题,这里挖个坑,oracle的实现方案和特点下一篇文章介绍。如果这篇文章对你有启发或者有参考价值,欢迎打赏BSV到这个地址,鼓励作者继续创作:1JPcKTX1a8JBjsjNKvY1BmaSNcmCmZVHmo。

在这里插入图片描述

  • 0
    点赞
  • 4
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 4 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

区块链旺仔

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值