diff --git a/package.json b/package.json index 33b412d2ed..dd84c38d3e 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "async": "^2.1.4", "bl": "^1.1.2", "boom": "^4.2.0", + "cids": "^0.3.4", "debug": "^2.3.3", "fs-pull-blob-store": "^0.3.0", "glob": "^7.1.1", @@ -81,16 +82,16 @@ "hapi-set-header": "^1.0.2", "idb-pull-blob-store": "^0.5.1", "ipfs-api": "^12.0.0", - "ipfs-bitswap": "^0.8.1", + "ipfs-bitswap": "^0.8.2", "ipfs-block": "^0.5.0", - "ipfs-block-service": "^0.7.0", + "ipfs-block-service": "^0.7.1", "ipfs-multipart": "^0.1.0", "ipfs-repo": "^0.11.1", "ipfs-unixfs": "^0.1.8", "ipfs-unixfs-engine": "^0.14.0", "ipld-dag-cbor": "^0.8.2", "ipld-dag-pb": "^0.9.3", - "ipld-resolver": "^0.3.0", + "ipld-resolver": "^0.4.0", "isstream": "^0.1.2", "joi": "^10.0.1", "libp2p-ipfs-browser": "^0.17.0", @@ -104,6 +105,7 @@ "mafmt": "^2.1.2", "multiaddr": "^2.1.1", "multihashes": "^0.3.0", + "multihashing-async": "^0.3.0", "path-exists": "^3.0.0", "peer-book": "^0.3.0", "peer-id": "^0.8.0", diff --git a/src/cli/commands/block/get.js b/src/cli/commands/block/get.js index f042eb0632..ed0218f03b 100644 --- a/src/cli/commands/block/get.js +++ b/src/cli/commands/block/get.js @@ -1,7 +1,7 @@ 'use strict' const utils = require('../../utils') -const mh = require('multihashes') +const CID = require('cids') const debug = require('debug') const log = debug('cli:block') log.error = debug('cli:block:error') @@ -19,17 +19,17 @@ module.exports = { throw err } - const hash = utils.isDaemonOn() - ? argv.key - : mh.fromB58String(argv.key) + const cid = new CID(argv.key) - ipfs.block.get(hash, (err, block) => { + ipfs.block.get(cid, (err, block) => { if (err) { throw err } if (block.data) { - console.log(block.data.toString()) + // writing the buffer to stdout seems to be the only way + // to send out binary data correctly + process.stdout.write(block.data) return } diff --git a/src/cli/commands/block/put.js b/src/cli/commands/block/put.js index cdd47a7776..47210d5012 100644 --- a/src/cli/commands/block/put.js +++ b/src/cli/commands/block/put.js @@ -1,32 +1,50 @@ 'use strict' const utils = require('../../utils') -const mh = require('multihashes') const bl = require('bl') const fs = require('fs') const Block = require('ipfs-block') +const CID = require('cids') +const multihashing = require('multihashing-async') const waterfall = require('async/waterfall') const debug = require('debug') const log = debug('cli:block') log.error = debug('cli:block:error') -function addBlock (buf) { +function addBlock (buf, opts) { + let block = new Block(buf) + let cid + utils.getIPFS((err, ipfs) => { if (err) { throw err } waterfall([ - (cb) => ipfs.block.put(new Block(buf), cb), - (block, cb) => block.key(cb) - ], (err, key) => { + (cb) => generateHash(block, opts, cb), + (mhash, cb) => generateCid(mhash, block, opts, cb), + (cb) => ipfs.block.put(block, cid, cb) + ], (err) => { if (err) { throw err } - console.log(mh.toB58String(key)) + console.log(cid.toBaseEncodedString()) }) }) + + function generateHash (block, opts, cb) { + if (opts.mhlen === undefined) { + multihashing(buf, opts.mhtype, cb) + } else { + multihashing(buf, opts.mhtype, opts.mhlen, cb) + } + } + + function generateCid (mhash, block, opts, cb) { + cid = new CID(opts.verison, opts.format, mhash) + cb() + } } module.exports = { @@ -34,11 +52,34 @@ module.exports = { describe: 'Stores input as an IPFS block', - builder: {}, + builder: { + format: { + alias: 'f', + describe: 'cid format for blocks to be created with.', + default: 'v0' + }, + mhtype: { + describe: 'multihash hash function', + default: 'sha2-256' + }, + mhlen: { + describe: 'multihash hash length', + default: undefined + } + }, handler (argv) { + // parse options + if (argv.format === 'v0') { + argv.verison = 0 + argv.format = 'dag-pb' + argv.mhtype = 'sha2-256' + } else { + argv.verison = 1 + } + if (argv.data) { - return addBlock(fs.readFileSync(argv.data)) + return addBlock(fs.readFileSync(argv.data), argv) } process.stdin.pipe(bl((err, input) => { @@ -46,7 +87,7 @@ module.exports = { throw err } - addBlock(input) + addBlock(input, argv) })) } } diff --git a/src/cli/commands/block/stat.js b/src/cli/commands/block/stat.js index ab7887c75b..a3cefd2f70 100644 --- a/src/cli/commands/block/stat.js +++ b/src/cli/commands/block/stat.js @@ -1,6 +1,7 @@ 'use strict' const utils = require('../../utils') +const CID = require('cids') const debug = require('debug') const log = debug('cli:block') log.error = debug('cli:block:error') @@ -13,12 +14,14 @@ module.exports = { builder: {}, handler (argv) { + const cid = new CID(argv.key) + utils.getIPFS((err, ipfs) => { if (err) { throw err } - ipfs.block.stat(argv.key, (err, stats) => { + ipfs.block.stat(cid, (err, stats) => { if (err) { throw err } diff --git a/test/cli/test-block.js b/test/cli/test-block.js index 6beb8b3076..308ad3ae9a 100644 --- a/test/cli/test-block.js +++ b/test/cli/test-block.js @@ -16,9 +16,17 @@ describe('block', () => { }) }) + it('put with flags, format and mhtype', () => { + return ipfs('block put --format eth-block --mhtype keccak-256 test/test-data/eth-block').then((out) => { + expect(out).to.be.eql( + 'z43AaGF23fmvRnDP56Ub9WcJCfzSfqtmzNCCvmz5eudT8dtdCDS' + ) + }) + }) + it('get', () => { return ipfs('block get QmZjTnYw2TFhn9Nn7tjmPSoTBoY7YRkwPzwSrSbabY24Kp').then((out) => { - expect(out).to.be.eql('hello world\n') + expect(out).to.be.eql('hello world') }) }) diff --git a/test/test-data/eth-block b/test/test-data/eth-block new file mode 100644 index 0000000000..f2b366dc93 Binary files /dev/null and b/test/test-data/eth-block differ