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’包含调用智能合约的信息。剩下要做的就是最后一次签署交易,准备好向区块链广播。之后,合约成功调用,费用由第三方支付。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值