作者:yewenpeng
每个客户端都会广播本地生成的Transaction,并转给来自其它节点的Transaction,本文主要描述Transaction之间的交换与流转过程。
到底也可以阅读文章,来理解Transaction是讲解被确定是合法的https://en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messages
钱包发送交易
客户端定期调用main.cpp中的 SendMessages()函数,此函数中又调用 ResendWalletTransactions来发送本地生成的transactions。
在这里他

只有当时间戳早于当前新接收到的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 privacyif (inv.type==MSG_TX && !fSendTrickle){
6.main.cpp的SendMessages()中的// always trickle our own transactionsif (!fTrickleWait){CWalletTx wtx;
if (GetTransaction(inv.hash, wtx))if (wtx.fFromMe)fTrickleWait=true;}
7.net.h中的RelayMessage 和 RelayInventory
(待续)
本文原载于:yewenpeng
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:http://www.fjxmta.com/zqkj/47549.html