Skip to content

Commit e679ed7

Browse files
committed
Add calcfastmerkleroot RPC and test-framework support
1 parent 2c0af44 commit e679ed7

File tree

4 files changed

+51
-0
lines changed

4 files changed

+51
-0
lines changed

src/rpc/misc.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <chain.h>
77
#include <clientversion.h>
8+
#include <consensus/merkle.h>
89
#include <core_io.h>
910
#include <crypto/ripemd160.h>
1011
#include <key_io.h>
@@ -542,6 +543,22 @@ UniValue getpakinfo(const JSONRPCRequest& request)
542543
return ret;
543544
}
544545

546+
UniValue calcfastmerkleroot(const JSONRPCRequest& request)
547+
{
548+
std::vector<uint256> leaves;
549+
for (const UniValue& leaf : request.params[0].get_array().getValues()) {
550+
uint256 l;
551+
l.SetHex(leaf.get_str());
552+
leaves.push_back(l);
553+
}
554+
555+
uint256 root = ComputeFastMerkleRoot(leaves);
556+
557+
UniValue ret(UniValue::VOBJ);
558+
ret.setStr(root.GetHex());
559+
return ret;
560+
}
561+
545562

546563
// END ELEMENTS CALLS
547564
//
@@ -558,6 +575,7 @@ static const CRPCCommand commands[] =
558575
// ELEMENTS:
559576
{ "util", "getpakinfo", &getpakinfo, {}},
560577
{ "util", "tweakfedpegscript", &tweakfedpegscript, {"claim_script"} },
578+
{ "hidden", "calcfastmerkleroot", &calcfastmerkleroot, {"leaves"} },
561579

562580
/* Not shown in help */
563581
{ "hidden", "setmocktime", &setmocktime, {"timestamp"}},
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/usr/bin/env python3
2+
3+
from test_framework.test_framework import BitcoinTestFramework
4+
from test_framework.util import assert_equal, calcfastmerkleroot
5+
from test_framework import util
6+
7+
class CalcFastMerkleRoot(BitcoinTestFramework):
8+
def set_test_params(self):
9+
self.setup_clean_chain = True
10+
self.num_nodes = 1
11+
12+
def run_test(self):
13+
util.node_fastmerkle = self.nodes[0]
14+
15+
test_leaves = ["b66b041650db0f297b53f8d93c0e8706925bf3323f8c59c14a6fac37bfdcd06f", "99cb2fa68b2294ae133550a9f765fc755d71baa7b24389fed67d1ef3e5cb0255", "257e1b2fa49dd15724c67bac4df7911d44f6689860aa9f65a881ae0a2f40a303", "b67b0b9f093fa83d5e44b707ab962502b7ac58630e556951136196e65483bb80"]
16+
test_roots = ["0000000000000000000000000000000000000000000000000000000000000000", "b66b041650db0f297b53f8d93c0e8706925bf3323f8c59c14a6fac37bfdcd06f", "f752938da0cb71c051aabdd5a86658e8d0b7ac00e1c2074202d8d2a79d8a6cf6", "245d364a28e9ad20d522c4a25ffc6a7369ab182f884e1c7dcd01aa3d32896bd3", "317d6498574b6ca75ee0368ec3faec75e096e245bdd5f36e8726fa693f775dfc"]
17+
18+
leaves = []
19+
for i in range(4):
20+
root = calcfastmerkleroot(leaves)
21+
assert_equal(root, test_roots[i])
22+
leaves.append(test_leaves[i])
23+
24+
if __name__ == '__main__':
25+
CalcFastMerkleRoot().main()

test/functional/test_framework/util.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@
2222

2323
logger = logging.getLogger("TestFramework.utils")
2424

25+
# This variable should be set to the node being used for CalcFastMerkleRoot calls
26+
node_fastmerkle = None
27+
28+
def calcfastmerkleroot(leaves):
29+
global node_fastmerkle
30+
return node_fastmerkle.calcfastmerkleroot(leaves)
31+
2532
# Assert functions
2633
##################
2734

test/functional/test_runner.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
# Scripts that are run by the travis build process.
6060
# vv First elements tests vv
6161
'feature_fedpeg.py',
62+
'rpc_calcfastmerkleroot.py',
6263
# Longest test should go first, to favor running tests in parallel
6364
'mempool_packages.py',
6465
'feature_maxuploadtarget.py',

0 commit comments

Comments
 (0)