Bitget下载

注册下载Bitget下载,邀请好友,即有机会赢取 3,000 USDT

APP下载   官网注册
比特币的交易输入

简单地说,交易输入是指向UTXO的指针。它们指向特定的UTXO,并被交易哈希和在区块链中记录UTXO的序列号作为参考。若想支付UTXO,一个交易的输入也需要包含一个解锁脚本,用来满足UTXO的支付条件。解锁脚本通常是一个签名,用来证明对于在锁定脚本中的比特币地址拥有所有权。

当用户付款时,他的钱包通过选择可用的UTXO来构造一笔交易。比如说,要支付0.015比特币,钱包应用会选择一个0.01 UTXO和一个0.005 UTXO,使用它们加在一起来得到想要的付款额。

在例5-3中,我们展示了一种贪心算法来为了得到特定的付款额而选择可用的UTXO。在例中,可用的UTXO被提供在一个常数数组中。但在实际中,可用的UTXO被一个远程过程调用比特币核心,或者被一个如例5-1中的第三方应用程序接口,来检索出来。

例5-3 一个计算会被发送的比特币总量的脚本

# 使用贪心算法从UTXO列表中选择输出。from sys import argv class OutputInfo:     def __init__(self, tx_hash, tx_index, value):         self.tx_hash = tx_hash        self.tx_index = tx_index        self.value = value     def __repr__(self):        return "<%s:%s with %s Satoshis>" % (self.tx_hash, self.tx_index,                                             self.value) # 为了发送,从未花费的输出列表中选出最优输出。# 返回输出列表,并且把其他的改动发送到改变地址。def select_outputs_greedy(unspent, min_value):     # 如果是空的话认为是失败了。    if not unspent: return None     # 分割成两个列表。    lessers = [utxo for utxo in unspent if utxo.value < min_value]     greaters = [utxo for utxo in unspent if utxo.value >= min_value]     key_func = lambda utxo: utxo.value    if greaters:         # 非空。寻找最小的greater。        min_greater = min(greaters)        change = min_greater.value - min_value         return [min_greater], change     # 没有找到greaters。重新尝试若干更小的。    # 从大到小排序。我们需要尽可能地使用最小的输入量。    lessers.sort(key=key_func, reverse=True)    result = []    accum = 0    for utxo in lessers:         result.append(utxo)        accum += utxo.value        if accum >= min_value:             change = accum - min_value            return result, "Change: %d Satoshis" % change     # 没有找到。    return None, 0 def main():     unspent = [         OutputInfo("ebadfaa92f1fd29e2fe296eda702c48bd11ffd52313e986e99ddad9084062167", 1,  8000000),        OutputInfo("6596fd070679de96e405d52b51b8e1d644029108ec4cbfe451454486796a1ecf", 0, 16050000),        OutputInfo("b2affea89ff82557c60d635a2a3137b8f88f12ecec85082f7d0a1f82ee203ac4", 0,  10000000),        OutputInfo("7dbc497969c7475e45d952c4a872e213fb15d45e5cd3473c386a71a1b0c136a1", 0, 25000000),        OutputInfo("55ea01bd7e9afd3d3ab9790199e777d62a0709cf0725e80a7350fdb22d7b8ec6", 17, 5470541),        OutputInfo("12b6a7934c1df821945ee9ee3b3326d07ca7a65fd6416ea44ce8c3db0c078c64", 0, 10000000),        OutputInfo("7f42eda67921ee92eae5f79bd37c68c9cb859b899ce70dba68c48338857b7818", 0, 16100000),    ]     if len(argv) > 1:        target = long(argv[1])     else:        target = 55000000     print "For transaction amount %d Satoshis (%f bitcoin) use: " % (target, target/ 10.0**8)     print select_outputs_greedy(unspent, target) if __name__ == "__main__":     main()

如果我们不使用参数运行select-utxo.py脚本,它会试图为一笔五千五百万聪(0.55比特币)的付款构造一组UTXO。如果你提供一个指定的付款额作为参数,脚本会选择UTXO来完成指定的付款额。在例5-4中,我们运行脚本来试着完成一笔0.5比特币,或者说是五千万聪的付款。

例5-4 运行select-utxo.py

$ python select-utxo.py 50000000For transaction amount 50000000 Satoshis (0.500000 bitcoin) use:([<7dbc497969c7475e45d952c4a872e213fb15d45e5cd3473c386a71a1b0c136a1:0 with 25000000Satoshis>, <7f42eda67921ee92eae5f79bd37c68c9cb859b899ce70dba68c48338857b7818:0 with 16100000 Satoshis>,<6596fd070679de96e405d52b51b8e1d644029108ec4cbfe451454486796a1ecf:0 with 16050000 Satoshis>], 'Change: 7150000 Satoshis')

一旦UTXO被选中,钱包会为每个UTXO生成包含签名的解锁脚本,由此让它们变得可以通过满足锁定脚本的条件来被支付。钱包把这些UTXO作为参考,并且连同解锁脚本一起作为输入加到交易中。表5-3展示了交易输入的结构。

表5-3 交易输入的结构

尺寸

字段

说明

32个字节

交易

指向交易包含的被花费的UTXO的哈希指针

4个字节

输出索引

被花费的UTXO的索引号,第一个是0

1–9个字节(可变整数)

解锁脚本尺寸

用字节表示的后面的解锁脚本长度

变长

解锁脚本

一个达到UTXO锁定脚本中的条件的脚本

4个字节

序列号

目前未被使用的交易替换功能,设成0xFFFFFFFF

序列号是用来覆盖在交易锁定时间之前失效的交易,这是一项目前没有在比特币中用到的功能。大多数交易把这个值设置成最大的整数(0xFFFFFFFF)并且被比特币网络忽略。如果一次交易有非零的锁定时间,那么它至少需要有一个序列号比0xFFFFFFFF低的输入来激活锁定时间。

比特币的交易输入

#欧易OKEx##比特币[超话]##数字货币#