Skip to content

Commit d3afdda

Browse files
authored
Merge pull request #124 from instagibbs/createblinded
new createblindedaddress call to gen CT address
2 parents bb4e9bb + 528e546 commit d3afdda

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

qa/rpc-tests/confidential_transactions.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,5 +174,22 @@ def run_test(self):
174174
assert_equal(self.nodes[1].getbalance(), node1)
175175
assert_equal(self.nodes[2].getbalance(), node2)
176176

177+
# Check createblindedaddress functionality
178+
blinded_addr = self.nodes[0].getnewaddress()
179+
validated_addr = self.nodes[0].validateaddress(blinded_addr)
180+
blinding_key = self.nodes[0].dumpblindingkey(blinded_addr)
181+
assert_equal(blinded_addr, self.nodes[1].createblindedaddress(validated_addr["unconfidential"], blinding_key))
182+
183+
# If a blinding key is over-ridden by a newly imported one, funds may be unaccounted for
184+
new_addr = self.nodes[0].getnewaddress()
185+
new_validated = self.nodes[0].validateaddress(new_addr)
186+
self.nodes[2].sendtoaddress(new_addr, 1)
187+
diff_blind = self.nodes[1].createblindedaddress(new_validated["unconfidential"], blinding_key)
188+
assert_equal(len(self.nodes[0].listunspent(0, 0, [new_validated["unconfidential"]])), 1)
189+
self.nodes[0].importblindingkey(diff_blind, blinding_key)
190+
# CT values for this wallet transaction have been cached via importblindingkey
191+
# therefore result will be same even though we change blinding keys
192+
assert_equal(len(self.nodes[0].listunspent(0, 0, [new_validated["unconfidential"]])), 1)
193+
177194
if __name__ == '__main__':
178195
CTTest ().main ()

src/rpc/misc.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,48 @@ UniValue createmultisig(const UniValue& params, bool fHelp)
339339
return result;
340340
}
341341

342+
UniValue createblindedaddress(const UniValue& params, bool fHelp)
343+
{
344+
if (fHelp || params.size() != 2)
345+
{
346+
string msg = "createblindedaddress address blinding_key\n"
347+
"\nCreates a blinded address using the provided blinding key.\n"
348+
"\nArguments:\n"
349+
"1. \"address\" (string, required) The unblinded address to be blinded.\n"
350+
"2. \"key\" (string, required) The blinding private key.\n"
351+
"\nResult:\n"
352+
"\"blinded_address\" (string) The blinded address.\n"
353+
"\nExamples:\n"
354+
"\nCreate a multisig address from 2 addresses\n"
355+
+ HelpExampleCli("createblindedaddress", "HEZk3iQi1jC49bxUriTtynnXgWWWdAYx16 ec09811118b6febfa5ebe68642e5091c418fbace07e655da26b4a845a691fc2d") +
356+
"\nAs a json rpc call\n"
357+
+ HelpExampleRpc("createblindedaddress", "HEZk3iQi1jC49bxUriTtynnXgWWWdAYx16, ec09811118b6febfa5ebe68642e5091c418fbace07e655da26b4a845a691fc2d")
358+
;
359+
throw runtime_error(msg);
360+
}
361+
362+
CBitcoinAddress address(params[0].get_str());
363+
if (!address.IsValid()) {
364+
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address or script");
365+
}
366+
if (address.IsBlinded()) {
367+
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Not an unblinded address");
368+
}
369+
370+
if (!IsHex(params[1].get_str())) {
371+
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid hexadecimal for key");
372+
}
373+
std::vector<unsigned char> keydata = ParseHex(params[1].get_str());
374+
if (keydata.size() != 32) {
375+
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid hexadecimal key length, must be 32 bytes long.");
376+
}
377+
378+
CKey key;
379+
key.Set(keydata.begin(), keydata.end(), true);
380+
381+
return address.AddBlindingKey(key.GetPubKey()).ToString();
382+
}
383+
342384
UniValue verifymessage(const UniValue& params, bool fHelp)
343385
{
344386
if (fHelp || params.size() != 3)
@@ -472,6 +514,7 @@ static const CRPCCommand commands[] =
472514
{ "control", "getinfo", &getinfo, true }, /* uses wallet if enabled */
473515
{ "util", "validateaddress", &validateaddress, true }, /* uses wallet if enabled */
474516
{ "util", "createmultisig", &createmultisig, true },
517+
{ "util", "createblindedaddress", &createblindedaddress, true },
475518
{ "util", "verifymessage", &verifymessage, true },
476519
{ "util", "signmessagewithprivkey", &signmessagewithprivkey, true },
477520

0 commit comments

Comments
 (0)