April 19, 2026

Capitalizations Index – B ∞/21M

tZero STO交易合約架構解析 – Anton Cheng – Medium

tZero STO交易合約架構解析 – Anton Cheng – Medium

在進入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如下:

t0ken.sol

所以我們可以看出,其實在這一層的代幣合約中,其實是把「能否進行交易」這個動作交給另一個合約來處理。這麼分拆合約功能做有什麼好處呢?我想一個最簡單的原因就是為了「合約升級」。

我們都知道ETH中,一個地址的合約內容是不可更改的,意味著一個合約若有所漏洞,就必須重新部署一個新的合約來取代它。但ERC20 Token Contract這個合約中(代幣合約),儲存了每個用戶的餘額資訊(balances),若是每當整個合約系統中有一個小小漏洞或是想要進行升級,就要連同代幣合約一起重新部署的話,不但使用者方要不斷更動代幣合約地址,連許多麻煩的轉帳或餘額資訊都會消失不見,這並非大家所樂見的。所以利用「分割合約」的方式,能確保「代幣合約」這個最外層會與使用者接觸的介面保持不變,唯一會變動的只有compliance等「後台合約」。

Compliance

Compliance合約是整個系統的核心,其中對外最重要的接口就是提供給代幣合約呼叫的canTransfer,確認這筆交易是否「合法」。在Compliance的審核過程中主要會有兩個階段,分別是確認白名單,以及確認交易規則(Rules)。

T0kenCompliance.sol

我們可以看到canTransfer裡面會先呼叫 getUnfrozenKind,來確定地址是否被凍結、以及他們的權限等級,這就是所謂的「確認白名單」流程。而getUnfrozenKind這個函式實際上則是去Storage合約裡面拿取用戶資訊 (storage.accountGet )。

第二個步驟則是checkRules(),會去檢查一個或多個rule contract

T0kenCompliance.sol

所以現在看來,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.sol

也就是說Storage這個鏈上的大資料庫,只有被授權的地址可以進行寫入。如果我們上tZero註冊成功經過身份驗證,它們就會將我們的地址寫入這個合約裡,這樣才能進行證券型代幣的交易。當然tZero也有可能未來跟其他公司合作,就可以透過grantPermission這個函式,來授權其它驗證機構寫入合法的投資者等等,這是我們可以從這裡觀察出的合約設計上的彈性。

不過實際上tZero目前並不是直接用一般的address來進行資料的寫入,他們設計透過了一層合約來完成這件事情,分別是InvestorsBroker-dealersCustodians三個合約,用來新增三種不同身份的人到Storage中。我們就以Broker Dealer為例:

BrokerDealerRegistry.sol

可以看出就是透過這層合約,限制了「那種身份的人有權新增哪種身份的人」。若一個人是Custodian,則他就有權寫入BrokerDealer的資訊到Storage中,並且在寫入完成後都會觸發Event。

這麼一來,在這一層會擋下所有沒有資格寫入的請求,並且把emit Event的動作獨立於Storage Contract之外。這樣能使的Storage Contract更為單純,不需要處理Event,而剛剛提到的permission變數中就只需要記錄這些registry contract的寫入權限即可,對於其他地址來的寫入請求全部忽視。

把Storage變得單純是非常重要的一件事,因為它就像是代幣合約一樣,是所有人不希望出錯也不想要重新部署的合約。個人認為這樣的設計十分的巧妙,大家可以學起來。

Rules

講完了白名單,帳戶註冊的問題,我們的canTransfer流程中就只剩下最後的checkRules() 了。剛剛介紹過,checkRules中使用了一個迴圈,重複利用check函式確認所有相關的rules合約是否檢查通過。而究竟一個rule contract中的check是怎麼運作的呢?我們就找個例子來看看吧。

RestrictFromInvestor.sol

沒看錯,這是一個完整的合約內容。有沒有覺得很簡單也很直觀啊?裡面就只規定了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世界中在乎更多的是實名制而不是私鑰為上,不是嗎?

Singapore

剛好最近去了一趟新加坡,第一次踏上心目中「區塊鏈科技領頭羊」的土地,覺得那裡很美,附上一張圖片,期望台灣近期的立法順利完成,讓台灣的區塊鏈高手們能好好大顯身手,在這新技術的萌芽階段,為世界多貢獻一些心力吧。

Published at Sat, 06 Apr 2019 03:04:50 +0000

Previous Article

Endor Protocol Launches in a Bid to Democratize Access to AI

Next Article

April Dev Update & CSC Original Score – Crypto Space Commander – Medium

You might be interested in …

Cinderella trailer music ("aeon" by nick murray)

Cinderella Trailer Music (“Aeon” by Nick Murray)

Cinderella Trailer Music (“Aeon” by Nick Murray) Buy the song on iTunes: http://apple.co/1lbHZy2 Amazon mp3: http://amzn.to/1cM9rqN Spotify: http://spoti.fi/1pBnRTx Sheet Music: http://www.musicnotes.com/sheetmusic/mtd.asp?ppn=mn0147445 “Aeon” by Nick Murray ft. Juliet Lyons As featured in the trailer for Disney’s […]

Bitcoin long term bull

Bitcoin Long Term Bull

bitcoin Long Term Bull EN English (UK) EN English (IN) DE Deutsch FR Français ES Español IT Italiano PL Polski SV Svenska TR Türkçe RU Русский PT Português ID Bahasa Indonesia MS Bahasa Melayu TH […]