rpc methods for cross chain transactions

This commit is contained in:
Scott Sadler
2018-05-22 15:16:37 -03:00
parent 0df96a2f06
commit 0b485d3c66
9 changed files with 74 additions and 32 deletions

View File

@@ -1,9 +1,14 @@
#include "cc/eval.h" #include "cc/eval.h"
#include "importcoin.h"
#include "main.h" #include "main.h"
#include "notarisationdb.h" #include "notarisationdb.h"
#include "komodo_structs.h" #include "komodo_structs.h"
/*
* This file is built in the server
*/
/* On KMD */ /* On KMD */
uint256 CalculateProofRoot(const char* symbol, uint32_t targetCCid, int kmdHeight, uint256 CalculateProofRoot(const char* symbol, uint32_t targetCCid, int kmdHeight,
std::vector<uint256> &moms, uint256 &destNotarisationTxid) std::vector<uint256> &moms, uint256 &destNotarisationTxid)
@@ -123,6 +128,30 @@ cont:
} }
/*
* Takes an importTx that has proof leading to assetchain root
* and extends proof to cross chain root
*/
void CompleteImportTransaction(CTransaction &importTx)
{
TxProof proof;
CTransaction burnTx;
std::vector<CTxOut> payouts;
if (!UnmarshalImportTx(importTx, proof, burnTx, payouts))
throw std::runtime_error("Couldn't parse importTx");
std::string targetSymbol;
uint32_t targetCCid;
uint256 payoutsHash;
if (!UnmarshalBurnTx(burnTx, targetSymbol, &targetCCid, payoutsHash))
throw std::runtime_error("Couldn't parse burnTx");
proof = GetCrossChainProof(burnTx.GetHash(), targetSymbol.data(), targetCCid, proof);
importTx = MakeImportCoinTransaction(proof, burnTx, importTx.vout);
}
struct notarized_checkpoint *komodo_npptr_at(int idx); struct notarized_checkpoint *komodo_npptr_at(int idx);
struct notarized_checkpoint *komodo_npptr_for_height(int32_t height, int *idx); struct notarized_checkpoint *komodo_npptr_for_height(int32_t height, int *idx);
@@ -236,3 +265,5 @@ TxProof GetAssetchainProof(uint256 hash)
CDataStream ssProof(SER_NETWORK, PROTOCOL_VERSION); CDataStream ssProof(SER_NETWORK, PROTOCOL_VERSION);
return std::make_pair(np->notarized_desttxid, MerkleBranch(nIndex, branch)); return std::make_pair(np->notarized_desttxid, MerkleBranch(nIndex, branch));
} }

View File

@@ -10,10 +10,9 @@ TxProof GetAssetchainProof(uint256 hash);
/* On KMD */ /* On KMD */
uint256 CalculateProofRoot(const char* symbol, uint32_t targetCCid, int kmdHeight, uint256 CalculateProofRoot(const char* symbol, uint32_t targetCCid, int kmdHeight,
std::vector<uint256> &moms, uint256 &destNotarisationTxid); std::vector<uint256> &moms, uint256 &destNotarisationTxid);
/* On KMD */
TxProof GetCrossChainProof(const uint256 txid, const char* targetSymbol, uint32_t targetCCid, TxProof GetCrossChainProof(const uint256 txid, const char* targetSymbol, uint32_t targetCCid,
const TxProof assetChainProof); const TxProof assetChainProof);
void CompleteImportTransaction(CTransaction &importTx);
/* On assetchain */ /* On assetchain */
bool GetNextBacknotarisation(uint256 txid, std::pair<uint256,NotarisationData> &bn); bool GetNextBacknotarisation(uint256 txid, std::pair<uint256,NotarisationData> &bn);

View File

@@ -1,3 +1,4 @@
#include "crosschain.h"
#include "importcoin.h" #include "importcoin.h"
#include "cc/utils.h" #include "cc/utils.h"
#include "coins.h" #include "coins.h"

View File

