Last active
April 18, 2021 22:52
-
-
Save ninabreznik/7b81f652722466b200fcb411a4cd5d5b to your computer and use it in GitHub Desktop.
verifying signatures
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const hypercore = require('hypercore') | |
const hyperswarm = require('hyperswarm') | |
const RAM = require('random-access-memory') | |
make_feed() | |
async function make_feed () { | |
const feed = new hypercore(RAM, { valueEncoding: 'utf-8' }) | |
await ready(feed) | |
await append(feed, 'foo') | |
await append(feed, 'bar') | |
await append(feed, 'baz') | |
get_and_verify_signatures(feed) | |
const feedkey = feed.key | |
const topic = feed.discoveryKey | |
const swarm = hyperswarm() | |
swarm.join(topic, { announce: true, lookup: false }) | |
swarm.on('connection', (socket, info) => { | |
socket.pipe(feed.replicate(info.client)).pipe(socket) | |
}) | |
await clone_feed(feedkey, topic) | |
} | |
async function clone_feed (feedkey, topic) { | |
const feed = new hypercore(RAM, feedkey, { valueEncoding: 'utf-8' }) | |
await ready(feed) | |
const swarm = hyperswarm() | |
swarm.join(topic, { announce: false, lookup: true }) | |
swarm.on('connection', async (socket, info) => { | |
socket.pipe(feed.replicate(info.client)).pipe(socket) | |
console.log('new connection') | |
feed.on('sync', () => { | |
get_and_verify_signatures(feed) | |
swarm.leave(topic) | |
}) | |
}) | |
} | |
async function get_and_verify_signatures (feed) { | |
for (var i = 0, len = feed.length; i < len; i++) { | |
const index = i | |
const signature = await get_signature(feed, index) | |
console.log({signature}) | |
const is_verified = await verify_signature(feed, index, signature) | |
console.log(is_verified) | |
} | |
} | |
// HELPERS | |
/////////////////////////////////////////////////////////// | |
async function get_data (feed, index) { | |
return new Promise((resolve, reject) => { | |
feed.get(index, (err, data) => { | |
if (err) reject(err) | |
resolve(data) | |
}) | |
}) | |
} | |
async function append (feed, data) { | |
return new Promise ((resolve, reject) => { | |
feed.append(data, (err, res) => { | |
if (err) reject(err) | |
resolve(res) | |
}) | |
}) | |
} | |
async function ready (feed) { | |
return new Promise ((resolve, reject) => { | |
if (feed.key) resolve() | |
feed.on('ready', resolve) | |
}) | |
} | |
async function verify_signature (core, index, signature) { | |
return new Promise ((resolve, reject) => { | |
core.verify(index, signature, (err, res) => { | |
if (err) reject(err) | |
resolve(res) | |
}) | |
}) | |
} | |
async function get_signature (feed, index) { | |
return new Promise((resolve, reject) => { | |
feed.signature(index, (err, res) => { | |
if (err) reject(err) | |
resolve(res.signature) // res = { index, signature } | |
}) | |
}) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment