比特币钱包开发:比特币转账交易与交易记录
课程目标
了解交易的输入输出,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 f
9d 40 f 41-d9a 0-4198-B72A-27 DBD 455 f 92[费: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测试货币的交易是收据。
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”。
其他类型的转让,你自己在测试。看看结果吧。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。不要吓我.)解释:如前所述,比特币交易系统中没有账户和余额这两个概念。所以,你钱包里的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地址版权声明:博客中的文章版权归博主所有,未经授权禁止转载。请联系作者获得许可并注明出处。
未经授权,禁止复制和改编。转载请注明出处。