欧易上线比特币交易时间(比特币的交易输入)
来源:峰值财经 发布时间:2023-05-13 浏览量:次
简单地说,交易输入是指向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低的输入来激活锁定时间。