@@ -21,7 +21,6 @@ bool UnmarshalImportTx(const CTransaction &importTx, TxProof &proof, CTransactio
bool VerifyCoinImport(const CScript& scriptSig, TransactionSignatureChecker& checker, CValidationState &state); bool VerifyCoinImport(const CScript& scriptSig, TransactionSignatureChecker& checker, CValidationState &state);
void AddImportTombstone(const CTransaction &importTx, CCoinsViewCache &inputs, int nHeight); void AddImportTombstone(const CTransaction &importTx, CCoinsViewCache &inputs, int nHeight);
void RemoveImportTombstone(const CTransaction &importTx, CCoinsViewCache &inputs); void RemoveImportTombstone(const CTransaction &importTx, CCoinsViewCache &inputs);
int ExistsImportTombstone(const CTransaction &importTx, const CCoinsViewCache &inputs); int ExistsImportTombstone(const CTransaction &importTx, const CCoinsViewCache &inputs);

View File

@@ -134,16 +134,25 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "paxprices", 3 }, { "paxprices", 3 },
{ "paxpending", 0 }, { "paxpending", 0 },
{ "notaries", 2 }, { "notaries", 2 },
{ "height_MoM", 1 },
{ "MoMoMdata", 3 },
{ "txMoMproof", 1 },
{ "minerids", 1 }, { "minerids", 1 },
{ "kvsearch", 1 }, { "kvsearch", 1 },
{ "kvupdate", 4 }, { "kvupdate", 4 },
{ "z_importkey", 2 }, { "z_importkey", 2 },
{ "z_importviewingkey", 2 }, { "z_importviewingkey", 2 },
{ "z_getpaymentdisclosure", 1}, { "z_getpaymentdisclosure", 1},
{ "z_getpaymentdisclosure", 2} { "z_getpaymentdisclosure", 2},
// crosschain
{ "assetchainproof", 1},
{ "crosschainproof", 1},
{ "getproofroot", 2},
{ "height_MoM", 1},
{ "MoMoMdata", 3},
{ "calc_MoM", 2},
{ "migrate_converttoexport", 3},
{ "migrate_createimporttransaction", 2},
{ "migrate_completeimporttransaction", 1}
}; };
class CRPCConvertTable class CRPCConvertTable

View File

