cshashfiles
A CLI tool to create hashes of files and optionally insert them into a Chainscript.
Install
$ npm install -g chainscript
Usage
$ cshashfiles --help
Usage: cshashfiles [options] [path...] [-- chainscript args]
Options:
-h, --help output usage information
-V, --version output the version number
-a, --algorithm <name> hash algorithm (default sha256)
-r, --root <path> JSON root path
The algorithm can be either sha1
, sha256
(default), or sha512
.
The paths will be resolved relative to the current working directory.
If no paths are given, it uses the current directory.
Hash format
The hashes use the multihash format, encoded in base58.
Multihash makes it possible to know which hashing algorithm was used from the hash itself.
Base58 keeps the digests compact and human readable.
Ignoring files
You can have .csignore
files to specify files that shouldn't be hashed. It
works just like .gitignore
. If there are no .csignore
files, it will use
.gitignore
files if present.
Ex:
*.log
node_modules
coverage
Examples
Hash files in current directory
$ cshashfiles
Output:
{
"QmWfMk1nqjYzRUrBknehM5pvWfZ5L5wELJW3EfPtJLrDt8": "Chainscript.js",
"QmQjYNaJM7jmfZcg1uDnxdhEYqfnyEaULUe1K5n3FHYQFk": "index.js",
"QmasC73FhU2dySe5ybUDpaD6KPYeqFXUrTgNPKqJpkncfG": "utils/clone.js",
"QmRpTxWxZocrvu1ndTmJS4pRDw9zREXKH8badyskmRgAcM": "utils/deepEquals.js",
"QmVBv94bcG9VAD79SPMtiQ6ajp5wgdMvCQWJR9DRRAmzGZ": "utils/hashFile.js",
"QmVfws9ydJ4VgsvLDQujNb7QWzsEbhqHnFcWLio12iwR9n": "utils/hashFiles.js",
"QmNzZkoog5nRbf4p27ieEdZHbitXdFDRuDJGnPYwgoH3z5": "utils/readPackageSync.js",
"QmWPiPb3vSj9pGnkyQj5osWhHZjzh5NyF1ftwmhsMZK18t": "utils/verifyFiles.js"
}
Specify the JSON root key
To work with Chainscripts, it is very useful to be able to change where the hashes should be inserted.
$ cshashfiles -r content.files
Output:
{
"content": {
"files": {
"QmWfMk1nqjYzRUrBknehM5pvWfZ5L5wELJW3EfPtJLrDt8": "Chainscript.js",
"QmQjYNaJM7jmfZcg1uDnxdhEYqfnyEaULUe1K5n3FHYQFk": "index.js",
"QmasC73FhU2dySe5ybUDpaD6KPYeqFXUrTgNPKqJpkncfG": "utils/clone.js",
"QmRpTxWxZocrvu1ndTmJS4pRDw9zREXKH8badyskmRgAcM": "utils/deepEquals.js",
"QmVBv94bcG9VAD79SPMtiQ6ajp5wgdMvCQWJR9DRRAmzGZ": "utils/hashFile.js",
"QmVfws9ydJ4VgsvLDQujNb7QWzsEbhqHnFcWLio12iwR9n": "utils/hashFiles.js",
"QmNzZkoog5nRbf4p27ieEdZHbitXdFDRuDJGnPYwgoH3z5": "utils/readPackageSync.js",
"QmWPiPb3vSj9pGnkyQj5osWhHZjzh5NyF1ftwmhsMZK18t": "utils/verifyFiles.js"
}
}
}
Pipe the output to chainscript
It is possible to pipe the output to chainscript
, making it a powerful tool.
$ cshashfiles -r content.files --
Output:
{
"body": {
"content": {
"files": {
"QmWfMk1nqjYzRUrBknehM5pvWfZ5L5wELJW3EfPtJLrDt8": "Chainscript.js",
"QmQjYNaJM7jmfZcg1uDnxdhEYqfnyEaULUe1K5n3FHYQFk": "index.js",
"QmasC73FhU2dySe5ybUDpaD6KPYeqFXUrTgNPKqJpkncfG": "utils/clone.js",
"QmRpTxWxZocrvu1ndTmJS4pRDw9zREXKH8badyskmRgAcM": "utils/deepEquals.js",
"QmVBv94bcG9VAD79SPMtiQ6ajp5wgdMvCQWJR9DRRAmzGZ": "utils/hashFile.js",
"QmVfws9ydJ4VgsvLDQujNb7QWzsEbhqHnFcWLio12iwR9n": "utils/hashFiles.js",
"QmNzZkoog5nRbf4p27ieEdZHbitXdFDRuDJGnPYwgoH3z5": "utils/readPackageSync.js",
"QmWPiPb3vSj9pGnkyQj5osWhHZjzh5NyF1ftwmhsMZK18t": "utils/verifyFiles.js"
}
},
"x_meta": {
"uuid": "chainscript:envelope:a8760f65-fd8c-499d-b466-462e5caf801e",
"content_digest": "18697857c445fe9e1560d04f63989c95b12c7253"
}
},
"x_chainscript": {
"validation": {
"agent": "io.chainscript.agent",
"version": "0.1.alpha",
"result": "valid",
"validated_on": "2015-09-20T13:21:58+00:00",
"message": "Envelope was executed without a command."
},
"hash": "275dcec163080042083256a0ecfa80ad1c637412"
}
}
Pass flags to chainscript
You can also pass flags to chainscript
. Say for example you want to add a
version key to your Chainscript:
$ cshashfiles -r content.files -- -U version:0.1.0
Output:
{
"body": {
"content": {
"files": {
"QmWfMk1nqjYzRUrBknehM5pvWfZ5L5wELJW3EfPtJLrDt8": "Chainscript.js",
"QmQjYNaJM7jmfZcg1uDnxdhEYqfnyEaULUe1K5n3FHYQFk": "index.js",
"QmasC73FhU2dySe5ybUDpaD6KPYeqFXUrTgNPKqJpkncfG": "utils/clone.js",
"QmRpTxWxZocrvu1ndTmJS4pRDw9zREXKH8badyskmRgAcM": "utils/deepEquals.js",
"QmVBv94bcG9VAD79SPMtiQ6ajp5wgdMvCQWJR9DRRAmzGZ": "utils/hashFile.js",
"QmVfws9ydJ4VgsvLDQujNb7QWzsEbhqHnFcWLio12iwR9n": "utils/hashFiles.js",
"QmNzZkoog5nRbf4p27ieEdZHbitXdFDRuDJGnPYwgoH3z5": "utils/readPackageSync.js",
"QmWPiPb3vSj9pGnkyQj5osWhHZjzh5NyF1ftwmhsMZK18t": "utils/verifyFiles.js"
},
"version": "0.1.0"
},
"x_meta": {
"uuid": "chainscript:envelope:abe6671b-0e2f-48fb-9dae-2b0e30236d91",
"content_digest": "d4b0957f5ff0f4d63c81f05936291fb0ea5364c2",
"revision": 1,
"previous_hash": "504eb22289a5dffde991845dda50eb9a42624985"
}
},
"x_chainscript": {
"validation": {
"agent": "io.chainscript.agent",
"version": "0.1.alpha",
"result": "valid",
"validated_on": "2015-09-20T13:24:41+00:00",
"message": "Envelope was executed without a command."
},
"hash": "8c20b1bdb8b615d39d9de35be3d34dd82e033e3c"
}
}
The special @
argument
Sometimes, you want to use the hash output as the value of a flag passed to
chainscript
. You can do this by using @
. For instance, this would update
the hashes in a snapshotted Chainscript.
$ cshashfiles -r files -- -u @ chainscript:envelope:3f91cb19-0a11-462a-89ef-97894d24f70e