Qtum研究院:Qtum 如何實現第三方支付交易零成本
分散式賬本開闢一個充滿可能和機遇的新世界。從比特幣到以太坊再到Qtum,每個都提供了一個獨特的平臺,可以解決不同的問題。Qtum應運而生,讓分散式應用程式可以建立在類似以太坊的基礎上,但使用比特幣 UTXO 模型的增加了更多的穩定特性。
在上篇文章說到Qtum量子鏈聯合創始人兼首席開發工程師Jordan Earls近日在海外媒體上釋出名為:關於在Qtum量子鏈上支援免費生成UTXO的提案,在這篇文章裡我們將會講述更多實現的細節。
“
此技術提案將會幫助全球DAPP使用者在不持有token的情況下也能使用DApp服務,吸引更多使用者體驗去中心化應用,不再被手續費所束縛
”
Qtum 開發團隊發現,在使用賬戶模型的區塊鏈上,如以太坊,其功能性(functionality)的實現是非常複雜的,並且直至今天,在其他鏈上還沒有發現這種功能性。而在Qtum上,功能完備的開發是作為Qtum延伸工具而實現。
手續費從何而來?
在此之前,交易費用必須由廣播資訊它的地址的所有者支付。假設一個機構在鏈上執行DApp,它分發某種形式的標識,用於獲得身份證明,他們需要通過交易來呼叫智慧合約,以便它可以給使用者註冊地址,使用者必須支付費用才能呼叫分發 ID 的智慧合約。
但是,如果使用者沒有任何加密貨幣並且不想為單個交易購買某些內容,該怎麼辦?通過第三方支付費功能,使用者仍然可以呼叫分發ID的合約,而無需擁有任何加密貨幣。
整體流程為:首先構建原始交易,然後和第三方之間互換,並簽署互換協議,最後廣播出去即可。看似簡單卻對機構代付的功能對於操作者的區塊鏈程式碼有相應的操作要求,並且這項功能還處於內部測試中,等開發的日期我們會全面支援所有Qtum上的DAPP 應用。
技術演示
在繼續閱讀之前,如果想了解原始交易的基礎知識,檢視這篇指南。(https://bitcoin.org/en/developer-examples#simple-raw-transaction 該指南適用於比特幣,但由於 Qtum 是作為比特幣的分支構建的,因此可以用Qtum qcli docker regtest,因為命令是相同的)
使用qcli命令createrawtransaction來生成初始交易。以下是需要提供的輸入:
Arguments:
1. "inputs" (string, required) A JSON array of JSON objects [ { "txid":"id", (string, required) The transaction id "vout":n, (numeric, required) The output number "sequence":n (numeric, optional) The sequence number } ,... ] 2. "outputs" (string, required) a JSON object with outputs { "address": x.xxx, (numeric or string, required) The key is the qtum address, the numeric value (can be string) is the QTUM amount "data": "hex" (string, required) The key is "data", the value is hex encoded data ,... } 3. locktime (numeric, optional, default=0) Raw locktime. Non-0 value also locktime-activates inputs Result: "transaction" (string) hex string of the transaction
我們提供以下資訊:
createrawtransaction ''' [ { "txid": "0000000000000000000000000000000000000000000000000000000000000000", "vout": "0" } ] ''' ''' { "data": "0000000000000000000000000000000000000000000000000000000000000000" }'''
將’txid’設定為0仍然有效,但是,如果沒有給它一個有效的 UTXO ID 來獲取費用,就沒有足夠的資金來接受交易。
在“data”欄位,實際上會將十六進位制編碼資料指定為要進行的合約呼叫。這個例子中,0(nulldata)僅用於演示。輸出將是十六進位制字串,你可以用qcli命令’decoderawtransaction’進行解碼獲取原始交易。我們得到以下原始交易:
{ "txid": "09e0bdb5d819827d7aecfd7d5dcaecc84e240078d9e86a72c8348b3d0b5931f5", "hash": "09e0bdb5d819827d7aecfd7d5dcaecc84e240078d9e86a72c8348b3d0b5931f5", "size": 94, "vsize": 94, "version": 2, "locktime": 0, "vin": [ { "txid": "0000000000000000000000000000000000000000000000000000000000000000", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967295 } ], "vout": [ { "value": 0.00000000, "n": 0, "scriptPubKey": { "asm": "OP_RETURN 0000000000000000000000000000000000000000000000000000000000000000", "hex": "6a200000000000000000000000000000000000000000000000000000000000000000", "type": "nulldata" } } ] }
現在我們需要在’vin’中新增一些操作碼:
SIGHASH_ANYONECANPAY | SIGHASH_SINGLE
這些操作碼將使這個用例成為可能,它們基本上允許其他任何人來支付交易費用而不僅僅是交易的所有者。原始交易現在應該如下所示:
{ "txid": "09e0bdb5d819827d7aecfd7d5dcaecc84e240078d9e86a72c8348b3d0b5931f5", "hash": "09e0bdb5d819827d7aecfd7d5dcaecc84e240078d9e86a72c8348b3d0b5931f5", "size": 94, "vsize": 94, "version": 2, "locktime": 0, "vin": [ { "txid": "0000000000000000000000000000000000000000000000000000000000000000", "vout": 0, "scriptSig": { "asm": "SIGHASH_ANYONECANPAY | SIGHASH_SINGLE", "hex": "" }, "sequence": 4294967295 } ], "vout": [ { "value": 0.00000000, "n": 0, "scriptPubKey": { "asm": "OP_RETURN 0000000000000000000000000000000000000000000000000000000000000000", "hex": "6a200000000000000000000000000000000000000000000000000000000000000000", "type": "nulldata" } } ] }
我們現在有一個有效的交易。因為我們無法支付費用,區塊鏈還無法接受這個交易。現在可以將這個原始交易(鏈外)傳送給第三方。然後第三方建立另一個標準的原始交易,有有效 UTXO 的’txid’ 可以有足夠的資金支付費用,並簽名。然後,他們向你傳送這個交易的簽名“vin”(還是在鏈外),看起來像這樣:
{ "txid": "7087daa5c9859a0118a125285f2040c738e5f4d3caaf4d0840da3b183d64fdff", "vout": 0, "scriptSig": { "asm": "304402204155babf1390197b070cb92e9bf6ec88906e294c7921cb3a76bdbee5f6651058022016e13949dbecdb70eb99d50e7f6e388963cef104a4d769113d661b488532f9b6[ALL]", "hex": "47304402204155babf1390197b070cb92e9bf6ec88906e294c7921cb3a76bdbee5f6651058022016e13949dbecdb70eb99d50e7f6e388963cef104a4d769113d661b488532f9b601" }, "sequence": 4294967295 }
現在需要將簽名的“vin”新增到我們正在處理的原始交易中的vins列表中:
{ "txid": "09e0bdb5d819827d7aecfd7d5dcaecc84e240078d9e86a72c8348b3d0b5931f5", "hash": "09e0bdb5d819827d7aecfd7d5dcaecc84e240078d9e86a72c8348b3d0b5931f5", "size": 94, "vsize": 94, "version": 2, "locktime": 0, "vin": [ { "txid": "0000000000000000000000000000000000000000000000000000000000000000", "vout": 0, "scriptSig": { "asm": "SIGHASH_ANYONECANPAY | SIGHASH_SINGLE", "hex": "" }, "sequence": 4294967295 }, { "txid": "7087daa5c9859a0118a125285f2040c738e5f4d3caaf4d0840da3b183d64fdff", "vout": 0, "scriptSig": { "asm": "304402204155babf1390197b070cb92e9bf6ec88906e294c7921cb3a76bdbee5f6651058022016e13949dbecdb70eb99d50e7f6e388963cef104a4d769113d661b488532f9b6[ALL]", "hex": "47304402204155babf1390197b070cb92e9bf6ec88906e294c7921cb3a76bdbee5f6651058022016e13949dbecdb70eb99d50e7f6e388963cef104a4d769113d661b488532f9b601" }, "sequence": 4294967295 } ], "vout": [ { "value": 0.00000000, "n": 0, "scriptPubKey": { "asm": "OP_RETURN 0000000000000000000000000000000000000000000000000000000000000000", "hex": "6a200000000000000000000000000000000000000000000000000000000000000000", "type": "nulldata" } } ] }
此交易現在具有原始的“vin”,其中“txid”為0,並且來自第三方的簽名“vin”具有效的UTXO“txid”,用來支付交易費用。'vout’包含呼叫智慧合約的資訊。剩下要做的就是最後一次簽署交易,準備好向區塊鏈廣播。之後,合約成功呼叫,費用由第三方支付。