|
|
@ -18,6 +18,8 @@ |
|
|
|
#include "walletdb.h" |
|
|
|
#include "primitives/transaction.h" |
|
|
|
#include "zcbenchmarks.h" |
|
|
|
#include "key.h" |
|
|
|
#include "script/interpreter.h" |
|
|
|
|
|
|
|
#include <stdint.h> |
|
|
|
|
|
|
@ -2650,22 +2652,38 @@ Value zc_raw_pour(const json_spirit::Array& params, bool fHelp) |
|
|
|
throw runtime_error("unsupported pour input/output counts"); |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: #808
|
|
|
|
uint256 pubKeyHash; |
|
|
|
CKey joinSplitPrivKey; |
|
|
|
joinSplitPrivKey.MakeNewKey(true); |
|
|
|
CCompressedPubKey joinSplitPubKey(joinSplitPrivKey.GetPubKey()); |
|
|
|
|
|
|
|
CMutableTransaction mtx(tx); |
|
|
|
mtx.nVersion = 2; |
|
|
|
mtx.joinSplitPubKey = joinSplitPubKey; |
|
|
|
|
|
|
|
CPourTx pourtx(*pzcashParams, |
|
|
|
pubKeyHash, |
|
|
|
joinSplitPubKey.GetZcashHash(), |
|
|
|
anchor, |
|
|
|
{vpourin[0], vpourin[1]}, |
|
|
|
{vpourout[0], vpourout[1]}, |
|
|
|
vpub_old, |
|
|
|
vpub_new); |
|
|
|
assert(pourtx.Verify(*pzcashParams, joinSplitPubKey.GetZcashHash())); |
|
|
|
|
|
|
|
assert(pourtx.Verify(*pzcashParams, pubKeyHash)); |
|
|
|
|
|
|
|
CMutableTransaction mtx(tx); |
|
|
|
mtx.nVersion = 2; |
|
|
|
mtx.vpour.push_back(pourtx); |
|
|
|
|
|
|
|
// TODO: #966.
|
|
|
|
static const uint256 one(uint256S("0000000000000000000000000000000000000000000000000000000000000001")); |
|
|
|
// Empty output script.
|
|
|
|
CScript scriptCode; |
|
|
|
CTransaction signTx(mtx); |
|
|
|
uint256 dataToBeSigned = SignatureHash(scriptCode, signTx, NOT_AN_INPUT, SIGHASH_ALL); |
|
|
|
if (dataToBeSigned == one) { |
|
|
|
throw runtime_error("SignatureHash failed"); |
|
|
|
} |
|
|
|
|
|
|
|
// Add the signature
|
|
|
|
joinSplitPrivKey.SignCompact(dataToBeSigned, mtx.joinSplitSig); |
|
|
|
|
|
|
|
CTransaction rawTx(mtx); |
|
|
|
|
|
|
|
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); |
|
|
@ -2678,7 +2696,7 @@ Value zc_raw_pour(const json_spirit::Array& params, bool fHelp) |
|
|
|
ss2 << ((unsigned char) 0x00); |
|
|
|
ss2 << pourtx.ephemeralKey; |
|
|
|
ss2 << pourtx.ciphertexts[0]; |
|
|
|
ss2 << pourtx.h_sig(*pzcashParams, pubKeyHash); |
|
|
|
ss2 << pourtx.h_sig(*pzcashParams, joinSplitPubKey.GetZcashHash()); |
|
|
|
|
|
|
|
encryptedBucket1 = HexStr(ss2.begin(), ss2.end()); |
|
|
|
} |
|
|
@ -2687,7 +2705,7 @@ Value zc_raw_pour(const json_spirit::Array& params, bool fHelp) |
|
|
|
ss2 << ((unsigned char) 0x01); |
|
|
|
ss2 << pourtx.ephemeralKey; |
|
|
|
ss2 << pourtx.ciphertexts[1]; |
|
|
|
ss2 << pourtx.h_sig(*pzcashParams, pubKeyHash); |
|
|
|
ss2 << pourtx.h_sig(*pzcashParams, joinSplitPubKey.GetZcashHash()); |
|
|
|
|
|
|
|
encryptedBucket2 = HexStr(ss2.begin(), ss2.end()); |
|
|
|
} |
|
|
|