你所在的位置:首页  >  新闻热点  >  资讯

新闻热点

NEWS HOTSPOT

2019-11-13

双十一自发起到现在积累了10年数据,每一年的数据拟合度均超过99.94%,几乎完美分布在三次回归曲线上,销售额与年份的增长趋势仿佛按预期设定的线性公式发展,是在现实生活中基本不可能发生的小概率事件。

来源:超金富

2019-11-12

一年一度最大的购物狂欢节“双十一”已经落下了帷幕,想必大家剁手都剁得很疼吧。而各大电商平台也在清点战果。双十一各家平台发布交易额数据又一次无意外地刷新了往年记录。

来源:超金富

2019-11-11

就在王思聪成为1.5亿债务的被执行人的新闻当晚,王思聪还在网上和人连麦打游戏来着。难道他真的不在乎自己成为老赖被全国人民嘲笑吗?

来源:超金富

2019-11-07

百度昨天公布了三季度财报。财报显示,三季度,百度总营收为281亿元人民币(约合39.3亿美元),与去年同期相比基本持平,与上一季度相比增长7%,也超出市场预期的38.9亿美元。三季度,GAAP归属公司净亏损为64亿元人民币(约合8.9亿美元),去年同期的净利润为124亿元人民币。非GAAP归属公司净利润同比增35%至44亿元人民币。

来源:超金富

2019-11-06

什么是二选一?简单来说就是“挟流量以令商家”,部分电商平台为了追逐商业利益、打击竞争对手,要求合作商家只能入驻一家网络销售平台。

来源:超金富

2019-11-05

本文由超金富编辑发布:改变世界的人有两,一个乔布斯,一个罗永浩。罗永浩输了为什么没人踩他乔布斯生于硅谷,邻居都是惠普资源,从小酷爱电子设备,时年21岁的乔布斯创立苹果公司,26岁公司上市。31岁被董事会扫地出门。32岁以1000万美金收购Lucasfilm团队,随后更名皮克斯动画工作室。41岁从回苹果,走马上任,42岁IMac上线带领苹果走出困境。51岁自己独立开办的动画公司成为被迪斯尼收购,成为迪斯尼最大个人股东。52岁iPhone搭载iOS霸气归来。55岁及iPhone4S发布一年后2011年8月25日离世。

来源:超金富

2019-11-04

也就是说,这位当年风光无限的新东方教师、锤子手机创始人,现在成了被限制消费和出行的“老赖”。即使是在当年风光时,人们对罗永浩也是褒贬不一,现在更是登上了多个媒体平台的热搜,也引起了广大网友们的热议。

来源:超金富

2019-10-31

据央视消息,明天,也就是11月1日,三大运营商5G套餐将正式上线,5G商业时代终于来临了。下面就是支持5G的城市,大家快来看看有没有自己的家乡

来源:超金富

2019-10-30

人到中年受此挫折的刘强东,也颇有感触。近日,某科技媒体报道,刘强东在明尼苏达事件半年后,曾经对自己的过去做出反思,总结出了自身有四大问题。下面我们来逐个分析这四大问题,毕竟过来人的经验是最宝贵的。

来源:超金富

2019-10-29

从上周末到现在,区块链引发全民热捧,人民日报、人民网发声降温。人民日报文章表示,区块链未来已来,但也要保持理性。区块链技术创新不等于炒作虚拟货币。区块链目前尚处于早期发展阶段,大方向没有错,但是要避免一哄而上、重复建设,能够在有序竞争中打开区块链的想象空间。

来源:超金富

精通Filecoin:Filecoin 源码之 Hello 协议

作者:超金富 文章来源:超金富

发布于:2019-12-06 今日阅读:880次

