比特币钱包开发:比特币转账交易与交易记录

当前位置:首页 > 币圈百科 > 比特币钱包开发:比特币转账交易与交易记录

比特币钱包开发:比特币转账交易与交易记录

2022-12-28币圈百科282

课程目标

了解交易的输入输出,UTXO

实现比特币转账交易

查询交易记录

前言

现在我们的钱包应用缺少最后一个关键功能:转账交易,

根据API文档,完整的交易发送流程需要经过以下四个步骤:

createTxProposal():创建交易。

publishTxProposal():发布事务。

signTxProposal():签名交易。

broadcastTxProposal():广播事务。

一、创建事务的API文档描述

首先我们需要创建一个事务。API文档描述如下:

点击此处添加图片标题

第一个参数是opts有很多可选参数,第二个参数是Callback回调。下面解释opts的重要参数。

opts.outputs: Array,必选:交易的输出,即收款方。数据类型是array,这表明一个事务支持多个传输。数组的元素如下:

opts.outputs []。toaddress: string,必选:收款人地址。

选择输出[]。金额:数字,必填:转账金额。

选择输出[]。message: string,必选:注释消息。

opts.message: string,必选:该事务的注释消息,与opts.outputs[]不同。消息,是指定单笔转账的备注信息。

opts.fee: string,可选:本次交易的费用,与feePerKb互斥。

opts.feePerKb: string,可选:本次交易每Kb的费用,与fee互斥。

opts . change address:string,可选:使用此地址作为此交易的地址,此地址必须属于此钱包。

opts.payProUrl: String,可选:ignore。

opts . exclueunformedUTXOS:string,可选:不使用未确认交易的utxos作为输入。

opts.customData: Object,可选:ignore。

opts.inputs: Array,可选:此事务中使用的输入。

opts . utxostoexclude:array,可选:ignore。

二创建事务的编码蓑衣网小编2022

我们将首先传递创建事务所需的参数。代码如下:

点击此处添加图片标题

?输出如下:

9 c 7 CFF 6 e-4e 72-403d-A1EC-7879 a8d 2091 f9C7CFF6E-4E72-403D-A1EC-7879A8D2091F

