dad-ts-sdk
Version:
Comprehensive TypeScript library for the Ontology blockchain.
97 lines (88 loc) • 5.07 kB
text/typescript
import { Account } from '../src/account';
import { PrivateKey } from '../src/crypto';
import { Identity } from '../src/identity';
import { constructClaimProof, getProofNodes, verifyClaimProof, verifyLeafHashInclusion } from '../src/merkle';
import { WebsocketClient } from '../src/network/websocket/websocketClient';
import { buildRegisterOntidTx } from '../src/smartcontract/nativevm/ontidContractTxBuilder';
import { signTransaction } from '../src/transaction/transactionBuilder';
// tslint:disable:no-console
describe('test merkle proofs', () => {
let txHash: string;
const privateKey = PrivateKey.random();
const publicKey = privateKey.getPublicKey();
const account = Account.create(privateKey, '123456', '');
const identity = Identity.create(privateKey, '123456', '');
const ontId = identity.ontid;
const address = account.address;
/**
* Registers new ONT ID to create transaction
*/
beforeAll(async () => {
const tx = buildRegisterOntidTx(ontId, publicKey, '0', '30000');
tx.payer = account.address;
signTransaction(tx, privateKey);
const client = new WebsocketClient();
const result = await client.sendRawTransaction(tx.serialize(), false, true);
txHash = result.Result.TxHash;
}, 10000);
test('test verify leaf in tree', () => {
const merkle = {
Type: 'MerkleProof',
TransactionsRoot: 'dafd3426157505e944b79341692fc671a08ff6a49df8bae0316589f8aeb662e8',
BlockHeight: 987,
CurBlockRoot: '013f7e94417caddd5d4cb2b188986950095fc1156337280a0202eb60f97a7202',
CurBlockHeight: 1334,
TargetHashes:
['fc58cd3c287a212d6ff4dbb4b7ac6a3758bb7c5aba90de7e7c25e73ecfc2e314',
'8f6b07cb220cff1b7675a572df40355156593afc942e8025383fd299b020efae',
'8f855e903d197c6b950fb1d06af5b62ad77e833ae6cacdd2d26461bb4db5dd84',
'21a9fb67d89ec41ec1f72a2219bea14a5e0598bafa0ee034560831c3591ac791',
'812af7a5a48d503da1d8a567955d28e81e667a229048b1384b00af6091ca2f28',
'9710423e9b37ec7533db32d96e4ce915ba3070067f0d07b761b98882b727b42d',
'e693cb5ccd21c3a4e3109444dba90d48e50d998817f5ea30bd8b5e80f5b51908',
'f80b3101f4ba67f8a122d196c292b1fdd12fa376576eb2ec9a39558bc0d050a5',
'e16f24631135b44b22540392b3d326cedbc2b0009b65251fa9bfc4bf3afe9c99',
'3067fe25fa3af8c7e8b4b68714ccf38498a987d1e4dd51f8e87c00c204d5d26d',
'e7bc56e79d77391f9a4c1065b1c769087b403fa707d7d924536bdad88f6c162e']
};
const leafHash = merkle.TransactionsRoot;
const leafIndex = merkle.BlockHeight;
const proof = merkle.TargetHashes;
const rootHash = merkle.CurBlockRoot;
const treeSize = merkle.CurBlockHeight;
const result = verifyLeafHashInclusion(leafHash, leafIndex, proof, rootHash, treeSize);
console.log(result);
expect(result).toBeTruthy();
});
test('test verifyMerkleProof with wrong contractAddr', async () => {
const contractAddr = '1234567890';
const claimProof = await constructClaimProof(txHash, contractAddr);
console.log(claimProof);
const result = verifyClaimProof(claimProof.TxnHash, claimProof.MerkleRoot, claimProof.Nodes);
console.log(result);
expect(result).toBeFalsy();
});
test('test getProofNodes', () => {
const merkle = { TransactionsRoot: '9376dc41a98a52cdaeac04e43033102ba5167ef914c929093bf316d4c23cc89d',
Type: 'MerkleProof', CurBlockRoot: 'b70494ad2d446004cd2cb4a5746829192402dfcbbc0300c0f6ee67c40ad94971',
CurBlockHeight: 3975, BlockHeight: 3807,
TargetHashes: ['f1c52b64834de776dd75899b7a737586649262ef2f6b7a2e2403ad2f6806a563',
'763cf365f5d54763eddf7d790a8f238f42c84efe6083fc3d0dcdbda1bba42e1d',
'a4d84c9eae6877f0f8dbd4e7dd16cac5662def94ec5a1560b635c06277c1157e',
'f53a8ef0da3764781d2e1fb910ee24e060b49bb48c49d264624149c802a9c051',
'c17bffb1d0d6cc6156835250fdb6560a0c55085c1c252ace0ebad99b49dc8904',
'c72bad737b03a3f1474439415670fef914d51329364846b5c0de9430bda2fdce',
'286700b35b38d66aedd53f4f0f6ecfd9647825160cb11d1159695977a827413b',
'bac6b66302d3ce0ba7921d09b498b8fdbed97c92c8cec01b6bc7d4e1093664f9',
'e279ddafd7c0e24f5e11fad048863f2464c53185ee28aec2aa7625b1351bc3c0',
'2efe9edb28594bf2c40d23b256db86a9b47617e738f6f1989a1a88c86417342c',
'8498af2fc96c62427b2992ece3842cabe69ccc8d2b7df1b634ea6263c3b9b35b',
'73fc0e4d1163018bf721ce2d31bb42004d7f4604d6896443c2d38ece602e3909'] };
const leafIndex = merkle.BlockHeight;
const treeSize = merkle.CurBlockHeight;
const proof = merkle.TargetHashes;
const proofNodes = getProofNodes(leafIndex, treeSize, proof);
console.log(proofNodes);
expect(proofNodes.length).toBeGreaterThan(0);
});
});