LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 新闻观点 > 精通Filecoin:Filecoin 源码之 Hello 协议

精通Filecoin:Filecoin 源码之 Hello 协议

2019-12-10 黄鹂 来源:区块链网络

精通Filecoin:Filecoin 源码之 Hello 协议 | 火星技术帖



当调用 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 方法(这个对象继承自 plumbing.API 对象,ChainHead 方法定义于后者),用于返回区块链头部的 tipset;net 表示当前的网络环境,比如测试网、正式网;

调用 host 对象的 SetStreamHandler 方法,设置自身的 handleNewStream 方法作为 /fil/hello/1.0.0 协议的处理器。

h.SetStreamHandler(protocol, hello.handleNewStream)

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

调用 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 协议通过 sayHello 和 handleNewStream 开启了区块同步,前者把自身的区块情况发送到远程节点,后者处理远程节点发送的区块情况。


sayHello 方法处理如下:


调用 Host 对象的 NewStream,生成一个处理 Hello 协议的流对象。

s, err := h.host.NewStream(ctx, p, protocol)

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)

}


区块链存证后,能打赢官司吗?| 链+司法



文 秦晓峰 编辑 Mandy王梦蝶


顶层的重视让区块链再次受到关注。同时,打着区块链名义的传销、诈骗、非法集资等行为肆虐,真正的区块链大规模应用却未被看到,让大众对区块链产生了“并不知道能做什么”的疑惑。


Odaily星期日报自成立以来,持续跟踪区块链+产业的动态。据 Odaily星球日报的观察,相比于两年前,区块链的落地已有不少进展,只是一方面很多改进是在系统底层,用户没法直接看出用了区块链,实已受惠于它;一方面部分应用仍处试点,用户还未能体验。未来,区块链有望得到大规模应用,成为互联网基础设施之一。


因此,Odaily星球日报推出「链+」栏目,为用户介绍区块链+特定场景的尝试。本期的主题是「链+司法」。


随着数字化技术的发展,电子证据(声音、图片、视频等形式)的身影在诉讼案件中出现得越来越频繁。


根据《2018 年中国电子证据应用白皮书》,全国民事案件超 73% 涉及电子证据。


与此同时,电子证据举证在实际案件审理中也存在诸多难点。


由于易篡改,如何认定电子证据的真实性成了案件的首要难题;此外,电子证据也易消亡,通常需要多次备份存证并要保留原始存储媒介;再者,传统存证方式耗时久、效率低、成本高,也不适合电子证据的存证。


区块链技术所特有的不可篡改、去中心化存储等特性,恰恰与电子证据存证的痛点相契合。区块链可以降低电子证据存证成本、增强电子证据的真实性,从而提高诉讼效率。


目前,区块链+司法已在多个地市开始落地应用:杭州互联网法院「司法区块链」、北京互联网法院「天平链」、广州互联网法院「网通法链」等。


电子证据维权不易


很多律政剧都会出现这样的高潮一幕:主角在表面不利的形势下,拿出关键性证据,例如一段录像或语音,绝地反击,一段慷慨陈词后,法官当庭宣判,正义得到彰显。


但真实的案件审判,可没有剧里这么简单。


时常发生的情况是,该电子证据由于本身涉嫌偷拍不合法,最终导致证据无效;或者视频本身的真实性有待考证,需要经过权威的机构进行鉴定才能当作证据。


电子证据虽然看起来有力,但实际案件审判中,对其规定却非常严格。


比如,在 2012 年之前,我国法律中,电子数据不能作为独立证据参与诉讼。 即便 2012 年之后规定可以作为独立证据参与诉讼,但对电子数据的取证手段也进行了严格规定。


其规定的取证手段包含:1.扣押、封存原始存储介质;2.现场提取电子数据;3. 网络在线提取电子数据;4.冻结电子数据;5.调取电子数据;6.书式固定;7.拍照摄像;8.拷贝复制;9.委托分析。


并且,上述取证手段应当是由公证机构进行,由公证员按照申请人提供的书面操作程序进行操作,核对证据的真实性,最后由公证机构制作电子证据保全公证书。这也是案件的必经环节。


换言之,即便个人保留了相关电子证据,也应当在公证机构进行公证,重复上述过程,以确认证据的真实性。


而进行公证的这一环节,非常的耗时耗力,当事人疲于奔命,也导致案件在证据固定阶段就给当事人带来了相当大的负担。


