Merkle_tree/js/script.js
2022-09-06 01:57:36 +05:30

77 lines
3.0 KiB
JavaScript

const addressZero = '0x0000000000000000000000000000000000000000000000000000000000000000'
const options = {
hashLeaves: false,
sortLeaves: true,
sortPairs: true,
duplicateOdd: false,
isBitcoinTree: false
}
//check the constraints
getRef("trbtn").addEventListener('click', () => {
getRef("waiting").innerHTML = `<sm-spinner class="margin-right-1"></sm-spinner> The tree is being constructed, please wait.`
let trid = getRef("trid").value.trim();
txIdList = trid.split(",");
merkleTreePath();
})
let tree
function merkleTreePath() {
let trid = getRef("trid").value.trim().split(",");
let txIdList = trid.map(v => `0x${sha256(v.trim())}`);
tree = new MerkleTree(txIdList, sha256, options)
const merkleRoot = tree.getHexRoot()
getRef("waiting").innerHTML = " ";
getRef("otp").innerHTML = "<b>Root : </b>";
let id1 = document.querySelector("#otp");
let newDiv = document.createElement('sm-copy')
newDiv.value = merkleRoot;
id1.appendChild(newDiv);
//path
const otp1 = document.querySelector("#otp1");
otp1.innerHTML = ''
const frag = document.createDocumentFragment()
txIdList.forEach((leaf, index) => {
const div = document.createElement('div')
const newDiv1 = document.createElement('div')
newDiv1.innerHTML = `<b>Proof of "${trid[index]}":</b>`;
const newDiv = document.createElement('sm-copy')
newDiv.value = tree.getHexProof(leaf);
div.append(newDiv1, newDiv)
frag.append(div);
})
otp1.append(frag)
// writing into cloud
floCloudAPI.sendApplicationData('', merkleRoot).then((value) => {
console.log(value)
}).catch(err => {
console.error(err)
})
}
//verify path
getRef("vrbtn").addEventListener('click', () => {
getRef("otp2").classList.remove('hide')
getRef('otp2').innerHTML = '<sm-spinner class="spinner"></sm-spinner>'
const merkleRoot = getRef("merkle_root").value.trim();
const elementToCheck = getRef('element_to_check').value.trim();
const proof = getRef('proof').value.trim().split(',')
floCloudAPI.requestApplicationData(merkleRoot, { mostRecent: true }).then(res => {
// let isInCloud = `<div>The Merkle root <b style="overflow-wrap: anywhere">${merkleRoot}</b> is ${res.length > 0 ? '' : 'not'} present in the cloud</div>`
let verified
const leaf = `0x${sha256(elementToCheck)}`
verified = MerkleTree.verify(proof, leaf, merkleRoot, sha256, options)
if (verified) {
getRef("otp2").classList.remove('failed')
getRef("otp2").classList.add('success')
} else {
getRef("otp2").classList.add('failed')
getRef("otp2").classList.remove('success')
}
getRef("otp2").classList.remove('hide')
getRef("otp2").innerHTML = ` <h4>${verified ? 'Verified' : 'Verification Failed (Not a member)'}</h4>`;
}).catch(err => {
notify(err, 'error')
})
})