January 26, 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 …

Bitcoin atm at sfu vancouver

Bitcoin ATM at SFU Vancouver

bitcoin ATM at SFU VancouverMark McLaughlin, Executive Director, Ancillary ServicesBy SFU – University Communications on 2015-05-27 12:05:55[wpr5_ebay kw=”bitcoin” num=”1″ ebcat=”” cid=”5338043562″ lang=”en-US” country=”0″ sort=”bestmatch”]