当前位置:首页区块链比特币技术之迷-Transaction 交换

比特币技术之迷-Transaction 交换

作者:yewenpeng

每个客户端都会广播本地生成的Transaction,并转给来自其它节点的Transaction,本文主要描述Transaction之间的交换与流转过程。

到底也可以阅读**文章,来理解Transaction是讲解被确定是合法的
https://en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messages

钱包发送交易

客户端定期调用main.cpp中的 SendMessages()函数,此函数中又调用 ResendWalletTransactions来发送本地生成的transactions。

在这里他会检查看最近以来是否有一个新的block,如果有,并且本地的transaction还不在block中,那么交易会被发送到所以连接上的节点,这个检查只会每30分钟做一次。

只有当时间戳早于当前新接收到的block 5分钟上面这些,transaction才会被再次广播出去。发送顺序将会是越老的交易,越先被发送。

定时广播

客户端定期调用main.cpp中的 SendMessages()函数,这个函数还会决定是否一个消息会被发送给其它节点。

对于每个消息处理流程中,会有一个被选为trickle node的节点,这个节点是被选出来,只用来接收addr消息。

客户端随机抽取1/4的交易数据来发送,除非远端节点是trickle node,trickle node会接收所有的transactions,这里看起来是很奇怪,不过的确是这样。如果一个节点只接收1/4(而不是所有的数据),同时这1/4数据中,代码实现时,也剔除了所有来自本地钱包的交易数据的发送,注释上标明这是为了增加隐私。

转发消息

如果一个客户端收到一个tx的交易消息,它被称为RelayMessage,也叫RelayInventory,也会放入一个即将发送给其它节点的消息池子中去。

一些关键性代码说明:

1.wallet.cpp中的CWallet::ResendWalletTransactions

2.pnodeTrickle=? [GetRand(vNodesCopy.size())];
SendMessages(pnode, pnode==pnodeTrickle);
代码在net.cpp中ThreadMessageHandler2()

3.main.cpp的SendMessages()中的
if (fSendTrickle)

4. main.cpp的SendMessages()中的
bool fTrickleWait=((hashRand & 3) !=0)

5.main.cpp的SendMessages()中的
// trickle out tx inv to protect privacy
if (inv.type==MSG_TX && !fSendTrickle)
{

6.main.cpp的SendMessages()中的
// always trickle our own transactions
if (!fTrickleWait)
{
CWalletTx wtx;

if (GetTransaction(inv.hash, wtx))
if (wtx.fFromMe)
fTrickleWait=true;
}

7.net.h中的RelayMessage 和 RelayInventory

(待续)

本文原载于:yewenpeng

免责声明: 文章源于会员发布,不作为任何投资建议,如有侵权请联系我们删除!

温馨提示:

文章标题:比特币技术之迷-Transaction 交换

文章链接:https://www.btchangqing.cn/437500.html

更新时间:2023年01月09日

本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。

区块链

私募基金备案查询官方网站(公募基金备案查询网址)

2023-1-9 5:30:18

区块链

基金亏了死守会回本吗(定投基金亏了死守会回本吗)

2023-1-9 5:50:47

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索