主页 > 下载imtoken钱包官方 > 比特币钱包开发:比特币转账交易及交易记录
比特币钱包开发:比特币转账交易及交易记录
课程目标
了解交易的输入、输出、UTXO
实现比特币转账交易
查询交易记录
前言
现在我们的钱包应用少了最后一个关键功能:转账交易,这就是本章的内容。
根据API文档,完整的发送交易流程需要经过以下四个步骤:
createTxProposal():创建交易。
publishTxProposal():发布交易。
signTxProposal():签署交易。
broadcastTxProposal():广播交易。
1.创建交易的API文档
首先,我们需要创建一个事务。 API文档说明如下:
单击此处添加图片说明
的
第一个参数是opts有很多可选参数,第二个参数是Callback回调。 opts的重要参数解释如下。
opts.outputs:数组,必填:交易的输出,即收款人。 数据类型是数组。 可见一笔交易支持多次转账。 数组的元素如下:
opts.outputs[].toAddress:String,必填:收款人地址。
opts.outputs[].amount: Number, required: 转账金额。
opts.outputs[].message: String, required: 备注信息。
opts.message: string, required: 本次交易的备注信息,与opts.outputs[].message不同,是指定单笔转账的备注信息。
opts.fee: string, 可选:本次交易的费用,与feePerKb互斥。
opts.feePerKb: string, 可选:本次交易每KB的费用,与fee互斥。
opts.changeAddress: string, optional: 使用这个地址作为本次交易的地址,这个地址必须属于这个钱包。
opts.payProUrl:字符串,可选:忽略。
opts.excludeUnconfirmedUtxos: string, 可选:不使用未确认交易的UTXOS作为输入。
opts.customData:对象,可选:忽略。
opts.inputs: 数组,可选:本次交易中使用的输入。
opts.utxosToExclude:数组,可选:忽略。
2.编码创建交易
我们首先传递创建交易所需的参数,代码如下:
单击此处添加图片说明
输出如下:
9C7CFF6E-4E72-403D-A1EC-7879A8D2091F
99D40F41-D9A0-4198-B72A-27DBDB455F92
输出信息中有几个关键点:
状态:“临时”,临时状态。
fee:243,手续费为243聪。
feeLevel: "normal", 费用水平正常。
关键数据如下:
更改地址:{地址:“n1jK5uzvLqJKatSub4dscJ93wsSnvVc6U6”,路径:“m/1/1”}
输入:{地址:“n3wRnSdhWJtckzMayhJQstCWunpg91kDMs”,路径:“m/1/0”}
输出:{toAddress:“mm16s7xsf8Wjwxhprc6YzLW9gVncqZNGBR”}
现在这笔交易还没有发出去,还需要三步才能完成这笔交易。
3.发送交易的完整流程
前面提到,发送一个交易需要四个流程,createTxProposal –> publishTxProposal –> signTxProposal –> broadcastTxProposal。 重点是在第一步创建交易createTxProposal,在这里指定这个交易的详细数据,后面三步只需要执行即可。
单击此处添加图片说明
的
输出内容太多了,说说关键数据吧。
每笔交易改变地址,现在输出
更改地址:{地址:“mi7ZMqMbWfv7p4SHj8iUQXpkuSYbdXe44K”,路径:“m/1/2”},
上次是“m/1/1”。
输入:{地址:“n3wRnSdhWJtckzMayhJQstCWunpg91kDMs”,路径:“m/1/0”},
与上次发送或“m/1/0”相比没有变化,因为上次交易仅被创建而不是广播。
输出:{toAddress:“mm16s7xsf8Wjwxhprc6YzLW9gVncqZNGBR”}
执行完每个步骤后,交易会改变它的状态
createTxProposal():状态:“已广播”。
publishTxProposal():状态:“待定”。
signTxProposal():状态:“已接受”。
broadcastTxProposal():状态:“已广播”。
签名交易执行成功后,会生成一个交易id,txid:“57fb33c1199d6e98ae245dc422835d012ed3cab1314e245ca3605de3b44884b4”。
ID:“beb003f8-f7d6-4578-a507-c36319a9fc96”。
如果几个步骤都没有发送错误,则交易成功完成。两个钱包的余额变化为
“wallet1”:0.11121494 BTC –> 0.10121251 BTC,相差0.01000243。
收款人“mm16s7xsf8Wjwxhprc6YzLW9gVncqZNGBR”的钱包是“importWallet1”。
“importWallet1”:0.011 BTC –> 0.021 BTC,相差0.01。
额外扣除的0.01000243-0.01=0.00000243 BTC就是本次交易的手续费,即243聪。
4.查询交易记录
现在看看我们刚才的转账是否可以查询成功。 您需要使用 getTxHistory() 方法。 注意参数includeExtendedInfo必须设置为true,会显示额外的交易详情,如:输入、输出等。
单击此处添加图片说明
的
1、最近一次转账的交易记录
现在钱包有3条交易记录,我将上面的转账交易记录详细截图如下:
A03FC8CE-76DE-4348-B137-C25491C41F5C
我们先分析一下上面出现的三个地址。
输入:{地址:“n3wRnSdhWJtckzMayhJQstCWunpg91kDMs”},
这是这个交易的输入。 通过 getBalance() 方法的 byAddress 字段,可以查看钱包余额属于哪些子地址。
输出[0]:{toAddress:“mm16s7xsf8Wjwxhprc6YzLW9gVncqZNGBR”}
这是输出,即收款人地址。
输出[1]:{地址:“mi7ZMqMbWfv7p4SHj8iUQXpkuSYbdXe44K”,路径:“m/1/2”}
为什么我们向一个地址转账时会有两个输出? 因为输入中的部分余额会被取出来进行转账,所以剩余的钱会转入这个地址比特币交易记录查询,也就是钱包的另一个新的子账户地址。 所以在传输前,在“m/1/0”路径的“n3wR...kDMs”地址,本次传输完成后,会传输到“m/1/0”路径的“mi7Z...e44K”地址/1/2" 路径。
2. 最初收到的交易记录
现在来看receive转账的输出,BTC测试币交易的初始请求是receive。
6FD6B634-B4FF-4C0E-ACAE-F4B9BED65727
可以看到路径“m/0/0”的地址“move...1KQz”作为输出来接收交易。同时可以看到一个字段有状态
action: "send", 发送的意思。
action:“received”,表示收到。
3.第二次交易记录
在这条交易记录中,第一笔和第三笔交易的交易地址将被关联起来。
A121CCE5-FEB8-46EE-918C-68AAB52E5717
第一个接收交易的输出:“move...1KQz”。 输出是带有余额的地址。
第二笔转出交易的输入:“move...1KQz”,输出(即改变后的地址):“n3wR...kDMs”。
第三笔转出交易的输入:“n3wR...kDMs”。
其他类型的转账自行测试看结果。
4。结论
比特币采用的是UTXO模型,不是账户模型,“余额”的概念是不直接存在的,需要遍历整个交易历史来获取余额。
UTXO:unspend transaction output的简写,指未花费的交易输出。
场景:假设你过去从三个比特币用户A、B、C手中购买了BTC。 你从 A 买了 3.5 BTC,从 B 买了 4.5 BTC,从 C 买了 2 BTC。现在你的比特币钱包里只剩下 10 BTC。
问:这10个BTC真的是10个BTC吗? 其实不是,这句话听起来可能有点奇怪。 (什么!我钱包里的BTC不是真的BTC,别吓我。。。)
说明:如前所述,在比特币交易系统中,没有账户和余额等概念。 因此,你钱包里的10个BTC并不代表钱包余额就是10个BTC。 相反,这 10 个 BTC 实际上是散布在每个区块中的 UTXO 的总和,以及由你的比特币地址(钱包地址 | 公钥)锁定的每笔交易。
UTXO 是比特币交易的基本单位。 每一笔交易都会产生UTXO,一个UTXO可以是一个“聪”的任意倍数。 将比特币发送给某人实际上会创建新的 UTXO,绑定到该人的钱包地址,并且可以被他用于新的支付。
一般的比特币交易由两部分组成:交易输入和交易输出。 A支付给你3.5 BTC的交易实际上产生了一个新的UTXO,相当于3.5 BTC(3.5亿聪),并锁定到你的比特币钱包地址。
如果你想转1.5 BTC给你的女朋友(男朋友),那么你的钱包会从可用的UTXO中选择一个或多个可用的个人拼凑出一个大于或等于交易所需金额的比特币金额。 例如,在这个假设的场景中,你的钱包会选择你和C之间的交易中的UTXO作为交易输入,input = 2BTC比特币交易记录查询,这里会产生两个新的交易输出,一个输出(UTXO = 1.5 BTC)将被绑定到你女朋友(男朋友)的钱包地址,另一个输出(UTXO = 0.5 BTC)将作为找零和反弹到你的钱包地址。
我们需要找到所有未花费的交易输出(UTXO)。 未花费意味着这些交易输出从未被交易输入指向。
5.完整的源代码
1.控制器/transaction.js
在controllers文件夹下新建transaction.js文件,实现比特币转账交易和查询交易记录。
单击此处添加图片说明
的
单击此处添加图片说明
的
单击此处添加图片说明
的
单击此处添加图片说明
的
单击此处添加图片说明
的
单击此处添加图片说明
的
单击此处添加图片说明
的