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 值。

你可能感兴趣的:(IPFS,去中心化,分布式文件系统)