diff --git a/examples/traverse-ipld-graphs/README.md b/examples/traverse-ipld-graphs/README.md index f24302c6..6d4e624c 100644 --- a/examples/traverse-ipld-graphs/README.md +++ b/examples/traverse-ipld-graphs/README.md @@ -34,6 +34,8 @@ - [retrieve a node from a graph](#retrieve-a-node-from-a-graph) - [resolve a path in a graph](#resolve-a-path-in-a-graph) - [resolve through graphs of different kind](#resolve-through-graphs-of-different-kind) +- [traverse through a slice of the ethereum blockchain](#traverse-through-a-slice-of-the-ethereum-blockchain) +- [traverse through a git repo](#traverse-through-a-git-repo) - [Video of the demos](#video-of-the-demos) - [Documentation](#documentation) - [Contributing](#contributing) @@ -106,6 +108,14 @@ See [ipld/interface-ipld-format](https://github.com/ipld/interface-ipld-format) ### [resolve through graphs of different kind](./get-path-accross-formats.js) +## [traverse through a slice of the ethereum blockchain](./eth.js) + +## [traverse through a git repo](./git.js) + +The example objects contained in "git-objects" have already been decompressed with zlib. An example of how to do this: + + $ cat .git/objects/7d/df25817f57c2090a9568cdb17106a76dad7d04 | zlib-flate -uncompress > 7ddf25817f57c2090a9568cdb17106a76dad7d04 + ### Video of the demos Find a video with a walkthrough of this examples on Youtube: diff --git a/examples/traverse-ipld-graphs/eth-blocks/block_302515 b/examples/traverse-ipld-graphs/eth-blocks/block_302515 new file mode 100644 index 00000000..1e6b8fdc Binary files /dev/null and b/examples/traverse-ipld-graphs/eth-blocks/block_302515 differ diff --git a/examples/traverse-ipld-graphs/eth-blocks/block_302516 b/examples/traverse-ipld-graphs/eth-blocks/block_302516 new file mode 100644 index 00000000..9c4a6676 Binary files /dev/null and b/examples/traverse-ipld-graphs/eth-blocks/block_302516 differ diff --git a/examples/traverse-ipld-graphs/eth-blocks/block_302517 b/examples/traverse-ipld-graphs/eth-blocks/block_302517 new file mode 100644 index 00000000..3df292fd Binary files /dev/null and b/examples/traverse-ipld-graphs/eth-blocks/block_302517 differ diff --git a/examples/traverse-ipld-graphs/eth.js b/examples/traverse-ipld-graphs/eth.js new file mode 100644 index 00000000..08479378 --- /dev/null +++ b/examples/traverse-ipld-graphs/eth.js @@ -0,0 +1,67 @@ +'use strict' + +const createNode = require('./create-node') +const path = require('path') +const { CID } = require('multiformats/cid') +const MultihashDigest = require('multiformats/hashes/digest') +const fs = require('fs').promises +const uint8ArrayToString = require('uint8arrays/to-string') +const { convert } = require('ipld-format-to-blockcodec') +const sha3 = require('js-sha3') + +async function main () { + const ipfs = await createNode({ + ipld: { + codecs: [ + ...Object.values(require('ipld-ethereum')).map(format => convert(format)) + ], + hashers: [{ + name: 'keccak-256', + code: 0x1b, + digest: async (buf) => { + return MultihashDigest.create( + 0x1b, + new Uint8Array(sha3.keccak256.arrayBuffer(buf)) + ) + } + }] + } + }) + + console.log('\nStart of the example:') + + const ethBlocks = [ + path.join(__dirname, '/eth-blocks/block_302516'), + path.join(__dirname, '/eth-blocks/block_302517') + ] + + for (const ethBlockPath of ethBlocks) { + const data = await fs.readFile(ethBlockPath) + + const cid = await ipfs.block.put(data, { + format: 'eth-block', + mhtype: 'keccak-256', + version: 1 + }) + + console.log(cid.toString()) + } + + const block302516 = CID.parse('z43AaGEywSDX5PUJcrn5GfZmb6FjisJyR7uahhWPk456f7k7LDA') + const block302517 = CID.parse('z43AaGF42R2DXsU65bNnHRCypLPr9sg6D7CUws5raiqATVaB1jj') + let res + + res = await ipfs.dag.get(block302516, { path: 'number' }) + console.log(uint8ArrayToString(res.value, 'base16')) + + res = await ipfs.dag.get(block302517, { path: 'parent/number' }) + console.log(uint8ArrayToString(res.value, 'base16')) + + await ipfs.stop() +} + +main() + .catch(err => { + console.error(err) + process.exit(1) + }) diff --git a/examples/traverse-ipld-graphs/git-objects/0f328c91df28c5c01b9e9f9f7e663191fa156593 b/examples/traverse-ipld-graphs/git-objects/0f328c91df28c5c01b9e9f9f7e663191fa156593 new file mode 100644 index 00000000..4fc8373b Binary files /dev/null and b/examples/traverse-ipld-graphs/git-objects/0f328c91df28c5c01b9e9f9f7e663191fa156593 differ diff --git a/examples/traverse-ipld-graphs/git-objects/177bf18bc707d82b21cdefd0b43b38fc8c5c13fe b/examples/traverse-ipld-graphs/git-objects/177bf18bc707d82b21cdefd0b43b38fc8c5c13fe new file mode 100644 index 00000000..b762482e Binary files /dev/null and b/examples/traverse-ipld-graphs/git-objects/177bf18bc707d82b21cdefd0b43b38fc8c5c13fe differ diff --git a/examples/traverse-ipld-graphs/git-objects/23cc25f631cb076d5de5036c87678ea713cbaa6a b/examples/traverse-ipld-graphs/git-objects/23cc25f631cb076d5de5036c87678ea713cbaa6a new file mode 100644 index 00000000..d50e6d18 Binary files /dev/null and b/examples/traverse-ipld-graphs/git-objects/23cc25f631cb076d5de5036c87678ea713cbaa6a differ diff --git a/examples/traverse-ipld-graphs/git-objects/4e425dba7745a781f0712c9a01455899e8c0c249 b/examples/traverse-ipld-graphs/git-objects/4e425dba7745a781f0712c9a01455899e8c0c249 new file mode 100644 index 00000000..f6de31c9 Binary files /dev/null and b/examples/traverse-ipld-graphs/git-objects/4e425dba7745a781f0712c9a01455899e8c0c249 differ diff --git a/examples/traverse-ipld-graphs/git-objects/6850c7be7136e6be00976ddbae80671b945c3e9d b/examples/traverse-ipld-graphs/git-objects/6850c7be7136e6be00976ddbae80671b945c3e9d new file mode 100644 index 00000000..a3d3a1ea Binary files /dev/null and b/examples/traverse-ipld-graphs/git-objects/6850c7be7136e6be00976ddbae80671b945c3e9d differ diff --git a/examples/traverse-ipld-graphs/git-objects/a5095353cd62a178663dd26efc2d61f4f61bccbe b/examples/traverse-ipld-graphs/git-objects/a5095353cd62a178663dd26efc2d61f4f61bccbe new file mode 100644 index 00000000..fc7fdf00 Binary files /dev/null and b/examples/traverse-ipld-graphs/git-objects/a5095353cd62a178663dd26efc2d61f4f61bccbe differ diff --git a/examples/traverse-ipld-graphs/git-objects/dc9bd15e8b81b6565d3736f9c308bd1bba60f33a b/examples/traverse-ipld-graphs/git-objects/dc9bd15e8b81b6565d3736f9c308bd1bba60f33a new file mode 100644 index 00000000..cc800651 Binary files /dev/null and b/examples/traverse-ipld-graphs/git-objects/dc9bd15e8b81b6565d3736f9c308bd1bba60f33a differ diff --git a/examples/traverse-ipld-graphs/git-objects/e68e6f6e31857877a79fd6b3956898436bb5a76f b/examples/traverse-ipld-graphs/git-objects/e68e6f6e31857877a79fd6b3956898436bb5a76f new file mode 100644 index 00000000..7d010838 Binary files /dev/null and b/examples/traverse-ipld-graphs/git-objects/e68e6f6e31857877a79fd6b3956898436bb5a76f differ diff --git a/examples/traverse-ipld-graphs/git-objects/ee62b3d206cb23f939208898f32d8708c0e3fa3c b/examples/traverse-ipld-graphs/git-objects/ee62b3d206cb23f939208898f32d8708c0e3fa3c new file mode 100644 index 00000000..78a038b4 Binary files /dev/null and b/examples/traverse-ipld-graphs/git-objects/ee62b3d206cb23f939208898f32d8708c0e3fa3c differ diff --git a/examples/traverse-ipld-graphs/git-objects/ee71cef5001b84b0314438f76cf0acd338a2fd21 b/examples/traverse-ipld-graphs/git-objects/ee71cef5001b84b0314438f76cf0acd338a2fd21 new file mode 100644 index 00000000..27296bc7 Binary files /dev/null and b/examples/traverse-ipld-graphs/git-objects/ee71cef5001b84b0314438f76cf0acd338a2fd21 differ diff --git a/examples/traverse-ipld-graphs/git.js b/examples/traverse-ipld-graphs/git.js new file mode 100644 index 00000000..f14b6be1 --- /dev/null +++ b/examples/traverse-ipld-graphs/git.js @@ -0,0 +1,82 @@ +'use strict' + +const createNode = require('./create-node') +const path = require('path') +const { CID } = require('multiformats/cid') +const MultihashDigest = require('multiformats/hashes/digest') +const fs = require('fs').promises +const uint8ArrayToString = require('uint8arrays/to-string') +const { convert } = require('ipld-format-to-blockcodec') +const crypto = require('crypto') + +async function main () { + const ipfs = await createNode({ + ipld: { + codecs: [ + convert(require('ipld-git')) + ], + hashers: [{ + name: 'sha1', + code: 0x11, + digest: async (buf) => { + return MultihashDigest.create(0x11, crypto.createHash('sha1').update(buf).digest()) + } + }] + } + }) + + console.log('\nStart of the example:') + + const gitObjects = [ + path.join(__dirname, '/git-objects/0f328c91df28c5c01b9e9f9f7e663191fa156593'), + path.join(__dirname, '/git-objects/177bf18bc707d82b21cdefd0b43b38fc8c5c13fe'), + path.join(__dirname, '/git-objects/23cc25f631cb076d5de5036c87678ea713cbaa6a'), + path.join(__dirname, '/git-objects/4e425dba7745a781f0712c9a01455899e8c0c249'), + path.join(__dirname, '/git-objects/6850c7be7136e6be00976ddbae80671b945c3e9d'), + path.join(__dirname, '/git-objects/a5095353cd62a178663dd26efc2d61f4f61bccbe'), + path.join(__dirname, '/git-objects/dc9bd15e8b81b6565d3736f9c308bd1bba60f33a'), + path.join(__dirname, '/git-objects/e68e6f6e31857877a79fd6b3956898436bb5a76f'), + path.join(__dirname, '/git-objects/ee62b3d206cb23f939208898f32d8708c0e3fa3c'), + path.join(__dirname, '/git-objects/ee71cef5001b84b0314438f76cf0acd338a2fd21') + ] + + await Promise.all(gitObjects.map(async gitObjectsPath => { + const data = await fs.readFile(gitObjectsPath) + + const cid = await ipfs.block.put(data, { + format: 'git-raw', + mhtype: 'sha1', + version: 1 + }) + + console.log(cid.toString()) + })) + + const v1tag = CID.parse('z8mWaGfwSWLMPJ6Q2JdsAjGiXTf61Nbue') + + async function logResult (fn, comment) { + const result = await fn() + + if (result.value instanceof Uint8Array) { // Blobs (files) are returned as buffer instance + result.value = uint8ArrayToString(result.value) + } + + console.log('-'.repeat(80)) + console.log(comment) + console.log(result.value) + } + + await logResult(() => ipfs.dag.get(v1tag), 'Tag object:') + await logResult(() => ipfs.dag.get(v1tag, { path: '/object/message' }), 'Tagged commit message:') + await logResult(() => ipfs.dag.get(v1tag, { path: '/object/parents/0/message' }), 'Parent of tagged commit:') + await logResult(() => ipfs.dag.get(v1tag, { path: '/object/tree/src/hash/hello/hash' }), '/src/hello file:') + await logResult(() => ipfs.dag.get(v1tag, { path: '/object/parents/0/tree/src/hash/hello/hash' }), 'previous version of /src/hello file:') + + await ipfs.stop() +} + +main() + .catch(err => { + console.error(err) + process.exit(1) + }) diff --git a/examples/traverse-ipld-graphs/package.json b/examples/traverse-ipld-graphs/package.json index 0d8cbc95..799b864f 100644 --- a/examples/traverse-ipld-graphs/package.json +++ b/examples/traverse-ipld-graphs/package.json @@ -16,7 +16,9 @@ "@ipld/dag-pb": "^2.1.3", "ipfs": "^0.56.0", "ipld-ethereum": "^6.0.0", + "ipld-format-to-blockcodec": "0.0.1", "ipld-git": "^0.6.1", + "js-sha3": "^0.8.0", "multiformats": "^9.4.1" }, "devDependencies": { diff --git a/examples/traverse-ipld-graphs/tests/test.js b/examples/traverse-ipld-graphs/tests/test.js index c0bb0f3b..045cd31a 100644 --- a/examples/traverse-ipld-graphs/tests/test.js +++ b/examples/traverse-ipld-graphs/tests/test.js @@ -16,6 +16,12 @@ async function runTest () { console.info('Testing get-path-accross-formats.js') await node.waitForOutput('capoeira', 'node', [path.resolve(__dirname, '../get-path-accross-formats.js')]) + console.info('Testing eth.js') + await node.waitForOutput('302516', 'node', [path.resolve(__dirname, '../eth.js')]) + + console.info('Testing git.js') + await node.waitForOutput("CID(baf4bcfhoohhpkaa3qsydcrby65wpblgthcrp2ii)", 'node', [path.resolve(__dirname, '../git.js')]) + console.info('Done!') }