ERC-3475能否取代ERC-20?
為什麼寫這篇文章?
2021/04/05推出的 EIP-3475 終於在近期被通過成為 ERC-3475,相關新聞的出現令我好奇的去翻了他的 EIP 文件,原本只是想了解其運作模式以及開發動機,看一看覺得有點東西,寫成文章整理思緒順便跟讀者分享一下。
關於EIP, ERC 的差異曾在 ERC721A 這篇文章 介紹過,不熟的人可以去看看。
債券在傳統金融中的佔比大約為股票的三倍大,這麼重要的商品居然還沒在 DeFi中被廣泛運用,其原因可能是沒辦法進行“信用”評估,但現在 DID(去中心化數位身分)的快速發展,會不會讓它成為下一個機會點?
在介紹 ERC-3475 之前,來簡單說明一下債券是什麼,講得不深,金融大師請鞭小力點。
如果只是想瞭解ERC-3475的特色,請看這邊
現在市面上流動性高 token 幾乎都是 ERC-20,並沒有足夠多的功能來支持它做各種操作,許多開發者為了賦予這些 token 功能,會去寫智能合約,在沒有統一標準的情況下,容易被駭客攻擊,因此我們需要一個擁有更多功能的 token 標準來讓市面上的 token 更多玩法以及更加安全。
也因為如此,有個開發團隊就提出了 ERC-3475,它擁有以下特點
- 支援多個 token ID
- 可儲存鏈上metadata
- 沒有硬性規定 metadata 的資料結構
- 有經過 gas 優化
- 可以在第三方錢包或是交易所中讀取這些 token 的餘額以及贖回條件
- 這些債券可以被批量傳送(batch transaction),收到的人也可以把它分割後操作
進入正文…
一、何謂債券
一言以蔽之,債券是投資人借錢給政府或公司的憑證,通常債券的發行方(政府/公司)會跟投資人約定給付利息的方式與到期返還的金額。
其實債券跟定存很像,差別在於你放錢的地方從銀行變成政府/銀行/一般企業,而且債券的利率較高、可以在次級市場交易。
投資人承擔的風險
- 信用風險:如果發行機構信用變差,投資人會擔心該機構還不出本金,這時會紛紛出手賣出,該機構債券價格就會變低。
- 利率風險:如果市場利率高於債券票面利率,這時投資人會去投資市場,而不購買債券,債券價格就會下跌;反之如果市場利率低於債券票面利率,買債券反而賺錢,這時投資人會去投資債券,債券價格就會上漲。
債券通常需要明確記載
- 票面金額:發行機構於約定日支付投資人特定金額。
- 票面利率:投資人可以領取到的利息 。
- 付息期間:債券多久給付一次利息 。
- 到期期間:債券到期日期。
二、債券的信任成本
一直以來,債券都是金融行業的重要組成。然而,其低風險的特性也決定了只有政府、通過債券管理部門審查的公司才能發行,這部分是在降低風險以及建立信任。
在貸款過程中增加中間商和監管會導致高額費用,而且手續處理的時間可能達到幾週之久。簡而言之,高額的費用以及冗長的時間是這個機制的信任成本,使債券的發展受到極大的限制。
三、Web3解放中心化的債券發行
Web3 將邏輯寫在智能合約中,以強制交易者履行契約,不同產品也會有不同的共識機制認證不同身份的使用者所應執行的責任,使去中心化這種分散式的運作模式可以在一定程度上獲得保障。
既然 web3 的性質可能可以將信任成本降低,那麼,將債券這個香香的金融商品到 web3 好像就有那麼一點立場了,不過正如我們前面提到的,現在的ERC-20 所含的功能實在太少,怎麼說呢?我舉三個用 ERC-20 來做債券的缺點:
1.因為 ERC-20 本身只能定義九個最基本的資訊,債券的到期日、票面利率等等資訊無法寫入,因此要部署新的智能合約,增加負擔。
2.不同類型的債券必須寫出不同智能合約,而每個開發團隊寫的智能合約也會不同,多樣性太多就容易產生漏洞,若有不慎就會被駭,造成投資者血虧。
看看這幾個月被駭了多少 protocol,就算經過審計,照樣會被駭幾億美元。我愛羅的絕對防禦,也會被千鳥破防。
3.在送出交易時要花更多 gas fee。
講到這裡,讀者應該可以初步理解 ERC-3475 想達到什麼效果了,我也不賣關子
定義出一個可以儲存更多資訊的 token 標準,使 DeFi 的玩法更多樣化且更安全
小小的反思
以去中心化的方式去運作債券的模式雖然可以把信任成本降低,但回歸到債券的本質 ,其實還是存在一個盲點,那就是我們怎麼確保借款人會還錢?
如果沒有經過繁瑣的流程確保借款人的還款能力,那還能稱為避險嗎?對此我的看法是,web3 上的 P2P lending 可能還會需要一些時間來發展出計算信用的機制或是強制還款的方式,現在正夯的 DID 是否會是一個突破口?
話雖如此,但用這個模式來進行 B2C 募資,感覺是有搞頭的,我已經有個不錯的想法,有興趣的可以跟我討論一下。
telegram:@gregshen0925
email: [email protected]
回到 ERC-3475
建立一個多功能的 token 標準,降低被駭風險
他究竟有什麼好處?為什麼我在標題提到他可能取代 ERC-20?其實剛剛就提到過 ERC-20 所包含的功能與資訊不夠多,寫太多不同智能合約可能會有很多被駭的機會,不如直接統一 token 的標準,令其可以有多一點功能。
擴展了現有叫流行的 token 標準
ERC-3475 不但延伸了 ERC-20, ERC-721, ERC-1155,並額外增加了一些功能,除了將債券會用到的資訊、功能直接寫進這個 token 標準,也提供token更多的玩法。
ERC-3475特色
- 支援多個 token ID
- 可儲存鏈上metadata
- 沒有硬性規定 metadata 的資料結構
- 有經過 gas 優化
- 可以在第三方錢包或是交易所中讀取這些 token 的餘額以及贖回條件
- 這些債券可以被批量傳送(batch transaction),收到的人也可以把它分割後操作
四、ERC-3475 的 Interface
那麼 ERC-3475 具體是新增了什麼 function?又將什麼資料存在 token 資訊中?我把 interface 中比較特別的 function 幾個抓出來說明下。
transferFrom
function transferFrom(address _from, address _to, Transaction[] calldata _transactions) external;
將債券從 _from 傳給 _to,提到這個基本的 function 主要是想介紹 _transaction 是債券資訊,形式為['classId', 'nonceId', '_amountBonds']。
- classId:債券的種類代號
- nonceId:nonce 的 Id,這個 nonce 並不是我們熟知的 transaction 流水號,而是如下圖所示,其中 _values 又是一個用到 IERC3475.Values 結構的 mapping,真的包含很多資訊
- _amountBonds:債券數量
舉個例子
function transferFrom(address1, address2, [[1, 42, 500000000]]);
意思是從 address1 傳送 500000000 個債券類別 1 、nonceId 為 42 的債券到 address2
issue (發行)
function issue(address _to, Transaction[] calldata _transaction) external;
- 向 _to 發行 _transaction (債券資訊)
- 只有債券發行者可以調用 issue
redeem(贖回)
function redeem(address _from, Transaction[] calldata _transactions) external;
- 調用 redeem 的地址一定要是發行債券的地址
- 發行者會從 _from 贖回債券
- 開發時要記得設定讓 redeem 在債券到期時執行。
- 開發時要記得設定只能被銀行或是次級市場造市商調用。
burn(銷毀)
function burn(address _from, Transaction[] calldata _transactions) external;
- burn 只能被 controller 合約調用。
- _from 是要被 burn 掉的債券的持有者地址。
- 開發時要記得設定讓 burn 在債券到期時執行。
- 開發時要記得設定只能被銀行或是次級市場造市商調用。
可調用的Supply分四種
totalSupply
function totalSupply(uint256 classId, uint256 nonceId) external view returns (uint256);
當我們調用totalSupply,會回傳以下三種supply的值:
- redeemedSupply
- activeSupply
- burnedSupply
redeemedSupply(已贖回量)
function redeemedSupply(uint256 classId, uint256 nonceId) external view returns (uint256);
activeSupply(流通量)
function activeSupply(uint256 classId, uint256 nonceId) external view returns (uint256);
burnedSupply(已銷毀數量)
function burnedSupply(uint256 classId, uint256 nonceId) external view returns (uint256);
balanceOf
function balanceOf(address _account, uint256 _classId, uint256 _nonceId) external view returns (uint256);
回傳 _account 所持有的“債券種類為 _classId , nonceId為 _nonceId “的債券數量
Metadata分三種
這裡會比較複雜,這篇文章只講 Interface 及簡單概念!建議開發者要開發的時候去參考 ERC3475 實做的合約。
nonceMetadata
function nonceMetadata(uint256 classId, uint256 metadataId) external view returns (Metadata memory);
- 以 JSON 形式回傳 nonces 的 metadata
- metadata 必須遵守定義好的結構,如下圖所示
classMetadata
function classMetadata(uint256 metadataId) external view returns (Metadata memory);
- 以 JSON 形式回傳 classes 的 metadata
- metadata 必須遵守定義好的結構,如下圖所示
classValues
function classValues(uint256 classId, uint256 metadataId) external view returns (Values memory);
- 任何人都可以讀取不同債券類別的 Values
- 複習一下,classId 是債券種類的代號
- values 必須遵守在 class metadata 中定義好的不同 mapping 的結構
- 回傳 class metadata 中的 Values,例如[string, uint, address]
nonceValues
function nonceValues(uint256 classId, uint256 nonceId, uint256 metadataId) external view returns (Values memory);
- 任何人都可以讀取不同債券類別、nonceId 的 Values
- values 必須遵守在不同 mapping 中的metadata中所定義好的不同的結構
- 回傳 class metadata 中的 Values,例如[string, uint, address]
getProgress
function getProgress(uint256 classId, uint256 nonceId) external view returns (uint256 progressAchieved, uint256 progressRemaining);
- 回傳代表債券到期日的參數
- 贖回的條件必須被定義在一個或數個 internal function
- progressAchieved 可以用來定義債券目前的狀態,例如流動性百分比、時間等等
- progressRemaining 則是用來定義剩餘的時間等等資訊
以上就是 Interface 中比較需要提到的內容,至於細項、後續還能拿來做什麼應用,我想篇幅也比較長了,就留到下次再說吧!
在研究時覺得文件中有些參數容易混肴,在這邊也感謝D/Bond的core dev主動來看我文章並且給予支持!
參考資料
EIP-3475: Abstract Storage Bonds
EIP-3475/IERC3475.sol at main · Debond-Protocol/EIP-3475
投資工具介紹|什麼是債券? | 永豐ibrAin | 永豐銀行