Tzero STO交易合约架构解析

Security Token

Security Token(证券型代币)的话题这几个月来在币圈很夯,除了链上协议方面ETH社群讨论度极高的ERC1400 Protocol家族以外,链下的部分,各国政府也都在积极的立法,透过合法化达到区块链与金融界真正的整合。在这个探索性的阶段,研究一些早期就有勇气作为白老鼠的实作方案,有助于我们了解成就真正制定协定会遇到哪些困难,除此之外,对于Solidity合约架构的设计,也可以从中学到许多经验。

今天我们就来跟风一波,看看目前STO龙头tZero平台,是如何使用智能合约实现第一个合法的证券代币(Security Token)交易平台。

证券型代币的特性

在进入tZero的架构解析之前,我们要先理解,证券型代币相较于传统的ERC20代币有什么不同,以及为什么要有所区隔。

说直接一点,ERC20代币是不合法律规定的,它只是Ethereum上面对于代币的一个统一协定罢了。之前泡沫严重的ICO风潮就是大家滥发ERC20 Token作为募资手段的实例。对于投资者而言,基本上ICO的投资不会有任何保障,但相对的这完全符合去中心化的思想,你的隐私受到完全保护,没有人知道也不需要知道每一个投资者(或代币使用者)是谁。

而Security Token呢,是希望将证券上链,这些上链的Token就会如同一张股票一样,交易、流通所有过程都会受到严格监管。为什么会要这么做呢?因为在ICO热浪中我们就发现,许多公司试图做的就是透过发行ERC20 Token作为公司股份,这俨然就是现在金融市场中的证券了。这些金融商品在金融市场中需要被监管,怎么可以随便换个名目就到链上拿来诈骗了呢?

说了这么多,最重要的就是「监管」二字。ERC20 Token的合约中,transfer这个函数做的就是把合约中一个地址的余额提高,一个地址的余额减少,除了余额外不会对两个地址有其他检查。而在Security Token的合约中,transfer就多了一个步骤去run一个叫做canTransfer的函式。这个函式就是整个ST合约中最精华的部分,它检查了两个地址双方是不是在所谓的「受监管白名单」中,如果这两个地址其一不在被具有交易资格,或是交易上限等等不符合规定的话,就会触发revert,直接终止合约。

所以,所谓证券型代币上链其实可以简化成两个部分:链上白名单的监管,以及其他交易规则的程式化(合约化)。

合约架构

接下来的部分,我们就来看看tZero的合约中如何实现这两点。以下所有的图片以及souce code都可以从tZero GitHub上面找到,有兴趣进一步了解的也可以在里面找到更多资讯喔。


从上图我们可以看得出来,整个tZero的系统由Registry, Compliance, ERC-20,以及Rules四大合约组成,并且是以Compliance为中心。我们就一一来介绍他们的作用以及彼此之间的互动关系。

ERC20

ERC20 Token Contract应该是大家最熟悉的智能合约模板了。我们可以由上方关系图中的箭头看出,ERC20唯一会互动的就是Compliance这个合约,而最经典的互动方式,也正是透过我们前面提到的canTransfer函示。

在Token中的transfer被触发时,会呼叫下面这个canTransfer,而它会再去询问compliance合约中的canTransfer。

所以我们可以看出,其实在这一层的代币合约中,其实是把「能否进行交易」这个动作交给另一个合约来处理。这么分拆合约功能做有什么好处呢?我想一个最简单的原因就是为了「合约升级」。

我们都知道ETH中,一个地址的合约内容是不可更改的,意味着一个合约若有所漏洞,就必须重新部署一个新的合约来取代它。但ERC20 Token Contract这个合约中(代币合约),储存了每个用户的余额资讯( balances),若是每当整个合约系统中有一个小小漏洞或是想要进行升级,就要连同代币合约一起重新部署的话,不但使用者方要不断更动代币合约地址,连许多麻烦的转帐或余额资讯都会消失不见,这并非大家所乐见的。所以利用「分割合约」的方式,能确保「代币合约」这个最外层会与使用者接触的介面保持不变,唯一会变动的只有compliance等「后台合约」。

Compliance

Compliance合约是整个系统的核心,其中对外最重要的接口就是提供给代币合约呼叫的canTransfer,确认这笔交易是否「合法」。在Compliance的审核过程中主要会有两个阶段,分别是确认白名单,以及确认交易规则(Rules)。

我们可以看到canTransfer里面会先呼叫getUnfrozenKind,来确定地址是否被冻结、以及他们的权限等级,这就是所谓的「确认白名单」流程。而getUnfrozenKind这个函式实际上则是去Storage合约里面拿取用户资讯( storage.accountGet )。

第二个步骤则是checkRules (),会去检查一个或多个rule contract。

所以现在看来​​,Compliance合约对于白名单的管理是不知情的,他只会由Storage中获取该地址的资讯,至于谁有权写入Storage,则是架构图中Registry的工作了。

另一方面,在Compliance合约中,也没有写入任何Rule的判断逻辑。它把这些危险的东西放到了许多rules合约中,并透过check来与他们一一沟通。如果每个rule contract都没有回复错误的话,就代表通过验证啰。

我们接这在分别来看Storage以及Rules合约。

Registry & Storage

这部分掌管了Storage合约的写入权。在整个架构下,Storage合约顾名思义就是一个很大的Database,每当对于一个地址的资讯、身份等级有所疑惑时,便可以利用AccountGet或是AccountFrozen等等介面来向Storage 询问。

