@fabcotech/gossip
v1.1.3
Published
Utils use to sign, verify and air messages sent between and to nodes of the dappy network for zone management.
Downloads
10
Readme
Gossip
Utils use to sign, verify and air messages sent between and to nodes of the dappy network for zone management.
Build and test
# In dappy-tools root
npm i & npx lerna bootstrap
# In dappy-tools/packages/gossip
npm i
# build
npm run build
# test
npm run test
Sign a message
Signs a message (data
in our case) with a private key
import { publicKeyFromPrivateKey, signZoneTransaction } from "@fabcotech/gossip";
const privateKey = "aaa";
const publicKey = publicKeyFromPrivateKey(privateKey);
const zone = {
origin: "apple",
records: {
host: '@', type: 'TXT', value: 'OWNER=' + publicKey
}
}
const payload = {
data: {
zone: zone,
date: new Date().getTime()
}
}
const signature = signZoneTransaction(payload.data, privateKey, 'hex')
const zoneTransactionWithSignature = {
...payload,
signature: signature
}
Check a message
Checks the message (data
) is valid :
- Date (
data.date
) should be between 10 minutes ago and now. - Cryptographic signature of
data -> JSON.stringify -> blake2 hash
should match public key.
import { publicKeyFromPrivateKey, signZoneTransaction } from "dummychain";
// either throws or returns true
checkZoneTransaction(
publicKey, // public key comes from an external / unknown source
zoneTransactionWithSignature
)
Gossip
Send a message to a dappy network, will retry 3 times (hardcoded) with a delay of 8000ms (configurable) if response status code is not 200.
import https from "https";
import { gossip } from "@fabcotech/gossip";
import { dappyNetworks } from "@fabcotech/dappy-lookup";
gossip(
dappyNetworks["d"],
(dnm) => {
return new Promise((reso, reje) => {
const options = {
minVersion: 'TLSv1.3',
rejectUnauthorized: true,
ca: dnm.caCert,
host: dnm.ip,
method: 'POST',
port: dnm.port,
path: `/gossip`,
headers: {
'Content-Type': 'application/json',
Host: dnm.hostname,
},
};
const req = https.request(options, (res) => {
if (res.statusCode === 200) {
reso(true);
} else {
reje('Status code not 200')
}
});
req.on('error', err => {
reje(err)
})
req.end()
})
}
).then((results) => {
/*
results is an array of
string(error) | Error(error) | true(success)
*/
console.log(results);
})
.catch((err) => {
console.log('critical error gossip should never fail');
console.log(err);
})