另外,如果当事人取得证据的手段不合法,程序不正当,则证据可能无效,这也是大多数维权当事人所没有意识到问题。


此外,由于电子证据容易篡改。当事人在公证机构进行公证时,侵权方可能已经修改了相关内容。最终庭审举证时,原、被告双方证据出入较大。如果原告不能证实被告修改了证据,则最后可能败诉。


再者,由于电子证据的易耗性,当事人必须妥善保管原始电子数据并进行多份拷贝,无疑消耗了资金以及精力;一旦原始文件损坏,对于备份文件还得重新进行公证,再次增加了案件的难度。


但如果电子证据由公证机构或第三方进行保管,作为一种中心化的存证方式,一旦这个中心受到攻击,容易造成存证数据丢失或被篡改。


总而言之,电子证据在实际的诉讼案件应有过程中存在诸多问题,对于当事人的存证、举证能力都有较高的要求。


这一司法领域的难题,或许可以依靠区块链技术得以解决。


很多读者可能会问,用区块链进行电子证据存证,合不合法?


答案当然是肯定的。在 2018 年 9 月 7 日印发的《关于互联网法院审理案件若干问题的规定》中,最高人民法院首次承认了经区块链存证的电子数据可以用在互联网案件举证中,标志着我国区块链存证技术手段得到司法解释认可。


“电子数据是否可以通过特定形式得到验证。当事人提交的电子数据,通过电子签名、可信时间戳、哈希值校验、区块链等证据收集、固定和防篡改的技术手段或者通过电子取证存证平台认证,能够证明其真实性的,互联网法院应当确认。”


区块链赋能司法


作为一种新技术,区块链采用分布式账本技术,具有不可篡改、去中心化、去信任化等特性,满足了司法领域电子证据的存证需求。


在电子证据的生成、收集、传输、存储的全生命周期中,区块链及其扩展技术可以对电子数据进行安全防护、防止篡改、并进行数据操作的审计留痕,从而为相关机构审查提供有效手段。


下面,我们将以通以杭州互联网法院的「司法区块链」作为案例,解释具体的工作原理。


司法区块链是一条联盟链,是由蚂蚁金服旗下的蚂蚁区块链提供底层技术支撑,并由公证处、司法鉴定中心、授时中心等 20 多家个机构充当节点。


目前司法区块链主要可以解决三类纠纷:数字版权、金融合约以及网络服务合同




用户可以将自己的数字作品上传至司法区块链上,司法区块链各节点会对该作品进行审查,将需要存证的电子数据以交易的形式记录下来,打上时间戳,打包上链,生成唯一的哈希值反馈给用户。


基于数据加解密技术的隐私方案也是司法区块链的重要组成部分。其他用户只能看到一个哈希值,看不到哈希值所对应的原始电子数据,这也保护了当事人的隐私。目前,司法链上存证总量突破 19 亿条。


(区块链上只有哈希值)


除了确权以外,司法区块链也会同步开始侵权监测,一旦监测到其他人使用了该数字作品,即会自动固化证据,为后续起诉提供电子证据。


上述过程,其实相当于简化了公证机关的流程,从而高效地对证据进行固定。


另外,用户如果发现其他人侵犯了自己的著作权,可以立刻登陆杭州互联网法院在线起诉。


Odaily星球日报体验了起诉的全流程,从注册、选择案由、填写原告、被告等信息,整个案件起诉过程不到 20 分钟。


(起诉全流程)


值得注意的是,在提交证据时,当事人可以将之前已经登记过的作品版权哈希值或者侵权哈希值输入进去,不用重复上传证据,这也简化了办案流程。


(提交证据环节)


当然,除了司法区块链,杭州互联网法院也支持旗下的其他存证平台证据或者本地上传证据。


而从当事人起诉开始,调解、立案、送达、举证质证、庭审、判决、执行等影响审判质量效率、影响司法公信力的关键环节都会盖上区块链的“戳印”。


这些“戳印”包含了可信时间、可信身份、可信流程、可信环境等关键信息,并向区块链全体节点实时进行广播,全程留痕、安全可控、不可篡改,能够有效防范和减少纠纷的发生。全流程记录上链,进一步保证了司法的权威性和公开透明性。