@@ -164,12 +164,12 @@ UniValue migrate_converttoexport(const UniValue& params, bool fHelp)
{ {
if (fHelp || params.size() != 3) if (fHelp || params.size() != 3)
throw runtime_error( throw runtime_error(
"migrate_converttoexport \"hexstring\" \"dest_symbol\" \"burn_amount\"\n" "migrate_converttoexport rawTx dest_symbol burn_amount\n"
"\nConvert a raw transaction to a cross-chain export.\n" "\nConvert a raw transaction to a cross-chain export.\n"
"If neccesary, the transaction should be funded using fundrawtransaction.\n" "If neccesary, the transaction should be funded using fundrawtransaction.\n"
"Finally, the transaction should be signed using signrawtransaction\n" "Finally, the transaction should be signed using signrawtransaction\n"
"The finished export transaction, plus the vouts, should be passed to " "The finished export transaction, plus the payouts, should be passed to "
"the \"importtransaction\" method on a KMD node to get the corresponding " "the \"migrate_createimporttransaction\" method on a KMD node to get the corresponding "
"import transaction.\n" "import transaction.\n"
); );
@@ -199,7 +199,7 @@ UniValue migrate_converttoexport(const UniValue& params, bool fHelp)
CTxOut burnOut = MakeBurnOutput(burnAmount, ASSETCHAINS_CC, targetSymbol, tx.vout); CTxOut burnOut = MakeBurnOutput(burnAmount, ASSETCHAINS_CC, targetSymbol, tx.vout);
UniValue ret(UniValue::VOBJ); UniValue ret(UniValue::VOBJ);
ret.push_back(Pair("vouts", HexStr(E_MARSHAL(ss << tx.vout)))); ret.push_back(Pair("payouts", HexStr(E_MARSHAL(ss << tx.vout))));
tx.vout.clear(); tx.vout.clear();
tx.vout.push_back(burnOut); tx.vout.push_back(burnOut);
ret.push_back(Pair("exportTx", HexStr(E_MARSHAL(ss << tx)))); ret.push_back(Pair("exportTx", HexStr(E_MARSHAL(ss << tx))));
@@ -224,7 +224,8 @@ UniValue migrate_converttoexport(const UniValue& params, bool fHelp)
UniValue migrate_createimporttransaction(const UniValue& params, bool fHelp) UniValue migrate_createimporttransaction(const UniValue& params, bool fHelp)
{ {
if (fHelp || params.size() != 2) if (fHelp || params.size() != 2)
throw runtime_error(""); throw runtime_error("migrate_createimporttransaction burnTx payouts\n\n"
"Create an importTx given a burnTx and the corresponding payouts, hex encoded");
if (ASSETCHAINS_CC < 2) if (ASSETCHAINS_CC < 2)
throw runtime_error("-ac_cc < 2"); throw runtime_error("-ac_cc < 2");
@@ -254,30 +255,18 @@ UniValue migrate_createimporttransaction(const UniValue& params, bool fHelp)
UniValue migrate_completeimporttransaction(const UniValue& params, bool fHelp) UniValue migrate_completeimporttransaction(const UniValue& params, bool fHelp)
{ {
if (fHelp || params.size() != 1) if (fHelp || params.size() != 1)
throw runtime_error(""); throw runtime_error("migrate_completeimporttransaction importTx\n\n"
"Takes a cross chain import tx with proof generated on assetchain "
"and extends proof to target chain proof root");
if (ASSETCHAINS_SYMBOL[0] != 0) if (ASSETCHAINS_SYMBOL[0] != 0)
throw runtime_error("Must be called on KMD"); throw runtime_error("Must be called on KMD");
CTransaction importTx; CTransaction importTx;
if (!E_UNMARSHAL(ParseHexV(params[0], "argument 2"), ss >> importTx)) if (!E_UNMARSHAL(ParseHexV(params[0], "argument 1"), ss >> importTx))
throw runtime_error("Couldn't parse importTx"); throw runtime_error("Couldn't parse importTx");
TxProof proof; CompleteImportTransaction(importTx);
CTransaction burnTx;
vector<CTxOut> payouts;
if (!UnmarshalImportTx(importTx, proof, burnTx, payouts))
throw runtime_error("Couldn't parse importTx data");
std::string targetSymbol;
uint32_t targetCCid;
uint256 payoutsHash;
if (!UnmarshalBurnTx(burnTx, targetSymbol, &targetCCid, payoutsHash))
throw runtime_error("Couldn't parse burnTx data");
proof = GetCrossChainProof(burnTx.GetHash(), targetSymbol.data(), targetCCid, proof);
importTx = MakeImportCoinTransaction(proof, burnTx, importTx.vout);
return HexStr(E_MARSHAL(ss << importTx)); return HexStr(E_MARSHAL(ss << importTx));
} }

View File

@@ -312,6 +312,9 @@ static const CRPCCommand vRPCCommands[] =
{ "crosschain", "height_MoM", &height_MoM, true }, { "crosschain", "height_MoM", &height_MoM, true },
{ "crosschain", "assetchainproof", &assetchainproof, true }, { "crosschain", "assetchainproof", &assetchainproof, true },
{ "crosschain", "crosschainproof", &crosschainproof, true }, { "crosschain", "crosschainproof", &crosschainproof, true },
{ "crosschain", "migrate_converttoexport", &migrate_converttoexport, true },
{ "crosschain", "migrate_createimporttransaction", &migrate_createimporttransaction, true },
{ "crosschain", "migrate_completeimporttransaction", &migrate_completeimporttransaction, true },
/* Mining */ /* Mining */
{ "mining", "getblocktemplate", &getblocktemplate, true }, { "mining", "getblocktemplate", &getblocktemplate, true },

View File

@@ -317,6 +317,10 @@ extern UniValue calc_MoM(const UniValue& params, bool fHelp);
extern UniValue height_MoM(const UniValue& params, bool fHelp); extern UniValue height_MoM(const UniValue& params, bool fHelp);
extern UniValue assetchainproof(const UniValue& params, bool fHelp); extern UniValue assetchainproof(const UniValue& params, bool fHelp);
extern UniValue crosschainproof(const UniValue& params, bool fHelp); extern UniValue crosschainproof(const UniValue& params, bool fHelp);
extern UniValue migrate_converttoexport(const UniValue& params, bool fHelp);
extern UniValue migrate_createimporttransaction(const UniValue& params, bool fHelp);
extern UniValue migrate_completeimporttransaction(const UniValue& params, bool fHelp);
extern UniValue notaries(const UniValue& params, bool fHelp); extern UniValue notaries(const UniValue& params, bool fHelp);
extern UniValue minerids(const UniValue& params, bool fHelp); extern UniValue minerids(const UniValue& params, bool fHelp);
extern UniValue kvsearch(const UniValue& params, bool fHelp); extern UniValue kvsearch(const UniValue& params, bool fHelp);

View File

@@ -133,7 +133,7 @@ TEST_F(TestCrossChain, testCreateAndValidateImportProof)
} }
/* /*
* Generate proof * Test a proof
*/ */
uint256 txid = blocks[7].vtx[0].GetHash(); uint256 txid = blocks[7].vtx[0].GetHash();
TxProof proof = GetAssetchainProof(txid); TxProof proof = GetAssetchainProof(txid);
@@ -141,8 +141,15 @@ TEST_F(TestCrossChain, testCreateAndValidateImportProof)
E_UNMARSHAL(RecvIPC(), ss >> proof); E_UNMARSHAL(RecvIPC(), ss >> proof);
std::pair<uint256,NotarisationData> bn; std::pair<uint256,NotarisationData> bn;
if (!GetNextBacknotarisation(proof.first, bn)) return 1; if (!GetNextBacknotarisation(proof.first, bn)) {
return proof.second.Exec(txid) == bn.second.MoMoM ? 0 : 1; printf("GetNextBackNotarisation failed\n");
return 1;
}
if (proof.second.Exec(txid) != bn.second.MoMoM) {
printf("MoMom incorrect\n");
return 1;
}
return 0;
}; };
auto RunTestKmd = [&] () auto RunTestKmd = [&] ()