bitcoinfiles-node
Version:
Upload and Download files to Bitcoin Cash blockchain with Node and web
123 lines (91 loc) • 3.88 kB
Markdown
# bitcoinfiles-node
bitcoinfiles-node is a JavaScript Library for building transactions for Bitcoin Files Protocol (BFP). Methods for uploading and downloading files are provided [per the BFP specification](https://github.com/simpleledger/slp-specification/blob/master/bitcoinfiles.md). For convenience, BITBOX network functionality has been built into the library.
Other tools using the Bitcoin Files Protocol include:
* [Electron Cash SLP Edition](http://electroncash.org/#slp)
* [BitcoinFiles.com](http://bitcoinfiles.com)
[](https://nodei.co/npm/bitcoinfiles/)
# Installation
#### For node.js
`npm install bitcoinfiles-node`
#### For browser
```<script src='https://unpkg.com/bitcoinfiles'></script>```
# Example File Download
```javascript
const Bfp = require('bitcoinfiles').bfp;
const bfp = new Bfp();
// 1 - download file using URI
let result;
(async function(){
result = await bfp.downloadFile('bitcoinfile:7e4600323c934926369c136562f5483e3df79baf087c8dd2b0ed1aea69d5ee49');
console.log("download complete.");
})();
// Wait for download to complete -- Mario.png TAKES ABOUT 6 SEC TO DOWNLOAD!
// 2 - result includes a boolean check telling you if the file's sha256 matches the file's metadata```
if(result.passesHashCheck){
console.log("Success: downloaded file sha256 matches file's metadata");
}
// 3 - do something with the file...
let fileBuffer = result.fileBuf;
```
# Example File Upload
Below is a simple example. For a more complete React.js [file upload example](https://github.com/simpleledger/SimpleToken.cash/blob/master/src/UploadDialog.js) visit [SimpleToken.cash website](https://simpletoken.cash)
```javascript
const Bfp = require('bitcoinfiles').bfp;
const Network = require('bitcoinfiles').network;
const BITBOX = require('bitcoinfiles').bitbox;
const bfp = new Bfp();
const network = new Network();
// 1 - get a file and file metadata somehow
const someFileBuffer = new Buffer.from('aabbccddeeff', 'hex');
const fileName = 'a test file';
const fileExt = 'txt';
const fileSize = someFileBuffer.length
const fileSha256Hex = BITBOX.Crypto.sha256(someFileBuffer).toString('hex');
// 2 - estimate upload cost for funding the transaction
let config = {
msgType: 1,
chunkCount: 1,
fileName: fileName,
fileExt: fileExt,
fileSize: fileSize,
fileSha256Hex: fileSha256Hex,
prevFileSha256Hex: null,
fileUri: null,
chunkData: null // chunk not needed for cost estimate stage
};
let uploadCost = Bfp.calculateFileUploadCost(fileSize, config);
console.log('upload cost: ', uploadCost);
// 3 - create a funding transaction
let fundingAddress = 'bitcoincash:qqgvrkm0xpmwqgyhfm65qxv70tjtwma6lgk07ffv9u'
let fundingWif = 'KzcuA9xnDRrb9cPh29N7EQbBhQQLMWtcrDwKbEMoahmwBNACNRfa'
// 4 - Make sure address above is funded with the amount equal to the uploadCost
let fundingUtxo;
(async function(){
let txo = await network.getLastUtxoWithRetry(fundingAddress);
console.log('got funding Utxo.')
})();
// wait for network to resolve...
// 5 - upload the file
let fileId;
(async function(){
fileId = await bfp.uploadFile(fundingUtxo, fundingAddress, fundingWif, someFileBuffer, fileName, fileExt);
console.log('fileId: ', fileId);
})();
// wait for upload to complete resolve... Done.
```
# Get File Metadata
```javascript
const bfp = require('bitcoinfiles');
let metadata;
(async function(){
metadata = await bfp.bitdb.getFileMetadata("dc76c5bd116fd61713c5b454b393212e33a1b2a8c926dcc40261f955d59b8e90","qrg3fvfue463rc5genp2kyrj4mg6g2lpxst0y4wamw");
console.log('metadata: ', metadata);
})
// metadata :
// { filename: 'tes158',
// fileext: '.json',
// size: '017a',
// sha256: '018321383bf2672befe28629d1e159af812260268a8aa77bbd4ec27489d65b58',
// prev_sha256: '',
// ext_uri: '' }
```