IPFS 源码解读之—— ipfs refs local(显示所有本地对象的哈希)

 

  1. 先执行 go-ipfs/cmd/ipfs/ipfs.go 中的 init()函数,此函数完成子命令的注册

  2. 接着执行 go-ipfs/cmd/ipfs/main.go 中的 main() 函数,入口

  3. 接着执行 gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds/cli/run.go 中的 run() 函数

  4. 接着执行 go-ipfs/core/commands/refs.go 中的 RefsLocalCmd 的 Run() 函数

  5. 接着执行 gx/ipfs/QmS2aqUZLJp8kF1ihE5rvDGE5LvmKDPnx32w9Z1BW9xLV5/go-ipfs-block-ipfs-blockstore/blockstore.go 中的 AllKeyChan() 函数,这个函数的功能是通过查询指定的 context.Context 中的所有密钥

  6. 接着执行 gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/exapmles/fs.go 中的 query() 函数(其函数的定义在上层目录中的 Datastore 接口的定义中),在这个函数中主要的实现函数是:go func(){…}()

  7. 接着执行gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query/query.go 中的 ResultsWithChan() 函数,此函数太复杂,没看懂

  8. 接着执行gx/ipfs/Qmf4xQhNomPNhrtZc67qSnfJSjxjXs9LWvknJtSXwimPrM/go-datastore/query/query-impl.go 中的 NaiveQueryApply() 函数,此函数分别调用了 NaiveFilter()、NaiveOrder()、NaiveOffset()、NaiveLimit(),对Results 对象用 Query 对象中的限制进行过滤,得到过滤后的Results 对象并返回至blockstore.go 中的 AllKeysChan() 函数中。

  9. 接着执行gx/ipfs/QmauEMWPoSqggfpSDHMMXuDn12DTd7TaFBvn39eeurzKT2/go-ipfs-ds-help/key.go 中的 DsKeyToCid() 函数,这个函数执行的功能是将指定的key 转换成其对应的 cid。紧接着会调用此文件中的 BinaryFromDsKey() 函数,此函数的功能是获取指定 key 的字节片。

  10. 接着执行gx/ipfs/QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6/base32/base32.go 中的 DecodeString() 函数,此函数的功能是将一个字符串 s 转换成 base32 编码格式的 []byte。紧接着会调用此文件中的 decodeInPlace() 函数,此函数的功能是去掉字符数组中的 ‘\r’ 和 ‘\n’,然后调用本文件中的 decode() 函数,此函数的功能是对去掉 ‘\r’ 和 ‘\n’ 的数组进行解码操作。操作完成后返回 DsKeyToCid() 函数中。

  11. 接着执行gx/ipfs/QmR8BauakNcBa3RbE4nbQu76PDiJgoQgz8AJdhJuiU4TAw/go-cid/cid.go 中的 Cast() 函数,此函数主要是将获得的数据切片进行解析并返回 Cid(一个由 Version, Codec, Multihash组成的字符串) 对象。

    1. 若数据切片的长度为 34 且前两个字节分别是 18 和 32 时,调用gx/ipfs/QmerPMzPk1mJVowm8KgmoknWa4yCYvvugMPsgWmDNUvDLW/go-multihash/multihash.go 中的 Cast() 函数,此函数的功能是将数据缓冲区的数据强制转换成 Multihash 对象。在函数中会首先调用 Decode() 函数将缓冲区的数据切片转换成 DecodeMultihash 对象,再验证得到的 DecodeMultihash 对象中的数据,通过验证后,再将 DecodeMultihash 对象转换为 Multihash 对象并返回得到的 Multihash 对象。然后将得到的Multihash 对象封装成 Cid 对象并返回此对象。

    2. 否则直接将数据缓冲区的内容转换成一个 uint64, 并分别解析前两个字节,并将解析的结果重新组织成一个 Cid 对象并返回此对象。

  12. 将步骤11得到的 Cid 对象放到申请的一个由 Cid 对象组成的 channel 中,并返回它。

  13. 打印所有的hash 值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IPFS(InterPlanetary File System)是一个基于内容寻址的、分布式的、新型超媒体传输协议。IPFS支持创建完全分布式的应用。它旨在使网络更快、更安全、更开放。IPFS是一个分布式文件系统,它的目标是将所有计算设备连接到同一个文件系统,从而成为一个全球统一的存储系统。某种意义上讲,这与Web最初的目标非常相似,但是它是利用BitTorrent协议进行Git数据对象的交换来达到这一个目的的。IPFS正在成为现在互联网的一个子系统。IPFS有一个更加宏伟而疯狂的目标:补充和完善现有的互联网,甚至最终取代它,从而成为新一代的互联网。这听起来有些不可思议,甚至有些疯狂,但的确是IPFS正在做的事情。图1-1所示为IPFS的官方介绍。 图1-1 IPFS官方介绍IPFS项目通过整合已有的技术(BitTorrent、DHT、Git和SFS),创建一种点对点超媒体协议,试图打造一个更加快速、安全、开放的下一代互联网,实现互联网中永久可用、数据可以永久保存的全球文件存储系统。同时,该协议有内容寻址、版本化特性,尝试补充甚至最终取代伴随了我们20多年的超文本传输协议(即HTTP协议)。IPFS是一个协议,也是一个P2P网络,它类似于现在的BT网络,只是拥有更强大的功能,使得IPFS拥有可以取代HTTP的潜力。Filecoin是运行在IPFS上的一个激励层,是一个基于区块链的分布式存储网络,它把云存储变为一个算法市场,代币(FIL)在这里起到了很重要的作用。代币是沟通资源(存储和检索)使用者(IPFS用户)和资源的提供者(Filecoin矿工)之间的中介桥梁,Filecoin协议拥有两个交易市场—数据检索和数据存储,交易双方在市场里面提交自己的需求,达成交易。IPFS和Filecoin相互促进,共同成长,解决了互联网的数据存储和数据分发的问题,特别是对于无数的区块链项目,IPFS和Filecoin将作为一个基础设施存在。这就是为什么我们看到越来越多的区块链项目采取了IPFS作为存储解决方案,因为它提供了更加便宜、安全、可快速集成的存储解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值