本節書摘來自華章計算機《區塊鍊開發指南》一書中的第2章,第2.2節,作者:申屠青春 主編 宋 波 張 鵬 汪曉明 季宙棟 左川民 編著更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
合約币counterparty是以合約币協定運作的全套金融工具,合約币協定建立在比特币塊鍊的基礎之上,把比特币塊鍊當成可信的時間戳服務和可信的資訊釋出證明。
目前合約币已經實作了衆多的技術創新點,比如燃燒證明、合約、去中心化xcp與btc交易所、賭約或期貨、資産或股份發行、分紅等。counterparty是建立在比特币協定上的傳輸層,用于建立和使用去中心化的财務工具協定。簡單來說,可以将xcp了解為很多“小的btc”即xcp=“小的btc”,但是這些“小的btc”(xcp)不僅僅具有貨币的交易功能,還具有資産發行(例如發行股票)、股息配置設定及下注的功能。
每個合約币資訊都包括以下特性。
有一個源位址。
有一個目的位址。
有一定數量的比特币,從源代碼發送到目的位址(如果存在目的位址的話)。
以比特币計的費用,支付給挖到這個交易的礦工。
最多40位元組的外帶資料,這些資料通過上述的兩個外帶資料方法嵌入到比特币交易中。
為了友善區分,每個合約币交易的資料區域都以utf-8格式的cntrprty打頭,這個字元串已經足夠長,因而很難将合約币的交易與在op_return區域帶有僞随機數的比特币交易搞混。在測試情況下(例如:在任何塊鍊中使用testcoin合約币網絡),這個字元串是“xx”。
識别位元組串“cntrprty”之後的四個位元組說明了目的位址的存在性、比特币交易費用的多少,以及交易的比特币數量(根據合約消息類型的不同而不同)。其他的資料則根據消息類型具有不同的格式,具體請參考源代碼。
另外,每個合約币交易都必須有一個明确且唯一的源位址,在含有合約币交易的比特币交易中,所有輸入都必須一緻。在比特币交易中資金唯一的源位址,就是合約币交易的源位址。
合約币交易的源位址和目的位址,就是比特币位址,任何比特币位址都可以收到任何合約币的資産(如果該位址有資産的話,也可以向外發送資産)。
此外,需要說明的是,所有資訊都會按照順序進行解析,一次一個,并且會忽略區塊邊界。
2.2.1 counterparty附生鍊的實作機制詳解
附生鍊支援建構兩種類型的交易:btc發送和以btc發送合約币的資産分紅,這兩種交易不包含資料區,對于後者,能使用多個“目的”輸出。除btc和xcp以外的所有資産均具有如下屬性:asset name、asset id、description、divisiblity、callability、call date(if callable)即贖回日期(如果是可贖回的)、call price(if callable)即贖回價格(如果是可贖回的)等。
資産名稱是大寫的ascii字元串,當編碼成十進制整數時,其值大于263,小于或等于2568。所有資産名稱,除了“btc”和“xcp”以外,必須至少有4位元組長,而且不能以字元“a”開頭。這樣處理後,某些13位元組的資産名稱是有效的,但是14位元組的就不行。
資産可以是可分割的或不可分割的,可分割資産可以分成8個十進制的位置。資産可以有描述,也可以随時改變。
資産可以是“可贖回的”,可贖回資産在贖回期之後,可以被現在的發行者,以贖回價格(以xcp為機關)強制“贖回”,贖回價格可以設定成該資産首次發行的價格。
可贖回資産可以在贖回日期之後贖回,該贖回日期是在塊鍊中的一個區塊中第一次定義的時間。
贖回價格指定為6個十制數的精度,是xcp與該資産的最小機關的比率。
附生鍊的交易類型包括:發送(send)、訂單(order)、btc支付(btcpay)、發行(issue)、廣播(broadcast)、賭約(bet)、分紅(dividend)、燃燒(burn)、取消(cancel)、回調(callback)等。下面就來一一介紹下。
2.2.2 發送
發送(send)是指從源位址發送任何合約币資産到目的位址,如果在解析(以交易順序)該消息時,發送者還沒有足夠的資産數量,則該發送消息隻能部分滿足。counterparty支援發送比特币,這裡不使用任何資料輸出。
2.2.3 訂單
訂單(order)是指給定某種資産的特定數量,要得到另外資産的特定數量。“買單”和“賣單”之間沒有本質差别。在訂單解析時,被給的資産通常會馬上被簽訂合約。也就是說,如果有人想用1個xcp換2個btc,一旦他釋出了這個訂單,那麼他的xcp賬号馬上會減去1個xcp。
當訂單在塊鍊中可見時,協定會将它與另一個以前見過的開放訂單撮合在一起。兩個被撮合成功的訂單稱為“訂單對”,如果訂單對中的任何一個訂單包含比特币,那麼這個訂單對會被指定為“待處理”狀态,直到必要的btcpay交易釋出;如果訂單對中的訂單沒有包含比特币,那麼這個貿易将立即完成,并且以協定自身指定的位址形成新的收支平衡。
所有訂單都是定價單,詢價指定了一個人想要付出和得到的比率,訂單會比對定價以下的最高價格,訂單對就是按照這個價格撮合的。也就是說,如果有個開放訂單以0.11xcp/每份資産賣出,第二個賣單以0.12xcp/每份資産賣出,第三個賣單以0.145xcp/每份資産賣出,然後有一個新訂單要以0.14xcp/每份資産的價格買入,那麼它将會先比對第二個買單,xcp和btc将會以0.12xcp/asst的價格成交。
所有訂單允許部分執行,也就是說,訂單并非要麼完全成交,要麼不成交。在前一個例子中,如果購買比特币的一方想買的數量多于第一個賣單的數量,那麼買單剩餘未成交的數量會由後面的現存賣單來滿足。在所有可能的訂單對撮合完之後,目前的買單被列為開放訂單(如果還有數量未被滿足的話),如果存在多個價格相同的開放買單,則訂單将按照時間順序撮合。
使用者釋出開放訂單之後,開放訂單會在一定數量的區塊後過期,當訂單過期時,所有擔保的資金都會傳回到訂單釋出的那一方。
等待比特币支付的訂單對将在10個區塊後過期,其中的訂單将會重新釋出。一般情況下,不會存在虛假交易,因為每一方提供的資産都存儲在擔保處。然而,擔保比特币是不可能的,因而那些想購買比特币的人會要求隻比對有向比特币礦工支付交易費用的交易。另一方面,當建立訂單售出比特币時,使用者可以支付他願意支付的任意費用;如果是部分訂單,則僅支付部分費用。
此外,可用支付比特币的方式來關閉那些等待btcpay消息的訂單對。在btcpay消息的資料區塊中,存儲着兩個hash串連接配接而成的位元組串,這兩個hash串是由訂單對中的兩個訂單hash生成的。
2.2.4 發行
資産可以以發行消息類型的方式進行發行(issue):使用者指定名稱和數量,協定計入相應的位址。資産名稱必須是唯一的,或者以前被相同位址發行過的。如果要重新發行一個資産,也就是說,對已經發行的資産進行增發,那麼發行的資産名稱、可分割性和釋出位址必須比對。對某個已經存在的資産進行增發,這個權利可以轉移給别的位址。資産可以被不可逆地鎖定,防止進行增發,以保證資産擁有者免受通脹風險。
2.2.5 廣播
廣播(broadcast)用于釋出文本或數字資訊,并且附帶一個時間戳作為系列廣播的一部分,這系列廣播被稱為“回報”。一個回報和一個位址相關聯:從給定位址過來的任何廣播,都是該位址回報的一部分。一個回報的時間戳必須是單向增加的。賭注以數字形式在回報中下注,這個數值可以是貨币的價格,或者可以是對未來事件可能的離散輸出的一部分描述。例如,有人可能以文本形式這麼描述:“us qe on 2014-01-01: dec = 1, const = 2, inc = 3”,并且宣布結果是“us qe on 2014-01-01: decrease!”和數值1,更為複雜的賭約可以以非塊鍊的方式進行釋出。
釋出内容為文本字元串“lock”(大小寫不敏感)的單個廣播可以鎖定回報,阻止它成為以後的廣播源位址,同時也阻止它成為任意新賭約的主題(如果回報被鎖定,但還有開放的或未解決的賭約與之相關,那麼,那些賭約或賭約對會無損害地過期)。廣播-1的數值會被賭約結算所忽略。回報以它的釋出位址來識别。
2.2.6 賭約
賭約(bets)是指打賭一個特定回報會等于(或者不等于)某個特定時間的一個目标值,例如,打賭2020年1月1日12點整比特币的價格是否為$10?000美元。參與賭博的人用他們的賭金進行擔保,當到達指定時間,該賭約就會按照回報結果進行結算,赢者獲得賭金。
等于/不等于賭約不能用杠杆。然而,為了讓兩個賭注能被撮合,它們的杠杆水準、時間期限和目标值都必須相同,否則,它們會以訂單的形式撮合,除非賭約的賠率與訂單價格是反相關的(賠率=保證金/莊家保證金),如果有可能,每個賭約都會以盡可能高的賠率撮合到開放賭約。
目标值必須非負,賭約對(合約)不受-1的廣播值所影響。賭約的最後期限不能晚于它們指定回報的最後一個廣播的時間戳。賭約的過期與訂單相同,例如:過了特定的區塊數量後就會過期。如果賭約對在2016個區塊後,發現一個區塊的時間戳在賭約的最後期限之後過期,那麼,賭約費用将會是初始保證費用的一定比例,這部分并非賭約收入。
因為區塊時間的存在,以及交易在塊鍊中被訂單化這種非确定性方式的存在,所有合約必須非增量解決,但是涉及的資金必須馬上放入擔保契約,而且必須有結算日期。否則,有人看到價格下跌了,就會把要被扣除的資金隐藏起來。