当调用 Filecoin 全节点的 start 方法启动全节点时,调用 hello 协议的 New 方法,这个方法的处理如下:
  1. 生成 Hello 对象。
    hello := &Handler{
        host:              h,
        genesis:           gen,
        chainSyncCB:       syncCallback,
        getHeaviestTipSet: getHeaviestTipSet,
        net:               net,
        commitSha:         commitSha,
    }
    
    其中 host 对象为底层 libp2 提供的 Host 对象;genesis 为创世区块的 CID;chainSyncCB 为全节点对象的 syncCallBack 函数,用于从远程节点同步区块;getHeaviestTipSetporcelain.API 对象的 ChainHead 方法(这个对象继承自 plumbing.API 对象,ChainHead 方法定义于后者),用于返回区块链头部的 tipset;net 表示当前的网络环境,比如测试网、正式网;
  2. 调用 host 对象的 SetStreamHandler 方法,设置自身的 handleNewStream 方法作为 /fil/hello/1.0.0 协议的处理器。
    h.SetStreamHandler(protocol, hello.handleNewStream)
    
    当连接建立时,通过后面注册的通知者,从而调用 sayHello 方法,在这个方法中打开一个 hello 协议的流,并发送 hello 消息。
  3. 调用 Host 对象的网络对象(即 swarm 对象)的 Notify 方法,把自身作为被通知者注册到网络对象上。
    h.Network().Notify((*helloNotify)(hello))
    
    在这一步,通过调用 host 对象的 Network 方法,返回底层的 swarm 对象,然后把 hello 对象转化为 helloNotify 对象,最后调用 swarm 对象的 Notify 方法,从而当底层的 swarm 对象有任何事件发生时都会通知 helloNotify 对象(即 hello 对象)。

    在 Hello 协议中我们只关心建立连接事件,所以 helloNotify 类型只实现了这个方法,其他方法都为空实现,具体如下:

    type helloNotify Handler

    func (hn *helloNotify) hello() *Handler {     return (*Handler)(hn) }

    const helloTimeout = time.Second * 10

    func (hn *helloNotify) Connected(n net.Network, c net.Conn) {     go func() {         ctx, cancel := context.WithTimeout(context.Background(), helloTimeout)         defer cancel()         p := c.RemotePeer()         if err := hn.hello().sayHello(ctx, p); err != nil {             log.Warningf("failed to send hello handshake to peer %s: %s", p, err)         }     }() }

    当节点作为客户端,拨号连接到远程对等节点时,底层的 swarm 对象会调用自身的 notifyAll 方法,通知所有的 Notify 对象有连接被打开,即调用所有 Notify 对象的 Connected 方法,包括前面我们注册的通知对象。当调用 helloNotify 对象的 Connected 方法时,这个方法内部调用自身的 hello 方法,后者返回自身并强制转化为 Handler 类型,然后调用它的 sayHello 方法,对我们当前连接的远程进行打招呼。

    与此同时,当远程节点作为服务器,接收到我们发送的连接请求生成连接时,它的 swarm 对象也会通知它的所有 Notify 对象,从而也会它的前面注册的通知对象,即调用服务器商的 Connected 方法,从而调用它的 sayHello 方法向我们发送它的区块情况;因为第二步中,我们把 Hello 对象的 handleNewStream 方法注册为 Hello 协议的处理器,所以当节点接收到远程节点发送区块情况时,就会调用这个方法进行处理,这个方法又会调用调用全节点的 syncCallBack 方法进行区块同步处理。

总体上来说,Hello 协议通过 sayHellohandleNewStream 开启了区块同步,前者把自身的区块情况发送到远程节点,后者处理远程节点发送的区块情况。

sayHello 方法处理如下:

  1. 调用 Host 对象的 NewStream,生成一个处理 Hello 协议的流对象。
    s, err := h.host.NewStream(ctx, p, protocol)
    if err != nil {
        return err
    }
    defer s.Close() // nolint: errcheck
    
  2. 调用自身的 getOurHelloMessage 方法,获取自身区块链顶端的信息。
    msg := h.getOurHelloMessage()
    
    这个方法内部执行流程如下:
    • 调用自身 getHeaviestTipSet 方法,获取区块链顶端的信息这个方法是 plumbing.API 对象 ChainHead 方法的引用。
    • 使用获取到的区块链信息,生成并返回消息对象 Message
  3. 通过流发送区块信息到远程节点。
handleNewStream 方法处理如下:
  1. 生成消息对象 Message,并从流中读取远程对等节点发送过来的内容到消息对象中。
    var hello Message
    if err := cbu.NewMsgReader(s).ReadMsg(&hello); err != nil {
        log.Debugf("bad hello message from peer %s: %s", from, err)
        helloMsgErrCt.Inc(context.TODO(), 1)
        s.Conn().Close() // nolint: errcheck
        return
    }
    
  2. 调用自身的 processHelloMessage 方法,处理远程节点发送的消息。这个方法代码如下:
    func (h *Handler) processHelloMessage(from peer.ID, msg *Message) error {
        if !msg.GenesisHash.Equals(h.genesis) {
            return ErrBadGenesis
        }
        if (h.net == "devnet-test" || h.net == "devnet-user") && msg.CommitSha != h.commitSha {
            return ErrWrongVersion
        }
    h.chainSyncCB(from, msg.HeaviestTipSetCids, msg.HeaviestTipSetHeight)
    return nil
    
    }
    
    它的处理逻辑比较简单:
    • 首先,检查远程节点发送的创世区块哈希是否自身的创世区块哈希相等。如果不等,直接返回错误。
    • 然后,检查网络类型。
    • 最终,调用自身的 chainSyncCB 方法,处理远程节点发送的区块信息。这个同步回调方法对象在全节点的启动方法 Start 中生成。它的主要生成就是根据远程节点发送的区块链最顶层的信息,生成一个 types/SortedCidSet 对象,然后调用 chain/syncer.go 中的 HandleNewTipset 方法来处理远程发送的区块信息。
  3. 根据前面处理消息的结果进行不同的处理。
    switch err := h.processHelloMessage(from, &hello); err {
    case ErrBadGenesis:
        log.Debugf("genesis cid: %s does not match: %s, disconnecting from peer: %s", &hello.GenesisHash, h.genesis, from)
        genesisErrCt.Inc(context.TODO(), 1)
        s.Conn().Close() // nolint: errcheck
        return
    case ErrWrongVersion:
        log.Debugf("code not at same version: peer has version %s, daemon has version %s, disconnecting from peer: %s", hello.CommitSha, h.commitSha, from)
        versionErrCt.Inc(context.TODO(), 1)
        s.Conn().Close() // nolint: errcheck
        return
    case nil: // ok, noop
    default:
        log.Error(err)
    }   
    

阅读全文

Copyright © 2019 超金富 chaojinfu.com

最新行内资讯、行情分析、行业人物分析尽在超金富,版权所有,违法必究

网站地图 | 关于我们 | 合作伙伴 | 广告服务