基於Baton UTXO和默克爾樹的Token和Oracle方案

2020-10-01 12:00:04

成都程式設計師zhangweis發表了一篇短文(Merkle tree proof based data storage)提出一種使用位元幣智慧合約來驗證資料狀態變化的方法。sCrypt做了總結。題目是BSV智慧合約中可延伸的狀態儲存(Scalable State Storage in BSV Smart Contracts)。

這種技術可以用於製作基於狀態變化的Token,以及預言機(Oracle)。資料狀態的正確性由位元幣網路做驗證。

之前 sCrypt有提出基於UTXO的Token方案

在這個UTP方案中,資料是儲存在每一個UTXO中的,狀態的變化就是UTXO被花費,進而生成新UTXO的過程,新資料儲存在新的UTXO之中。
在這裡插入圖片描述

zhangweis的新方案同UTP完全不同。其對狀態和資料進行分離,資料在鏈下(或者在鏈上)單獨儲存。而UTXO只進行狀態變化的驗證,並且儲存最新的狀態,注意:UTXO中只儲存狀態,而不儲存資料。

示意圖如下
在這裡插入圖片描述

右側是一個默克爾樹,樹葉是不同使用者的資料,比如包含使用者的公鑰和餘額。
左側是一連串的UTXO,一個Utxo花費之後會生成一個新的Utxo,這個過程就像接力棒(Baton)一樣。新的UTXO輸出裡儲存了右側資料的最新狀態,即右側資料的默克爾樹根。

在進行Token發行(issue),轉賬(transfer),銷燬(burn)等操作時,首先由錢包修改右側的資料,再解鎖Utxo,將操作的過程作為解鎖引數,生成新的Utxo。

比如創世交易首次發行。建立了一棵空的狀態樹(默克爾樹),然後新增了第一個葉子1A,發行100個Token給小李。經過多次發行之後有8個使用者的時候,狀態樹(默克爾樹)將分三層,葉子從3A到3H儲存8位元使用者的資料,持有不同數量的Token。這時3A的位置是小李的賬號。

假如3A小李給3C的小王轉30Token

3A Balance - 30
3C Balance + 30

橙色背景的葉子是資料修改部分,綠色背景的葉子和節點沒有變化,藍色節點是受到影響而改變的節點。將有顏色的資料和路徑,以及樹根作為UTXO解鎖引數。在解鎖過程中根據資料和路徑計算樹根是否正確。
如果正確無誤,解鎖成功,生成新的Baton UTXO,裡面儲存最新的樹根。

演示程式碼見:https://gist.github.com/zhangweis/f651b7e12acaa7171ab087888e116dc6

可以做如下思考
1, 因為每個合約Baton UTXO只有一個,如果是各個錢包分散發起轉賬操作,那麼並行性會存在問題。
解決辦法:由合約伺服器負責統一組裝協調。類似BIP270,由錢包發起轉賬請求,交易片段發給伺服器,伺服器排隊多個請求,順序傳送。

2,潛在的攻擊者可以偽造Baton UTXO,複製完全一樣Baton UTXO或者修改其儲存的Root狀態。
解決辦法:sCrypt提出的防止攻擊的方案, 是一個導致解鎖交易膨脹的方案,理論可行。再就是由第二層的錢包作出獨立驗證,因為只有一個單線的UTXO,非常容易識別偽造。

3,預言機(Oracle)。右側資料不僅僅是Token,還可以是離線的任何資料。只要事先制定好規則,就可以對預言機的資料做鏈上驗證。

4,資料可以在鏈下也可以在鏈上儲存。適合使用metanet協定儲存資料,因為metanet將所有歷史記錄,資料的各個狀態均儲存。

總之,這種技術基於Baton UTXO和默克爾樹的技術為Bitcoin SV上的代幣Token和預言機Oracle帶來新的重要的技術方案。

享受位元幣帶來的安全自由, 關注使用NoteSV