此外,今年 10 月底杭州互联网法院进一步上线智能合约服务。司法区块链智能合约具有“信用黑名单”和“信用白名单”能力,目前已经在网络服务和网络金融领域运行。


智能合约中,双方签署的合同将以数字形式保存,触发相应条件后,合同可以自动履行。例如双方签署了买卖合同,合同以数字形式上链储存。如买方签收货物确认无误后,到约定日期时,货款会自动打到卖方账户。


在体验中,Odaily星球日报还注意到司法区块链中一个特别人性化要素。由于案件审理涉及到个人隐私,司法区块链对于此类案件也进行了加密保护,用户只能看到案件原由等,看不到相关隐私信息。




司法区块链也在实际应用中,提升了案件审判效率。杭州互联网法院常务副院长王江桥表示,运用司法区块链技术后,由于事实认定清楚、证据确凿,杭州互联网法院知识产权类纠纷的诉前调解撤诉率已超过90%。


目前,「区块链+司法」已经在全国各省市铺开,呈现出星火燎原之势。具体的案例有:


吉林省高级人民法院电子证据平台


山东省高级人民法院电子证据平台


北京互联网法院“天平链”电子证据平台


广州互联网法院“网通法链”


郑州市中级人民法院电子证据平台


成都市郫都区人民法院电子证据平台


各家的工作原理基本一致,都是首先在证据平台上由公证机关(第三方独立机构)通过区块链对电子证据进行固定,用户起诉后提交哈希值作为证据即可,从而增强了电子证据的真实性,提高了案件的审判效率。


仍有诸多挑战待解决




区块链在司法领域的应用,确实解决了不少纠纷,提高了效率,但也存在一些不足,亟待解决。


首先,区块链存证不等同于法律事实,存证数据的真实性有待考证。举个例子,记者于 11 月 26 日在吉林省高级人民法院电子证据平台上传了Odaily星球日报的一篇文章,并获得了两份证书,如下所示:但这份证书实际上无法证明文章确实是记者所写,只能证明记者第一个注册了区块链的版权认证。假设这篇文章并非原创,原作者留存具备成稿时间的证据,依旧可以起诉记者。


与很多区块链应用到实际场景中所遭遇的挑战一样,如何确保数据上链前的真实性,也是摆在「区块链+司法」前进道路上的一道难题。所以,在实际法庭示证环节,如果没有原件与哈希值相对应,存证也将无法达到目的。因此 Odaily星球日报也要提醒所有当事人,要妥善保管好电子原件,数据上链并不等于万无一失。其次,版权侵权监测的范围较为狭窄,对于侵权的界定也存在不确定性。记者在上传完文章后,区块链存证系统也只是在该系统体系内进行监测。虽然该文章此前曾发表在十几家平台,但系统仍未检测出来。(文章监测为0)不得已,记者只能手动搜索,对相关网页进行截图固定证据。


(做个示范,用自家平台进行截图监测)


另外,当记者将该文章删减拼接进行洗稿后,仍然可以再次获得区块链版权认证。侵权标准的界定不明晰,也是现实法律中所面临的难题。再者,存证系统彼此之间,不能互联互通,对跨地域办案形成一定阻碍。在吉林高院证据平台生成区块链哈希值后,笔者将其在杭州互联网法院提交,发现难以读取该证据,彼此割裂。对于跨地域的区块链证据,其效力究竟如何,目前各地法院尚未给出明确答案。如果不能互通,这是否意味着用户需要重新提交证据,但此时可能已经错过了最佳的证据固定时间,这又该如何是好?最后,区块链证据在民众中的接受度有待提高。作为一个新兴事物,区块链至今也才发展了十余年,各项技术本身尚不成熟;再加上此前的传销币也将区块链“污名化”,民众是否能够接受这一新技术还有待考验。即便民众愿意接受,关于区块链技术的的理解也存在一定的不足。也许,还要经过一段时间的适应才能最终熟练掌握。事物发展的过程,始终是螺旋式上升或波浪式前进的。区块链在司法领域的应用,虽然有些许问题,但终究是用技术手段提高效率的良方。未来,我们也许会看到一个在区块链技术加持下,更加完善的司法体系。


参考资料:浙江:“互联网+”法治助推社会治理现代化区块链司法存证应用白皮书 - 中国信息通信研究院


本文来源:Odaily星球日报

原文标题:区块链存证后,能打赢官司吗?| 链+司法


—-

编译者/作者:黄鹂

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...