通过前面三篇科普文章《RGB++科普:RGB & RGB++是什么?》,《RGB,RGB+,UTXO stack,Nervos, CKB 之间的关系》,以及《通俗理解UTXO和比特币交易》,我们能够大致了解RGB是一个什么样的协议。
本文将要了解的内容包括RGB的设计原理,这样设计的背后有什么样的思考,它跟现有的类似方案进行对比具有哪些优缺点,存在哪些难以解决的问题,以及RGB++是从什么样的角度入手来解决RGB存在的问题。
所以本文的内容主要包括
第一、RGB协议的原理;
第二、RGB设计背后的思想基础;
第三、RGB跟现有类似方案对比具有哪些优缺点;
第四、RGB存在哪些难以解决的问题;
第五、RGB++解决RGB难题的思路和角度。
下面进入正文
主题1. RGB协议原理总结
RGB协议的原理是以链上痕迹最小化的方案实现对比特币网络的扩展,根据比特币链上资源紧张,计算能力差,不能验证非比特币交易的特性,RGB都做了针对性的设计。
具体来说有这样一些设计
1)定义了交易RGB的转账和交易就是智能合约状态的转换。
比如一笔转账的结果是装有10块钱的UTXO1被花了,变成装了6块钱的UTXO2和装了4块钱的UTXO3;这个过程就是合约从状态1转换到状态2,其中合约1的状态是10块钱所有权在UTXO1里面;合约2的状态是6块钱在UTXO2里面,4块钱在UTXO3里面。UTXO里面的资金金额和位置发生了变化,实质是这10块钱的所有权发生了变化。
因此RGB的智能合约表达的就是资产的所有权发生了什么的变化,以及目前所处的状态。
2)设计了RGB协议的智能合约
合约构成分为三个部分,包括合约的起始状态,最新状态(或者当前状态)以及状态转换。起始状态定义了合约的基本属性和规则,当前状态定义的是合约最新的状态,状态转换定义的就是状态之间的转换规则。
3)把交易的过程做了拆分
并按照耗费比特币链上资源多少,在链上留下痕迹多少进行分类。把其中最复杂,最耗费资源的部分都放在链下处理,比如交易的构建,数据的计算,交易历史和状态的验证,交易的确认等等,让这些过程在P2P即点对点的场景下,通过客户端来完成;
剩下交易结算这个环节,此外还有一个环节,是在链下处理完并促使交易或者合约状态发生了转换的过程和步骤等信息,需要留下一个证据或者承诺,避免交易任何一方修改这些交易信息或者数据,这个证据就是把这些数据计算出哈希值。
RGB把这两个环节放到一起来处理,因为交易结算需要发起一笔比特币链上的交易,而链下交易处理过程的证据也需要保存到链上,因此它就把这个哈希值形式(确切的说是一个哈希树,我们就以哈希值来理解)的证据或承诺写进了这一笔交易的输出里面。这是一个特殊的输出,叫做OP_RETURN,OP_RETURN是一个无法花费的输出,因此不能叫做UTXO,它在这里的用途只是用来保存RGB链下交易的承诺或者证据。
4)一次性密封和客户端验证的独特设计
一次性密封解决了资产所有权不能被转移两次,即资产不能双花的问题;
为了实现由比特币UTXO来触发或者控制RGB资产转移的目的,RGB设计了在比特币UTXO里面封装RGB资产所有权的方案,采取的手段是将RGB链下交易的每一个UTXO都锚定到一个比特币链上的UTXO,即在RGB UTXO的锁定脚本中,将花费条件设定成指定的比特币UTXO。
这个设定决定了这笔RGB资产的解锁只有一个途径:必须使用指定的比特币UTXO经过密码学计算获得的值,与锁定脚本里面的值进行对比,如果匹配这笔资产就能解锁,不匹配则无法花费这笔资产。这个设计叫做一次性密封,意思是比特币的UTXO里面密封了RGB资产的所有权,由UTXO只能花费一次的特性保障了RGB资产不能被双花。
客户端验证解决了转移资产的交易有效性验证问题。
但是比特币链上的交易,通过花费一笔比特币的UTXO只能触发链下的RGB资产转移,却无法保证这笔RGB转账交易一定是有效的,比如转账金额是否正确,资金所有权是否真属于付款人,有没有伪造资金等等,因为比特币链上的交易没有验证非比特币交易的能力。为了实现这个目的RGB设计了客户端验证的方案。
客户端验证可行性的依据是比特币的UTXO记账模型,这个模型中资产都包含在UTXO里面,因此要验证一笔资产的当前状态也就是它的可用金额和所有权归属,只需要计算和验证跟这笔UTXO来源相关的所有UTXO。
又因为比特币记账模型中,每一个UTXO里面的金额实际上都有记录来源和去向,从哪个交易的哪个输入中来,又去到了哪个交易的哪几个输出,因此只要顺着这个UTXO的来源一直往前追溯到铸币交易中,把有关系的UTXO进出金额分别进行累加,然后再相减得到的差就是当前UTXO的金额,或者这笔资产的状态。
因此要验证一笔RGB资产的状态需要验证两个部分,一个是比特币链上的交易,一个是RGB链下的交易。
比特币链上验证的内容包含这样三个部分:所有跟这笔交易相关的交易,交易所在区块头的默克尔证据,以及这些交易记录的RGB交易承诺;RGB客户端只需要验证前面两个以及当前的这笔交易。
验证的时候用户可以使用比特币的轻客户端验证比特币交易的部分,使用RGB协议的客户端验证RGB交易的部分。
5)自主验证的信任基础
这其中,智能合约中代码和逻辑的执行,交易的计算,交易签名和所有权的验证,都可以由用户自主完成。这种自主验证可靠的信任假设,第一是比特币轻客户端信任比特币链上的交易都是有效的,第二,在RGB客户端,用户相信自己自己计算过一遍的交易结果。以上是RGB协议运行的基本原理。
主题2. RGB提出的背景
RGB这个方案的核心理念是尽可能的减少对比特币主链的使用,只有在非用不可的情况下才会发起比特币链上的交易,或者向比特币区块内写入数据。
所以它对比特币链的使用就两个目的:通过花费UTXO触发RGB的交易并转移RGB资产所有权;把这笔交易的承诺写入到比特币链上。它把这两个目的合在一起只用了一笔比特币交易实现,只在一个交易输出里面写入了一个数据。
为什么RGB会有这样的一种设计理念,当时的背景是怎样的呢?
以下对RGB背景介绍的这部分内容来自BTCStudy阿剑老师的一次播客:
RGB基础的基础概念是客户端验证和一次性密封,这两个概念是在2016年由Peter Todd在一篇论文里面提出来的。这件事其实也与Vatalik有关,因为当时他是比特币杂志的记者,他对早期在比特币链上发行资产的一些协议,包括OnmiLayer,counterparty 以及其他的类似协议都做了一些研究,然后得出一个结论:如果我们想要让比特币的用户使用一些另类资产,采用比特币本身的脚本是没法办到的,因此只能使用额外的协议来发行这些资产。他的下一步计划就是创建一个在链上可以发行任意代币的协议,于是他就创建了以太坊。
那时也有另外一些人,他们也知道Vatalik的想法是对的,因为他们也很了解这些在比特币链上发行资产的早期协议。但是他们的想法则不一样:如果比特币的用户想要去使用一些其他功能,难到真的要在比特币链上去做这件事,一定要在比特币链上去写入数据,或者给它增加一些功能,让比特币本身去发行资产吗?
实际上所有这些功能的核心就是要在比特币的脚本里面塞入更多的数据然后让它去解读这些数据的含义,如果一定要在主网上去做这些事情的话,那就是每一个节点都要去解读并且验证你塞入的数据。他们认为这件事情是不成立的,也不应该这么做。
Peter Todd 甚至还有一个更加激进的观点,他说矿工其实根本都不需要知道一笔交易里面到底是什么,如果他知道了,就会有交易被矿工审查的可能性。所以矿工需要做的就是去挖矿就行了,而不应该对交易施加任何的干涉。
RGB就是在这个思想的基础之上产生的。
主题3. RGB方案与现有方案的对比
第一、跟铭文协议进行对比
1)在实现方式上
铭文是把一笔资产的信息,比如协议名称,操作指令,资产名称,交易数量等封装在一个文件里面,然后通过发起一笔比特币交易,把这些数据记录到交易脚本的某个字段,比如BRC20/ORC20/ARC20是记录在交易输入的隔离见证字段,SRC20是记录在交易输出即UTXO的多签地址里面,Runes 符文是记录在OP_RETURN的特殊输出里面。我根据比特币交易的数据记录做了一张表,见下图。