9d 40 f 41-d9a 0-4198-B72A-27 DBD 455 f 92[

99D40F41-D9A0-4198-B72A-27DBDB455F92费:243,手续费243Satoshi。

收费水平:“正常”,收费水平正常。

关键数据如下:

更改地址:{ ADDRESS:" n 1 JK 5 uzvlqjkasub 4 scj 93 wssnvc 6 u 6 ",Path:" m/1/1 "}

输入:{ ADDRESS:" N3WRNSDHWJTCKZmayHJQSTCWNPG 91 kdms ",Path:" m/1/0 "}

输出:{to address: "mm16S7 XSF8蓑衣网小编2022WJW。第三部分。发送交易的完整流程

如前所述,发送交易需要四个流程,CreateTXProposalPublishTXProposalsigntxsproposalBroadcastTXProposal。要点是在第一步中创建事务createTxProposal。这里指定了本次交易的详细数据,下面三个部分只需要执行。

点击此处添加标题

输出内容太多。这里是关键数据。

每一个事务都改变地址,现在输出的是

改变地址:{ Address:" mi 7 zmqmbwfv 7 p 4 shj 8 iuqxpkusybdxe 44k ",path: "m/1/2"},

上次是" m/1/1"

输入:{ Address:" n3wrnsdhwjtckzmayhjqtcwunpg 91 kdms ",path: "m/1/0"},

仍然是" m/1/1 "

outputs:{ to address:" mm 16 S7 xsf 8 wjwxhprc 6 yzlw 9 gvncqzngbr " }

事务在每一步

CreateTXProposal():status:" broadcast "。

publishTxProposal():状态:“待定”.

signTxProposal():状态:“已接受”.

broadcastTxProposal():状态:“已广播”.

交易id将在成功执行签名交易后生成,TXID:“57 FB 33 c 1199d 6 e 98 AE 245 DC 42835d 012 ed 3c ab 1314 e 245 ca 3605 de 3b 44884 b 4”

id:" beb 003 f 8-f7d 6-4578-a507-c 36319 a 9 fc 96 ".如果几个步骤都没有发送错误,则交易成功完成。两个钱包的余额变化为

“wallet 1”:0.11121494 BTC0.10121251 BTC,差额为0.01000243。

收款人“mm 16 S7 xsf 8 wjwxhprc 6 yzlw 9 gvncqzngbr”的钱包为“importWallet1”。

“进口wallet 1”:0.011 BTC0.021 BTC,相差0.01。

多出来的0.01000243-0.01=0.0000243 BTC就是这笔交易的手续费,243Satoshi。第四章。查询交易记录

现在我们来查看一下刚刚做的转账,看能不能查询成功。需要使用getTxHistory()方法。注意,必须将参数includeExtendedInfo设置为true,这将显示附加的事务细节,如输入和输出等。

点击此处添加标题

1。最后一次转账的交易记录

现在钱包有三笔交易记录。本人将上述转账的交易记录详细截图如下:

a 03 fc 8 ce-76DE-4348-B137-C 25491 C 41 F5 C[

inputs:{ address:" n3wrnsdhwjtckzmayhjqtcwunpg 91 kdms " },

这是本次交易的输入。您可以通过getBalance()方法的byAddress字段检查哪些子地址拥有wallet的余额。

outputs[0]:{ to address:" mm 16 S7 xsf 8 wjwxhprc 6 yzlw 9 gvncqzngbr " }

这是输出,而且是收款人的地址。

outputs[1]:{ address:" mi 7 zmqmbwfv 7 p 4 shj 8 iuqxpkusybdxe 44k ",path: "m/1/2"}

为什么我们传输一个地址时会出现两个输出?因为输入的余额会取出一部分进行转账,剩下的钱会转到这个地址,这个地址是钱包的另一个新的子账户地址。所以在转移之前是在“M/1/0”路径的“n3wR……kDMs”地址,这次转移之后转移到了“M/1/2”路径的“mi7Z……e44K”地址。

2。最初收到的交易记录

现在我们来看看接收转账的输出。一开始要求BTC测试货币的交易是收据。

A03FC8CE-76DE-4348-B137-C25491C41F5C

6fd 6b 634-b4ff-4c0e-acae-F4 B9 bed 65727

可以看出,自己路径“m/0/0”的地址“move……1KQz”是作为接收事务的输出。同时可以看到字段

动作:“发送”,代表发送。

动作:“已接收”,代表接收。

3。第二个交易记录

第一个和第三个交易的交易地址将在此交易记录中关联。

a121ce 5-feb 8-46EE-918 c-68 aab 52 e 5717

第一笔接收交易的输出:“move……1KQz”。也就是说,输出具有余额的地址。

第二笔转出交易输入:“move……1KQz”,输出(即变更后的地址):“n3wR……kDMs”。

第三笔转出交易输入:“n3wR……kDMs”。6FD6B634-B4FF-4C0E-ACAE-F4B9BED65727

其他类型的转让,你自己在测试。看看结果吧。

4。结论

比特币采用的是UTXO模型,不是账户模型,没有直接的“余额”概念。要获得余额,需要遍历整个交易历史。

UTXO:是spendtransaction output的缩写,指未花费的事务输出。

场景:假设你过去从A、B、C三个比特币用户那里买了BTC,A买了3.5 BTCs,B买了4.5 BTCs,C买了2 BTCs,现在你的比特币钱包里刚好剩下10 BTCs。

问题:这10个BTC是真的10个BTC吗?其实这句话听起来可能有点奇怪。(什么!我钱包里的BTC不是真的BTC。不要吓我.)

A121CCE5-FEB8-46EE-918C-68AAB52E5717解释:如前所述,比特币交易系统中没有账户和余额这两个概念。所以,你钱包里的10 BTC并不代表钱包余额就是10 BTC。而是这10个BTC其实就是分散在你的比特币地址(钱包地址|公钥)锁定的各个区块和交易中的UTXO的总和。

UTXO是比特币交易的基本单位。每个事务都会产生UTXO,一个UTXO可以是一个“cong”的任意倍数。 向某人发送比特币实际上创建了一个新的UTXO,它与该人的钱包地址绑定,可以被他用于新的支付。

一般的比特币交易由交易输入和交易输出组成。a付给你3.5 BTCs。这个交易实际上产生了一个新的UTXO。这个新UTXO等于3.5 BTCs(3.5亿丛),锁定到你的比特币钱包地址。

如果你想给你的女性(男性)朋友转账1.5 BTC,那么你的钱包将从可用的UTXO中选择一个或多个可用的个人,拼凑出大于或等于交易所需的比特币金额。比如在这个假设场景中,你的钱包会从你和C之间的交易中选择UTXO作为交易输入,输入=2BTC。这里会生成两个新的交易输出,一个输出(UTXO=1.5 BTC)绑定到你女朋友的钱包地址,另一个输出(UTXO=0.5 BTC)作为零钱重新绑定到你的钱包地址。

我们需要找到所有未使用的事务输出(UTXO)。Unspent(未花费)意味着这些事务输出永远不会被事务输入指向。

五、完整源代码

1。在controllers

的文件夹下新建一个transaction.js文件,实现比特币转账交易和查询交易记录的功能。

点击此处添加标题

点击此处添加标题

点击此处添加标题

点击此处添加标题

点击此处添加标题

点击此处添加标题

点击此处添加标题

点击此处添加标题

项目来源Github地址

版权声明:博客中的文章版权归博主所有,未经授权禁止转载。请联系作者获得许可并注明出处。

未经授权,禁止复制和改编。转载请注明出处。

比特币钱包开发:比特币转账交易与交易记录 | 分享给朋友: