精通Filecoin:Filecoin 源码之 Hello 协议_HEL:Motion

当调用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)

去中心化以太坊质押基础设施SSV Network将进行主网第二阶段发布会议:7月24日消息,去中心化以太坊质押基础设施SSV Network发推称,将于8月1日进行主网第二阶段“有限启动”发布会议,第二阶段将引入经验证的运营商,带来指数级SSV网络扩展。

据此前消息,去中心化以太坊质押基础设施SSV Network发布主网上线计划表,将分四个阶段推出主网,分别是预启动、有限启动、启动、无需许可的启动四个阶段。团队将于2023年第二季度初开启主网推出的第一阶段,到2023年第四季度准备无需许可启动。[2023/7/24 15:54:39]

当连接建立时,通过后面注册的通知者,从而调用sayHello方法,在这个方法中打开一个hello协议的流,并发送hello消息。

调用Host对象的网络对象的Notify方法,把自身作为被通知者注册到网络对象上。h.Network().Notify((*helloNotify)(hello))

在这一步,通过调用host对象的Network方法,返回底层的swarm对象,然后把hello对象转化为helloNotify对象,最后调用swarm对象的Notify方法,从而当底层的swarm对象有任何事件发生时都会通知helloNotify对象。

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

共识实验室联创Kevin:比特币重新调整了金融分配系统:金色财经报道,在由比特大陆联合金色财经举办的《比特币诞生14周年》主题活动上,共识实验室联合创始人Kevin Ren表示,比特币重新调整了金融分配系统,它用一个开源的协议,创造了一个透明的金融规则。比特币通过挖矿奖励的方式维护了系统的运行,凡是参与到比特币生态中的人,都可以监督和修复这个系统。

其实我们现在看到的比特币代码是不断迭代后的代码,比特币也在不断的优化中。闪电网络提高了比特币的可扩展性,闪电网络公开的流动性已经接近5000枚了,而且基于闪电网络的各种协议以及AMM解决方案等项目都已经开始跑起来了。所以,比特币在保持价值储存的这个初衷下,在应用性方向也在探索,不过应用性不应该作为判断比特币是否是好的标准。[2023/1/3 22:23:28]

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)????????}????}(。

股票交易平台Superhero取消与加密交易所Swyftx的合并:12月21日消息,股票交易平台Superhero在给客户的电子邮件中表示,因为澳大利亚和全球加强了监管审查,Superhero不会继续与加密货币交易所Swyftx合并。该公司还向用户保证,他们的资金是安全的,因为他们的数据和资产都没有提供给Swyftx。

此前6月份消息,Swyftx宣布将与Superhero合并,合并后将在该国创建价值10亿美元的加密货币“超级应用程序”。[2022/12/21 21:58:26]

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

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

朱烨东博士:2022年数字资产发行销售额将超过28.42亿元:金色财经报道,2022年中国国际服务贸易交易会正在举办。大会发布了《中国金融科技发展报告(2022)》《中国区块链发展报告(2022)》《中国元宇宙发展报告(2022)》三部年度蓝皮书,三部蓝皮书的执行主编、北京区块链技术应用协会会长朱烨东博士在会上做了“中国元宇宙、区块链、金融科技行业发展现状及趋势”主旨演讲。在区块链方面,朱烨东表示区块链的技术已经逐步走向成熟,区块链已开始从“信任走向协作”的新发展阶段,区块链正加速突破应用,区块链赋能文化产业,据统计,2021年我国的数字产品的规模约是1.5亿元,今年整个数字藏品行业的发展速度远远超出市场预期,2022年数字资产发行销售额将超过28.42亿元,并在未来5年保持150%以上的增速。[2022/9/5 13:08:22]

总体上来说,Hello协议通过

sayHello和

handleNewStream开启了区块同步,前者把自身的区块情况发送到远程节点,后者处理远程节点发送的区块情况。

sayHello方法处理如下:

调用Host对象的NewStream,生成一个处理Hello协议的流对象。s,?err?:=?h.host.NewStream(ctx,?p,?protocol)

加密反诈安全初创公司SEON完成9400万美元B轮融资,IVP领投:8月8日消息,加密反诈安全初创公司 SEON 宣布完成 9400 万美元 B 轮融资,IVP 领投,现有投资方 Creandum 和 PortfoLion 参投。

SEON 公司两位联合创始人 Tamas Kadar 和 Bence Jendruszak 对加密货币有浓厚兴趣,并曾合作构建过一个加密货币交易平台,由于其在加密货币交易平台方面的经验了解到欺诈预防策略对企业发展的重要性。该公司主要帮助 Revolut、NuBank 等涉及加密业务的金融科技公司提供线上防欺诈解决方案,其客户也包括 Patreon、AirFrance、KLM 等传统企业。(finsmes)[2022/8/8 12:10:33]

if?err?!=?nil?{

????return?err

}

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)

}???

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

水星链

[0:31ms0-0:994ms