我们可以先来简单看一下Storage Contract的内容,基本上就是容许权限的拥有者写入Storage中的accounts变数。至于permissions这个变数是怎么被创造出来的呢?其实也是透过grantPermission这个函式一层一层授权出来的。

也就是说Storage这个链上的大资料库,只有被授权的地址可以进行写入。如果我们上tZero注册成功经过身份验证,它们就会将我们的地址写入这个合约里,这样才能进行证券型代币的交易。当然tZero也有可能未来跟其他公司合作,就可以透过grantPermission这个函式,来授权其它验证机构写入合法的投资者等等,这是我们可以从这里观察出的合约设计上的弹性。

不过实际上tZero目前并不是直接用一般的address来进行资料的写入,他们设计透过了一层合约来完成这件事情,分别是Investors、Broker-dealers、Custodians三个合约,用来新增三种不同身份的人到Storage中。我们就以Broker Dealer为例:

可以看出就是透过这层合约,限制了「那种身份的人有权新增哪种身份的人」。若一个人是Custodian,则他就有权写入BrokerDealer的资讯到Storage中,并且在写入完成后都会触发Event。

这么一来,在这一层会挡下所有没有资格写入的请求,并且把emit Event的动作独立于Storage Contract之外。这样能使的Storage Contract更为单纯,不需要处理Event,而刚刚提到的permission变数中就只需要记录这些registry contract的写入权限即可,对于其他地址来的写入请求全部忽视。

把Storage变得单纯是非常重要的一件事,因为它就像是代币合约一样,是所有人不希望出错也不想要重新部署的合约。个人认为这样的设计十分的巧妙,大家可以学起来。

Rules

讲完了白名单,帐户注册的问题,我们的canTransfer流程中就只剩下最后的checkRules()了。刚刚介绍过,checkRules中使用了一个回圈,重复利用check函式确认所有相关的rules合约是否检查通过。而究竟一个rule contract中的check是怎么运作的呢?我们就找个例子来看看吧。

没看错,这是一个完整的合约内容。有没有觉得很简单也很直观啊?里面就只规定了toKind不能是INVESTOR kind,简单明了。

当然,一次checkRules可能会检查多个rule contracts,因为本来所谓的「交易限制」就是多个规范的组合,可能对发送者、接收者、金额都有不同的规范。这种利用多个彼此独立的rule contracts来组合不同交易限制的做法,也可以好好学起来呀。如果想要进一步看看tZero有哪些已经上链的rules的话,也可以直接到GitHub中这个列表来看看。

小结:STO与区块链

到这里就是我对tZero合约的简单Break down,在研究的过程中除了让我一探STO实作的究竟之外,更是很好的学习合约架构的经验。

不过我也相信许多人看完都会有一种感想,觉得好像被唬烂了,根本就不是很复杂的结构或是技巧,只是透过一个链上大DB,配合几个rule contract对于交易双方的身份做简单的if else确认而已。

不仅如此,这个系统基本上是「完全中心化」的,就如同ERC1400中规范的Controller,是允许一个中控地址强制转帐等等功能。如果是一个这么中心化的合约,以一个使用者的角度而言,中心化的注册管理代表尽管隐私资料不上链,仍已经像传统中心化伺服器一样出卖了自己的个资,并且失去了匿名性了,如此一来STO究竟还有什么吸引人的呢?

这个问题困扰了我一阵子,也让我一度没什么动力写这一篇关于STO的文章。不过随着看的东西多了一些,我也渐渐找到了许多论点说服自己,透过区块链结合证券代币这条路是很有发展空间的。

没错,这些合约会是完全中心化的:由监管单位认证个人身份后写入Storage、强制变更balances的能力代表了如果哪一天你弄丢了private key或是帐户被盗,都可以依循法律途径返还你的投资。这点与中心化的伺服器完全相同,唯一不同的点在于它的「透明化」。一个private key持有者在什么时间点做过什么事情一清二楚,而所有中控机构的强制操作也可以透过Event的方式让所有人监听。这是区块链的一大特性,尽管STO合约可以算是失去了去中心化,其透明化的特性依然存在。

除此之外就是他的方便性。以一个发行商的角度来看,或许跟一般的ERC20 Token Contract相比,大家会觉得STO十分的繁复,又要政府审核又要一堆有的没的。但若是想想传统一级市场IPO的流程,相较之下就简单很多了,对于进入募资市场这件事情成本相对较小,类似一个「募资平台」,把金流以及投资规则都公开透明的定义好了,对于募资方而言是省下了一大成本。

这带出了另一个重要的观点:尽管区块链可以达到去中心化、匿名性、绝对透明等等优点,并不代表一个应用需要符合全部的特性才可以使用区块链。虽然目前ERC1400的架构还有许多地方可以改进或是正在讨论中,但个人认为,既然中心化的身份验证已经不可避免,整条上链过程中最重要的部分便在于分离「中心化伺服器链下可做的事」以及「应该上链由合约做的事」。举个例子来说,若目标的使用客户已经不是熟悉区块链的使用者,那么对于私钥的保管其实也可以由中心化伺服器来进行备份或代管,毕竟STO世界中在乎更多的是实名制而不是私钥为上,不是吗?

刚好最近去了一趟新加坡,第一次踏上心目中「区块链科技领头羊」的土地,觉得那里很美,附上一张图片,期望台湾近期的立法顺利完成,让台湾的区块链高手们能好好大显身手,在这新技术的萌芽阶段,为世界多贡献一些心力吧。

本文链接地址:https://www.wwsww.cn/ico/2867.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读