当调用Filecoin全节点的
start方法启动全节点时,调用hello协议的
New方法,这个方法的处理如下:
生成Hello对象。hello?:=?&Handler{
????host:??????????????h,
????genesis:???????????gen,
????chainSyncCB:???????syncCallback,
????getHeaviestTipSet:?getHeaviestTipSet,
????net:???????????????net,
????commitSha:?????????commitSha,
}
其中host对象为底层libp2提供的Host对象;genesis为创世区块的CID;chainSyncCB为全节点对象的syncCallBack函数,用于从远程节点同步区块;getHeaviestTipSet为porcelain.API对象的ChainHead方法,用于返回区块链头部的tipset;net表示当前的网络环境,比如测试网、正式网;
调用host对象的SetStreamHandler方法,设置自身的handleNewStream方法作为/fil/hello/1.0.0协议的处理器。h.SetStreamHandler(protocol,?hello.handleNewStream)
灰度公布第二季度旗下三个基金加密资产构成及权重:7月7日消息,数字货币资产管理公司Grayscale Investments、Grayscal Digital Large Cap Fund管理商、Grayscale DeFi Fund 与Grayscale智能合约平台Ex-Ethereum Fund(GSCPxE Fund)今日宣布与其各自的2023年第二季度资金审查相关的每个产品更新基金成分权重。
截至7月6日,Digital Large Cap Fund的基金构成为:70.05%的BTC、27.02%的ETH、1.19%的ADA、0.99%的SOL与0.75%的MATIC。
DeFi Fund基金构成为:45.46%的UNI、19.04%的LDO、11.53%的AAVE、10.82%的MKR、7.03%的CRV与6.12%的SNX。
GSCPxE Fund的基金构成为:25.89%的ADA、21.58%的SOL、16.38%的MATIC、16.28%的DOT、11.38%的AVAX与8.49%的ATOM。[2023/7/7 22:24:41]
当连接建立时,通过后面注册的通知者,从而调用sayHello方法,在这个方法中打开一个hello协议的流,并发送hello消息。
调用Host对象的网络对象的Notify方法,把自身作为被通知者注册到网络对象上。h.Network().Notify((*helloNotify)(hello))
跨链交易基础设施zkLink完成1000万美元融资:金色财经报道,基于零知识证明的多链交易基础设施 zkLink 完成 1000 万美元融资,Coinbase Ventures、Ascensive Assets、SIG DTI、BigBrain Holdings、Efficient Frontier 等参投,zkLink 的总融资额已达到 1850 万美元。[2023/5/4 14:43:06]
在这一步,通过调用host对象的Network方法,返回底层的swarm对象,然后把hello对象转化为helloNotify对象,最后调用swarm对象的Notify方法,从而当底层的swarm对象有任何事件发生时都会通知helloNotify对象。
在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)????????}????}(。
央行数研所公布多项专利,涉及数字人民币离线交易安全:金色财经报道,中国人民银行数字货币研究所近日公布多项专利,均于2021年4月16日申请。一是“一种管理数字货币交易次数的方法、终端及货币管理装置”,二是“一种管理数字货币离线时长的方法、终端和货币管理装置”,三是“一种交易过程中拆分数字货币的方法、终端及系统”,四是“一种安全芯片、终端及货币管理装置及其应用方法”,发明人为穆长春、狄刚等。[2022/11/10 12:44:22]
当节点作为客户端,拨号连接到远程对等节点时,底层的swarm对象会调用自身的notifyAll方法,通知所有的Notify对象有连接被打开,即调用所有Notify对象的Connected方法,包括前面我们注册的通知对象。当调用helloNotify对象的Connected方法时,这个方法内部调用自身的hello方法,后者返回自身并强制转化为Handler类型,然后调用它的sayHello方法,对我们当前连接的远程进行打招呼。
与此同时,当远程节点作为服务器,接收到我们发送的连接请求生成连接时,它的swarm对象也会通知它的所有Notify对象,从而也会它的前面注册的通知对象,即调用服务器商的Connected方法,从而调用它的sayHello方法向我们发送它的区块情况;因为第二步中,我们把Hello对象的handleNewStream方法注册为Hello协议的处理器,所以当节点接收到远程节点发送区块情况时,就会调用这个方法进行处理,这个方法又会调用调用全节点的syncCallBack方法进行区块同步处理。
Mercury宣布完成750 万美元种子轮融资:金色财经报道,体育粉丝体验平台Mercury完成750万美元种子轮融资,Multicoin Capital领投,North Island Ventures、Crosslink Capital 和 Brevan Howard Digital等参投。
新资金将用于扩大他们与新学校的合作伙伴关系,并继续增加他们的学生运动员名册。还将增加领导层的招聘。Mercury最近聘请了体育媒体名人Adam Breneman担任NIL和媒体副总裁。将与顶尖运动员合作,在平台以及Mercury的Next Up播客系列中培养他们的品牌。[2022/10/20 16:32:42]
总体上来说,Hello协议通过
sayHello和
handleNewStream开启了区块同步,前者把自身的区块情况发送到远程节点,后者处理远程节点发送的区块情况。
sayHello方法处理如下:
调用Host对象的NewStream,生成一个处理Hello协议的流对象。s,?err?:=?h.host.NewStream(ctx,?p,?protocol)
if?err?!=?nil?{
????return?err
上海十四五规划:布局分布式存储、DNS和加密通信等Web3关键技术:7月13日消息,上海市人民政府办公厅印发《上海市数字经济发展十四五规划》,规划提出,上海将在十四五期间应围绕数字新产业、数据新要素、数字新基建、智能新终端等重点领域,加强数据、技术、企业、空间载体等关键要素协同联动,加快进行数字经济发展布局。
提升数字新基建应加强网络新型基础设施部署、技术研发和应用创新,打造面向未来的网络生态。超前布局新一代网络形态,前沿探索多平台 OpenID(数字身份识别框架)、分布式数据存储、去中心化 DNS(域名解析系统)、端到端加密通信等 Web3.0(第三代万维网)关键技术,加快突破分布式网络核心技术。[2022/7/13 2:10:03]
}
defer?s.Close()?//?nolint:?errcheck
调用自身的getOurHelloMessage方法,获取自身区块链顶端的信息。msg?:=?h.getOurHelloMessage()
这个方法内部执行流程如下:
调用自身getHeaviestTipSet方法,获取区块链顶端的信息这个方法是plumbing.API对象ChainHead方法的引用。
使用获取到的区块链信息,生成并返回消息对象Message。
通过流发送区块信息到远程节点。
handleNewStream方法处理如下:
生成消息对象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
}
调用自身的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方法来处理远程发送的区块信息。
根据前面处理消息的结果进行不同的处理。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)
}???
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。