比特币技术之迷-Transaction 交换
2014-05-21 20:54
281 查看
Transaction 交换
每个客户端都会广播本地生成的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
(待续)
每个客户端都会广播本地生成的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
(待续)
相关文章推荐
- 电路交换、报文交换、分组交换、异步传输模式等通信交换技术的区别
- 课题研究:面向对象的数据存储与交换技术
- 网络工程交换技术之vrrp
- 网络工程路由与交换技术小综合实验
- 浅谈双缓冲技术和页交换技术及其区别
- 读书笔记:计算机网络第3章:重发技术、多址技术、交换技术
- 交换学习笔记=++=实验二 交换机的通道技术
- 操作系统覆盖技术和交换技术
- 除了区块链和比特币,这些技术成果正在改变世界
- 基于XDS/XDS-I的区域医疗影像共享交换技术架构(1)
- 比特币学习-Transaction的locktime属性
- Docker EE 新测试版本上线,全新路由交换技术先睹为快!(附下载链接)
- 比特币,以太坊......区块链技术真的被认同了吗?
- 计算机网络中的交换技术
- 51CTO为您精心推荐:挨踢攻城师必备的路由交换技术视频课程
- ***技术:交换网络中的嗅探和ARP欺骗
- 深入理解内存(3):内存交换技术,虚拟内存
- 交换技术汇总:交换机的116个基本知识点
- 轻松理解区块链和比特币基础技术原理
- IFTNews:就好像理解比特币还不够困难一样,以太坊引入了一个全新的复杂性。即使你有扎实的技术背