比特币技术之迷-Transaction 交换
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 交换的更多相关文章
- 比特币运行原理[z]
https://baijiahao.baidu.com/s?id=1581755535769652543&wfr=spider&for=pc 这篇文章主要讲解比特币是什么?它的运行原理 ...
- 软交换和IMS是什么关系
软交换是一种功能实体,为下一代网络NGN提供具有实时性要求的业务的呼叫控制和连接控制功能,是下一代网络呼叫与控制的核心. 简单地看,软交换是实现传统程控交换机的"呼叫控制"功能的实 ...
- OTN交换&P-OTN有效减少100G网络成本(一)
近年来.网络运营商一直严重依赖基于ROADM的光传送设备,利用固定的点到点WDN联接.利用10G波长在整个城域网和广域网中汇聚及传送client业务.假设这些网络经过精细的设计规划,也能够合理.有效地 ...
- 高速掌握sinox2014激动人心的ZFS和RAID技术
Sinox2014引入激动人心的zfs系统以及其支持的RAID,让用户高速打造便宜的高可靠性文件server. ZFS文件系统的英文名称为Zettabyte File System,也叫动态文件系统( ...
- SmartRaiden 和 Lighting Network 进行去中心化跨链原子资产交换
作者介绍 虫洞社区·签约作者 steven bai 前言 如果能够进行以太坊和比特币跨链原子资产交换,是不是一件很酷的事情? 目前链下的扩容方式有很多,最广为人知的就是比特币的闪电网络和以太坊的雷电网 ...
- 【翻译】A Next-Generation Smart Contract and Decentralized Application Platform
原文链接:https://github.com/ethereum/wiki/wiki/White-Paper 当中本聪在2009年1月启动比特币区块链时,他同时向世界引入了两种未经测试的革命性的新概念 ...
- [中文] 以太坊(Ethereum )白皮书
以太坊(Ethereum ):下一代智能合约和去中心化应用平台 翻译|巨蟹 .少平 译者注|中文读者可以到以太坊爱好者社区(www.ethfans.org)获取最新的以太坊信息. 当中本聪在2009年 ...
- 区块链的java实现
原文地址:http://blog.csdn.net/xiangzhihong8/article/details/53931213 本文90%来着于翻译,原文地址:http://java-lang-pr ...
- rocketmq总结(消息的高可用、中间件选型)
rocketmq总结(消息的高可用.中间件选型) 参考: https://blog.csdn.net/meilong_whpu/article/details/76922456 http://blog ...
随机推荐
- php foreach 跳出本次循环/当前循环与终止循环的方法
PHP中用foreach()循环中,想要在循环的时候,当满足某个条件时,想要跳出本次循环继续执行下次循环,或者满足某个条件的时候,终止foreach()循环,分别会用到:continue 与 brea ...
- redis事务和redis集群
一.事务(相对mysql来说简单) 1. 比较 ①:mysql ----->start trantation ---->普通sql ------->回滚rollback------& ...
- Nginx安装过程
1. 首先 ./configure --prefix=/usr/common/nginx --with-http_stub_status_module 报如下错误: 2. 从报的错可以看出缺少pcre ...
- 2017中国大学生程序设计竞赛 - 女生专场(Graph Theory)
Graph Theory Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- python开发模块基础:序列化模块json,pickle,shelve
一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文 ...
- python学习(十五) 屏幕抓取
15.1 屏幕抓取 15.1.1 Tidy和XHTML解析 Tidy:用来修复不规范且随意的HTML文档的工具. 为什么用XHTML: 和旧版本的HTML之间最主要的区别:HTML可能只用一个开始标签 ...
- VS2012编译Lua5.3.1
编译静态库: 1.新建Win32控制台应用程序Lua5.3,下一步,应用程序类型选择:DLL,空项目,完成. 2.项目名右键属性,配置属性--项目默认值--配置类型:静态库(.lib) 3.头文件上右 ...
- 浏览器访问IPv6地址
http://[IPv6]:port/index.html http://[3ffe:3201:1200:1::91]:8080/index.html 目前现在的网络运营商基本都不支持基于IPv6地址 ...
- java的mysql初探
在实现如下demo之前,要安装mysql的驱动mysql-connector-java-gpl-5.1.26.msi DEMO: /* * 简单数据库测试 * @李志杰 * 2013-8-4 */ p ...
- srvctl和crs_start命令无法启动oracle RAC实例, 但sqlplus可以启动
今天遇到一个奇怪问题,发现srvctl和crs_start命令无法启动Oracle RAC实例,但用sqlplus却可以正常启动.最终发现原因是在OCR中数据库的状态变成了disable,将此状态更改 ...