• 比特币技术之迷-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
     

     (待续)

     

  • 相关阅读:
    springboot项目在IDEA根据不同的开发人员读取不同的配置文件
    Idea中一个服务按多个端口同时启动
    修改feign解析器替换json
    Intellij IDEA中启动多个微服务--开启Run Dashboard管理
    解决springboot乱码和window cmd乱码
    调用远程linux服务器shell脚本
    cp复制命令详解
    ftp列出具体目录的所有目录,和目录按照文件类型列出
    Linux下Redis开机自启(Centos)
    vsftpd 配置上传失败553
  • 原文地址:https://www.cnblogs.com/sonyye/p/3742594.html
Copyright © 2020-2023  润新知