最近BCH社羣在討論發token的事,其中omni協議是一個成熟的方案,在BTC上早就實現的,DT/USDT就是使用omni協議實現的代幣。本文通俗講解omni的基本原理。
第1章 BCH交易中OP_Return資訊的基本原理
一筆比特幣交易是一個含有輸入值和輸出值的資料結構,該資料結構植入了將一筆資金從初始點(輸入值)轉移至目標地址(輸出值)的程式碼資訊。
在區塊鏈瀏覽器中檢視是這樣的
左邊的是一個輸入,是發幣者的地址;右邊是輸出,是收幣者的地址。
BCH的轉賬和我們去銀行填單匯款很像,匯款單也是要填寫匯款人、匯款金額、匯款銀行賬戶、簽名、收款人……等等資訊。
在上述表格的倒數第2行,即“鎖定指令碼”可以是一種“備註資訊”(請注意,這裡是“可以是”),只要是以OP_Return開頭的都屬於“備註資訊”。就像我們使用網銀轉賬可有填寫備註一樣,這種“備註資訊”的“鎖定指令碼”,即BCH節點來說是不作處理的。我們稱這種“備註資訊”為OP_Return資料。
但是這種OP_Return資料,都一定會和這筆交易共同存在BCH的區塊裡的。這句話的意思是:OP_Return資料是受BCH區塊鏈保護的,這個資料是不可篡改,不可偽造的。哪怕是你再發一筆交易,填寫完全一樣的OP_Return資訊,但這筆交易的txid肯定是不一樣的,BCH區塊鏈是可以識別“資訊完全相同的OP_Return資料”是屬於哪筆交易,在哪個區塊的。這意味著,一筆交易tx,外帶一個OP_Return資料,這兩個資訊就會是在全世界唯一性地存在。即使是在同一區塊裡,相同的輸入地址和輸出地址外加相同的OP_Return資料,的兩筆交易,因為UTXO不同,交易加OP_Return也可以形成唯一性,在區塊內部可以排到順序。
OP_Return一旦寫入了區塊鏈,就相當於有了一個時間戳,哪怕是同一區塊裡的交易,都因排序不一樣,而有不同的時間戳。這句話是什麼意思呢?就類似於,今天的人民日報第2版發表了一篇文章,那這篇文章就帶有2018年7月18日這個時間戳。如果明天,在人民日報第2版完全相同的地方,又發表了完全一樣的文章,但時間戳是不一樣的。
下面的這筆交易就是帶一個OP_Return備註資訊,OP_Retrun一般會在瀏覽器的輸出列出中顯示為“地址解析失敗”,然後在瀏覽器的輸出指令碼部分顯示具體的資料。
以上資訊就是Omni協議成立的關鍵。
第2章 我們來設計一個貨幣
現在我們來設計一個貨幣。
設計貨幣,最重要的就是三個功能,貨幣的發行,建立賬戶,和貨幣的轉移。
發行必須有理有據,你不能胡亂發。我們可以約定好,一次性發行,然後永久不增加。也可以約定好按特定的條件來持續增發。只要定義好規則就好。為了方便起見,我們設計一個一次性發行,永久不增加的貨幣,我們先管它叫TFBC(The First Bticoin cash's token Coin的首字母縮寫),發行76億(全世界人口,一人一個好了)。初次發行,就將所有的幣存放到一個賬戶上。
建立賬戶就很開戶,允許新使用者加入到這套貨幣體系當中來。新開的戶,餘額是零,然後可以接收幣,收到幣後可以傳送幣給別的賬戶。這個好理解。
貨幣的轉移,或叫支付,是我們使用這個貨幣的過程。這個過程必須是安全的和讓使用者可識別的。你不能出現一個人原本是沒有幣,他卻能支付,即這套貨幣系統需要能識別出哪個賬戶有幣,然後才能支付,也不能支付的總額超過了賬戶的餘額。讓使用者可識別的就是說,你得讓人知道他賬戶上有多少幣,這個不能顯示是假的,或者有人造假說自己有多少幣,系統得能識別。
有這三個功能,就實現了一套最簡化的貨幣。
我們使用一種中心化的思維來設計的話,就是使用一個賬本,形象點說,就是一個excel表格。表格的第1列記錄的是賬戶名字,第二列是賬戶餘額。
貨幣的發行,就直接在excel表裡填寫一個賬戶,隨便叫個名字,就叫“閃電”好了,餘額是76億。
新建賬戶就是在excel表格裡增加一行,比如新建一個叫“雷神”的賬戶,餘額為0。
貨幣的轉移,比如“閃電”這個賬戶要轉1億個幣給“雷神”。要完成這個過程只需要修改兩個數,第1是將“閃電”的餘額改為75億,將“雷神”的餘額改為1億,就完成了。
為了保證轉移過程的安全性,我們會要求記錄所有的歷史支付記錄。這樣可以透過所有的歷史記錄回溯到初始發行的貨幣量,回溯就是將支付的過程逆過來,原本“閃電”支付給“雷神”1億,回溯就變成了“雷神”支付給“閃電”1億。如果回溯的最終結果和發行是一樣的,那就可以說明整個支付過程是沒有問題。
有了歷史記錄,我們也可以對所有的賬戶餘額進行回溯,回溯的結果一定的所有的賬戶餘額都為零(除了初始發行的那個賬戶)。
那如何保證記錄歷史支付呢?我們可以直接在excel表的第3列開始就作為支付記錄,比如“閃電”支付給“雷神”1億,則在“閃電”的第3列記錄“-1億”,而在“雷神”的第3列上記錄“+1億”。而每個賬戶的最終餘額,就是這些歷史記錄的加總。這個列數我們假定是無限的,這樣就可以記錄無限次數的交易了。
如果我們將上述一張excle表,複製到很多臺電腦上,然後這些電腦可以同步更新資料,那我們就使用了去中心化的方式來實現這套最簡化的貨幣體系。
但是,如何保證貨幣的發行和轉移是安全的呢?下面我們來講如何使用Bitcoin Cash區塊鏈來設計一個安全的貨幣發行和轉移系統,即Omni協議。
第3章 Omni協議
我們從第1章的描述中就可以看到,因為有OP_Return資料的存在,將Bitcoin Cash的區塊鏈裡的OP_Return資料提取出來,就是一個非常好的“excel表”,每一次對這張表的修改,都會被記錄在區塊鏈裡,而這些資料是不可篡改,不可偽造的。按第2章的描述,就可以利用“OP_Return excel表”來設計一個去中心化的貨幣發行和轉移系統。
現在我們來利用BCH區塊鏈來設計一套最簡化的貨幣系統。
首先是初始發行。
我們使用一個BCH錢包來發一筆帶自定義OP_Return資料的交易,交易的輸入是自己控制私鑰的地址A,輸出有兩個,第一個輸出還是地址A,即這筆交易是自己發給自己,第二個輸出是一個OP_Retrun資料。這個OP_Return資料寫的意思就是“使用地址A當成創世賬戶,給這個賬戶注入76億個TFBC貨幣”。這筆交易我們記為“鑄幣交易tx1。”
因為BCH系統是不會去識別這個OP_Return裡的資料的,所有的BCH節點都會直接忽略掉這個資料。那我們給bitcoin cash的節點錢包做一個外掛,這個外掛程式專門用來解析這個OP_Return資料。這個外掛結合上述tx1和這個OP_Return資料,就可以解析出一張excel表格,表格的第一列就是賬戶“地址A”,第二列就是“餘額76億TFBC”。
因為OP_Return在BCH網路是不會被檢驗的,可以被隨意填寫。有沒有可能別人也發一筆交易,包含完全相同的OP_Return資料,來偽造我們上面發行的76億貨幣呢?答案是不能的,因為他無法偽造tx1,而外掛程式需要結合tx1來解析出這張excel表格。
那麼創世交易的的創造者能不能篡改或偽造鑄幣交易tx1呢,也是不能的,因為創造者可以使用相同的輸入和輸出,但無法偽造成相同的UTXO,否則就會被BCH網路確定為雙花。
在這個新發生的貨幣體系裡,賬戶是和BCH共用的,新建賬戶也就是新建一個BCH地址。這個很簡單。
轉移貨幣的過程是這樣的,第一次轉移是從鑄幣交易往外支付的,比如支付給地址B1億個幣。支付的過程需要使用“鑄幣地址A”構造一筆BCH交易,輸入是地址A,輸出之一是地址B,金額為546聰(這是因為BCH網路的防塵設計,如果刪掉了這個限制,金額就可以為0),帶上礦工費,第二個輸出是一個OP_Return,裡面的資料寫會被解析為“賬戶A向賬戶B支付1億個幣”,我們記這筆BCH交易為tx2。
OP_Return裡的資料,在BCH網路是不會被處理的,但在上述的BCH的外掛程式裡會被解析出來,解析的結果就是更新這張貨幣的狀態表,如下表。
同樣的,因為tx2被BCH區塊鏈打包之後,就不可能再被偽造了,除非BCH網路被回滾了。所以這個貨幣的狀態表就無法被偽造了。
只要地址B上有BCH餘額可以支付防塵設定和礦工費,就可以給其他地址支付這個貨幣了,然後外掛程式就會拿這筆交易和OP_Return裡的資料,解析更新貨幣的最新狀態表。
以上就是最簡化的Omni協議實現的代幣的原理,為了更實用性,代幣一般會增加很多功能,比如鎖定功能,自動化轉幣功能……
第4章 Omni協議的現在情況
Omni協議在BTC是已經做好了,在BCH上還沒有。USDT就是使用Omni協議設計出來的。
Omni Core就是在BTC上使用Omni協議實現的一個客戶端,使用這個客戶端就可以在BTC上發幣,需要同步區塊。
Omni Core下載連結: https://github.com/OmniLayer/omnicore/releases
Omni代幣瀏覽器: https://www.omniexplorer.info/
在BTC上,現在一共有370種代幣。下面是這些幣的列表,但只有USDT有人在用,其他的都是死幣。
https://www.omniexplorer.info/properties/production
在BCH上,我們已經構造了一筆交易,這筆交易就是按照現在的Omni協議手動構造的,等BCH上的Omni協議實現了客戶端,將可以解析出一個代幣,代號是TFBC,76億。鑄幣交易id是這個:
f89794db07acb6812326ef76f781203f77e5712345ac07834cab6adc403a3782
第5章 結束語
OP_Return可以提供非常非常多的想法,好好利用OP_Return,BCH將大有作為。