基于刚才提到的通证系统和智能合约的要素,Tokenized就需要设计和实现这样一个系统。而实现方案,简单来说就是利用BSV区块链的各种优势,将token资产以及操作写入到比特币的交易中,并利用比特币的公私钥地址系统来进行鉴权(authentication)和授权(authorization),使用自动代理节点来执行智能合约的二层网络解决方案。
这里分析一下为什么要在bsv上做,以及为什么只能在BSV上做。首先是得益于基础设施的稳定性。bsv的核心思想就是稳定协议,要让基础设施像磐石一样稳定坚固。试想一个token系统,如果上面运行了大量的有真实社会的价值的合约和数字资产,经常频繁的更改协议是绝对不可取的,如果出现像这次bch硬分叉升级所遭遇的3小时网络瘫痪的问题,那造成的经济损失和信任损失是不可估量的。其次,需要POW来保证基础区块链的公平性。目前不存在比POW这种直接将电力能源转化成熵减(分布式系统达成一致的稳定态)的更为高效的方案,所有POS或者DPOS等变种要么有严重的中心化问题,要么不是免许可链,要么流动性堪忧。再次,由于大部分的token都是价值相对低廉的积分系统,因此在交易时的手续费低廉和清结算实效性上有更强的要求,像以太坊那样昂贵的gas费以及十几秒的确认时间对于微支付是及其不友好的,因此需要借助于小额支付的0确认稳定而可靠。最后,因为真实世界的token是一个非常巨大的市场,最终应用一旦普及,链上交易量一定会爆发,为了避免交易爆发导致的手续费暴涨,需要一个巨大容量(无上限)的区块链系统来容纳那么多的交易。满足上面条件并坚定地实施扩容路线的区块链系统只有bsv,其他的链不是太慢就是太小就是太贵就是太折腾。
Tokenized技术上的实现简单地讲,就是定义了一系列的概念和操作,并将数据置入交易的OP_RETURN的空间内,并使用一个或多个自动代理节点来运行智能合约,由这些代理节点执行智能合约的代码,并将结果发布到链上。所有的步骤和中间数据都是公开在比特币交易历史中可供校验的。这样的设计有很多好处,首先对底层区块链而言,没有额外的负担。矿工或比特币客户端不需要对这些交易进行特殊的计算,不像以太坊那样需要在虚拟机中执行代码,对他们来说,这些token合约交易只是普通的比特币交易,而且是微型交易,只需要按照比特币的交易确认流程来处理就可以,以后可以和比特币的交易一样进行并行交易校验,极大的提升处理性能(以太坊的机制很难实现并行校验)。其次,由于我们前文提到,token系统需要信任发行者,在tokenized的系统中,智能合约的执行节点由发行者或发行者所委托的机构来运行,执行节点也只运行和自己业务相关的智能合约,不需要消耗计算资源来运行其他人的合约,而普通用户则不需要运行执行节点,只需要运行可以构造token交易以及解析token交易的客户端钱包即可,并且由于历史记录可以公开查询,客户可以轻易发现token发行者作恶,这样一方面节省了运算资源,一方面可以将token世界和显示世界连接起来。再次,由于tokenized借助比特币的地址系统来进行身份认证和确权,因此天生集成了地址系统非对称加密的特性,可以使用签名机制来确保资产和相关操作不会被第三方伪造,同时私钥既保证了发行者的发行权,也保证了用户的持有权。
在系统地了解tokenized的设计之前,需要对里面的一些常用的概念,以及这些概念在区块链中的表现进行定义。
首先是合约(contract)。合约的含义是,预设了一些资产,给定一些条件和条款,对一些给定的操作进行运算和处理,并返回最终的处理结果。因此,tokenized的智能合约在设计的时候,考虑的内容和传统世界合约所考虑的内容是类似的,重点是条款和条件的约定,以及甲方乙方以及第三方监管等各种角色的分配,角色的任务和职责等。Tokenized支持两种类型的合约,静态合约和动态合约。静态合约就是那种不需要一个执行节点来执行运算并长期维护,在发布之后就可以独立工作的合约,比如保密协议,用户协议,现金欠条,雇佣合同等静态内容。而动态合约则需要发行方来运行维护执行节点,由各个参与人不断提供数据输入并由代码计算结果的合约,常见的如token,股权,票证,会员卡等合约。而此处的智能合约指代的就是动态合约。动态合约由发行者拟定合约内容(定义合约的各个方面,以及哪些内容可以修改),并向执行节点发送一个Offer合约的指令,并由执行节点返回一个合约构造(contract formation)的返回交易,才算创建合约成功。如果没有合约构造交易,则合约无效。另外,发行者也可以向执行节点发送修正案,修正案所可以修正的内容取决于合约的定义,如果合约中规定有些字段不可修改,则无法修改合约的这些字段。
权限标志(Authorization Flag),这个就是上文中提到的合约条款的一部分,归定了哪些字段是否可以被修改,哪些字段可以被谁修改等条款,此条款在合约或资产被创建的时候,随着Offer函数被定义好,之后就按照这个条款执行。
比特币交易(transaction)。Tokenized系统使用的是标准P2PKH(Pay to Public Key Hash,也就是我们常用的最简单的交易脚本格式)格式的交易。而token指令和数据被称为负载(payload),装载一笔交易最后一个输出的op_return中。注意,这里一个操作只能由一个交易完成,一个交易也只能表示一个操作。
操作(actions)。操作也可以理解为动作,就是负责将token的状态进行改变的一个过程。Tokenized使用一种称为请求与响应(request and response)的机制来执行动作(除了message和registry)。关于操作,这里有两个重要组件,Requester(请求者)和Responser(响应者)。所有希望执行操作的角色,包括用户和发行者以及监管者等作为请求者,而执行合约的节点作为响应者。所有动作必须发送给合约对应的地址,而这些动作是否合法以及是否能生效,取决于执行节点使用合约地址对外发送的响应,只有正确响应了的动作才合法,执行节点也可以根据各种条款或监管来拒绝这次操作。请求和响应各是一笔交易,请求的交易接收方为合约地址,而响应的交易发送方为合约地址。操作的类型有很多,包括但不限于发行合约,修改合约,静态合约,定义资产token,修改token,token转账和结算。
资产(token),资产token是一个用来指代现实世界的资产的一个数据模型。资产可以被一个或多个合约来进行操作,资产本身只是代表所有权,但是可以衍生为身份,投票权等等一切抽象资产。每一个token在链上都是唯一的,资产的定义,使用合约地址加一个AssetId(Asset ID = Asset Type + base58(Asset Code + checksum))来确保资产的唯一性。资产的本质是对现实生活中某项权益的等价替代物,如果token资产丧失,对应的现实中的权益也应该丧失。现在的Tokenized协议支持的资产包括:优惠券(Coupons),用户积分(Loyalty Points),会员卡(Membership),普通公司股(Common Share),票证(Admission Ticket),稳定币等法币(Currency)。
资产转移(transfer),区别于比特币交易,这是token那一层网络的概念,指的是token所有权的交换,将token转送给其他人。转移token或发送token,可以指定一个或多个接收者,转移了token就等同于转移了token所赋予的权利。另外token的转移要根据合约的条款来执行,比如token的转移需要支持身份验证kyc,支持反洗钱aml等等。Tokenized不止支持简单的token发送,还支持通过智能合约来进行token和比特币(bsv)的原子交换,token与token之间的原子交换等等功能。
预言机(oracle)。预言机或者叫做“神谕”,是一个将现实生活中的某个场景条件转换为数据,导入到区块链系统中,并用自己的签名来为其信用做背书的一个角色。比如一些赌博合约,需要依赖某场球赛的结果,或者依赖美国大选谁获胜,再比如一些依靠某地法律的合约,法律的某修正案是否通过会影响这个合约的状态和执行,这时就需要一个大家都信任的角色将这些真实世界的事件结果导入到区块链中。只要可以获得别人的信任,任何人都可以成为预言机,甚至可以通过提供信用背书来盈利,合约也可以引入外部的可信预言机来影响合约的执行。比如在token系统中常见的预言机有第三方kyc,第三方征信,第三方反洗钱系统等,都可以作为合约执行的某个条件之一。
注册表(register)。注册表也是一种操作,可以预先指定一个列表,然后合约在执行过程中会根据这个列表的结果进行决策,列表在合约启动之后可以自由增删改。常用的注册表有白名单,黑名单,可信任网站,可信任证书或敏感内容等等。
消息(message)。消息可以由一个地址发给另一个地址,作为聊天或者记录聊天的工具。同时消息也是执行节点在收到请求后返回处理结果的一个重要手段,根据不同的操作,对请求的地址返回操作结果,就是以成功消息或拒绝消息而存在的。
其他注意事项。
由于每一步操作以及其返回值都是一笔比特币交易(类似于以太坊收取gas费),所以操作都是付费bsv的。作为发行者或者执行节点,不用预留比特币来进行计算(与以太坊不同,以太坊的合约需要预留gas费用才能推动合约执行)。用户在发起请求的时候,所构造的交易必须预留足够用来返回的金额(返回时的矿工费)发送给合约执行节点,如果金额不足,则执行节点则不会返回结果,请求的操作也不会生效。这样的模式可以有效避免垃圾请求消耗掉节点预留的比特币,同时免除对合约计算步骤的计费(以太坊根据合约的计算类型收取不同的gas),因为合约执行节点的性能要强大很多。这样既降低了发行方的成本,也降低了使用方的成本。
另外,token操作交易一定是发往合约地址或者来自合约地址,这是为了保证使用比特币的address来进行权限认证。
一个操作只能用一笔交易来完成,同样一个交易也只能代表一个操作,这是为了保证操作的原子性(要么执行,要么不执行)。
action必须位于最后一个输出。
如果一个交易非法,并且没有正确设置资金返回地址,则资金和消息返回给管理员。
所有的资产转移操作必须明确资产的id,并且该资产是正确创建过的。
资产转移之前,必须要求拥有资产(即合约执行节点返回过资产转移成功的交易)。这一系列操作可以0确认完成,也可以链下构造再统一上链。
其他注意事项请参考官方文档:
Tokenized注意事项
关于更多的技术方面的细节,我以后会陆续写一些技术性的文档,说明如何搭建和构造节点,如何发币等等。