Squashed commit of the following:

commit 843168eddff34390f19fa661ac6315e1a51aafe2
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 14:34:03 2019 +0500

    logging improved for CCtokens.cpp

commit 43c5b3a5c4e36e76a235f987e07fe893d941d95e
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 14:23:41 2019 +0500

    more extra logging disabled for heir and token

commit a3f7ca963a0042237f4c97d6d89852646b541c6c
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 14:13:58 2019 +0500

    more extra logging disabled

commit f4dec8f8ad733c5a61dd0fc9f3decd103dd7a0c3
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 14:05:45 2019 +0500

    more extra logging disabled

commit eb9a41472004ccdacdacfc12b79880ac6da390ee
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 13:50:11 2019 +0500

    extra logging disabled in heir and tokens

commit 0fe01c8a7b52b03e0c0a3ba5d77f916862031d23
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 13:15:08 2019 +0500

    heir normal input validator changed to CNullValidator

commit 3b86e87c83b6993d5a3b4c056c10120223e8c9ed
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 12:58:03 2019 +0500

    enabled logiing in FinalizeCCtx

commit 2ea87c1b3c7967b316d22e2e65fc3c0203cc4b03
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 12:37:43 2019 +0500

    corrected parameters for tests

commit 216eb4ed84c6fd23e3fc22cd79509a09c8504c0c
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 12:22:30 2019 +0500

    changed to eval_assets for test

commit 2af850f06a4692200864a316208cdfc0709b1634
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 02:42:43 2019 +0500

    heiradd loggin vin

commit 28e033d2b2a1a01b2bc9c2d51a81b61ae53f3a29
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 02:04:33 2019 +0500

    logging added

commit ef1dbc504c5984a4997b5e06e736fa7b5b4e125d
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 01:29:46 2019 +0500

    logging added and corrected

commit 98c1e5a6896a97667c9d64f347c26b36c6a320a9
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 01:05:17 2019 +0500

    corrected isHeirSpendingBegan init in _UnmarshalOpret

commit 6006f073bfc136ed06c1636b3e6ffa7b403ce1d9
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 01:01:18 2019 +0500

    corrected dummyIsHeirSpendingBegan using

commit 9a95edf4e311a80538dd7b13aeeb201e97474ee8
Author: dimxy <dimxy@komodoplatform.com>
Date:   Wed Jan 9 00:53:50 2019 +0500

    isHeirSpendingBegan is put in opret

commit 4bd210709626e2f8b99889e50410eb0f75b3dbda
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 20:16:20 2019 +0500

    added logging to _FindLastextFundingTx for print C vouts

commit 3603b49c1143b1efe82dd545b9d7dca43f5bcec0
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 19:25:11 2019 +0500

    corrected isHeirSpendingBegun calc

commit e7d6923d4be080a5e98405634fafb175fa55f801
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 18:43:35 2019 +0500

    yet another cpToken correction in RunValidators

commit e425dcc4497652a062b45d4a5ce4c137bd2caa3d
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 18:22:08 2019 +0500

    changed cp param to cpTokens for heir tokens in validation

commit a4420f30d42d93dbc2729db4a5b2895d4b16d22b
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 17:11:10 2019 +0500

    corrected EVAL_HEIR in create opret

commit 788d75263fd5aaa7b66417441622c9bb6603ab81
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 16:41:07 2019 +0500

    corrected opret forming for 'F', tokens

commit 92bf6c53b36a5a4450b5c7079383792d634d61a7
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 16:12:09 2019 +0500

    _UnmarshalOpret corrected for non F

commit e4eb26e875d44f3e4c1d45aff6df8a7026b3329a
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 15:26:34 2019 +0500

    Revert "CCduration debug logging added"

    This reverts commit 5ffc2b0a8b49d387cd175754738d2c07701c7856.

commit ce97ac88af0b87b304ad1fc9cb29db0803d0bd42
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 15:17:10 2019 +0500

    changed pindex to pindexTip in CCduration for better reading

commit 5ffc2b0a8b49d387cd175754738d2c07701c7856
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 14:43:07 2019 +0500

    CCduration debug logging added

commit 34afdd16f0f6b5b97da864f082dcd019a7566da7
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 12:23:31 2019 +0500

    corrected again order to DecodeOpRet call in heir

commit bba6149969ea23aa4e3c6263a36bae0ba7fa6f5d
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 12:17:11 2019 +0500

    logging added in IsHeirFundingVout

commit 6c5d4b313ef3e54cb5eb2bf67b2fa78d9ffd0b04
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 12:02:15 2019 +0500

    logging added to Add1of2AddrInputs

commit 40d6d84971a8ed764523567f08df4c74fda4f12d
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 11:36:23 2019 +0500

    corrected vopretExtra getting for heir for coins

commit 36061d25fb8992551915afc3dd0600878a64c540
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 11:13:30 2019 +0500

    corrected CCinit C-param separate

commit 0a6710433868c315afe3f656c1bc5f5138fe5288
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 10:58:19 2019 +0500

    logging added in decodeheiropret

commit 2503d8cb59b94b024a9ded43a0602f89800a9549
Author: dimxy <dimxy@komodoplatform.com>
Date:   Tue Jan 8 10:39:21 2019 +0500

    corrected decode opret for heir for coins
This commit is contained in:
dimxy
2019-01-09 16:58:52 +05:00
parent 90f682f022
commit d1bd5b3b6c
4 changed files with 237 additions and 401 deletions

View File

@@ -12,21 +12,15 @@
// makes coin initial tx opret
CScript EncodeHeirCreateOpRet(uint8_t funcid, CPubKey ownerPubkey, CPubKey heirPubkey, int64_t inactivityTimeSec, std::string heirName);
// makes coin additional tx opret
CScript EncodeHeirOpRet(uint8_t funcid, uint256 fundingtxid);
CScript EncodeHeirOpRet(uint8_t funcid, uint256 fundingtxid, uint8_t isHeirSpendingBegan);
// makes token opret
CScript EncodeHeirTokensCreateOpRet(uint8_t funcid, uint256 tokenid, std::vector<CPubKey> voutPubkeys, CPubKey ownerPubkey, CPubKey heirPubkey, int64_t inactivityTimeSec, std::string hearName);
CScript EncodeHeirTokensOpRet(uint8_t funcid, uint256 tokenid, std::vector<CPubKey> voutPubkeys, uint256 fundingtxid);
//CScript EncodeHeirConvertedAssetsOpRet(uint8_t eval, uint8_t funcid, uint256 tokenid, CPubKey ownerPubkey, CPubKey heirPubkey, int64_t inactivityTimeSec, uint256 fundingtxid);
CScript EncodeHeirTokensOpRet(uint8_t funcid, uint256 tokenid, std::vector<CPubKey> voutPubkeys, uint256 fundingtxid, uint8_t isHeirSpendingBegan);
template <class Helper> uint256 FindLatestFundingTx(uint256 fundingtxid, uint256 &tokenid, CScript& opRetScript, bool &isHeirSpendingBegan);
template <class Helper> uint8_t DecodeHeirOpRet(CScript scriptPubKey, uint256 &tokenid, uint256& fundingtxid, bool noLogging = false);
//template <class Helper> uint8_t DecodeHeirOpRet(CScript scriptPubKey, uint256 &tokenid, CPubKey& ownerPubkey, CPubKey& heirPubkey, int64_t& inactivityTime, std::string& heirName, bool noLogging = false);
template <class Helper> uint256 FindLatestFundingTx(uint256 fundingtxid, uint256 &tokenid, CScript& opRetScript, uint8_t &isHeirSpendingBegan);
template <class Helper> uint8_t DecodeHeirOpRet(CScript scriptPubKey, uint256 &tokenid, uint256& fundingtxid, uint8_t &isHeirSpendingBegan, bool noLogging = false);
template <class Helper> uint8_t DecodeHeirOpRet(CScript scriptPubKey, uint256 &tokenid, CPubKey& ownerPubkey, CPubKey& heirPubkey, int64_t& inactivityTime, std::string& heirName, bool noLogging = false);
//int64_t AddHeirTokenInputs(struct CCcontract_info *cp, CMutableTransaction &mtx, CPubKey pk, uint256 reftokenid, int64_t total, int32_t maxinputs);
// helper class to allow polymorphic behaviour for HeirXXX() functions in case of coins
class CoinHelper {
public:
@@ -40,11 +34,11 @@ public:
static CScript makeCreateOpRet(uint256 dummyid, std::vector<CPubKey> dummyPubkeys, CPubKey ownerPubkey, CPubKey heirPubkey, int64_t inactivityTimeSec, std::string heirName) {
return EncodeHeirCreateOpRet((uint8_t)'F', ownerPubkey, heirPubkey, inactivityTimeSec, heirName);
}
static CScript makeAddOpRet(uint256 dummyid, std::vector<CPubKey> dummyPubkeys, uint256 fundingtxid) {
return EncodeHeirOpRet((uint8_t)'A', fundingtxid);
static CScript makeAddOpRet(uint256 dummyid, std::vector<CPubKey> dummyPubkeys, uint256 fundingtxid, uint8_t isHeirSpendingBegan) {
return EncodeHeirOpRet((uint8_t)'A', fundingtxid, isHeirSpendingBegan);
}
static CScript makeClaimOpRet(uint256 dummyid, std::vector<CPubKey> dummyPubkeys, uint256 fundingtxid) {
return EncodeHeirOpRet((uint8_t)'C', fundingtxid);
static CScript makeClaimOpRet(uint256 dummyid, std::vector<CPubKey> dummyPubkeys, uint256 fundingtxid, uint8_t isHeirSpendingBegan) {
return EncodeHeirOpRet((uint8_t)'C', fundingtxid, isHeirSpendingBegan);
}
static bool isSpendingTx(uint8_t funcid) { return (funcid == 'C'); }
@@ -69,11 +63,11 @@ public:
static CScript makeCreateOpRet(uint256 tokenid, std::vector<CPubKey> voutTokenPubkeys, CPubKey ownerPubkey, CPubKey heirPubkey, int64_t inactivityTimeSec, std::string heirName) {
return EncodeHeirTokensCreateOpRet((uint8_t)'F', tokenid, voutTokenPubkeys, ownerPubkey, heirPubkey, inactivityTimeSec, heirName);
}
static CScript makeAddOpRet(uint256 tokenid, std::vector<CPubKey> voutTokenPubkeys, uint256 fundingtxid) {
return EncodeHeirTokensOpRet((uint8_t)'A', tokenid, voutTokenPubkeys, fundingtxid);
static CScript makeAddOpRet(uint256 tokenid, std::vector<CPubKey> voutTokenPubkeys, uint256 fundingtxid, uint8_t isHeirSpendingBegan) {
return EncodeHeirTokensOpRet((uint8_t)'A', tokenid, voutTokenPubkeys, fundingtxid, isHeirSpendingBegan);
}
static CScript makeClaimOpRet(uint256 tokenid, std::vector<CPubKey> voutTokenPubkeys, uint256 fundingtxid) {
return EncodeHeirTokensOpRet((uint8_t)'C', tokenid, voutTokenPubkeys, fundingtxid);
static CScript makeClaimOpRet(uint256 tokenid, std::vector<CPubKey> voutTokenPubkeys, uint256 fundingtxid, uint8_t isHeirSpendingBegan) {
return EncodeHeirTokensOpRet((uint8_t)'C', tokenid, voutTokenPubkeys, fundingtxid, isHeirSpendingBegan);
}
static bool isSpendingTx(uint8_t funcid) { return (funcid == 'C'); }
@@ -86,9 +80,6 @@ public:
}
};
//#define OPTIONAL_VOUT 0 // if vout is optional then in a validation plan it will be skipped without error, if all validators return false
/**
* Small framework for vins and vouts validation implementing a variation of 'chain of responsibility' pattern:
@@ -104,10 +95,8 @@ public:
*
* For validating vouts COutputValidator is configured for each vector of validators with the vout index to which these validators are applied
* (see constructors of both CInputValidator and COutputValidator)
*
*
* Base class for all validators
*/
/**
* base class for all validators
*/
@@ -123,7 +112,6 @@ protected:
CCcontract_info * m_cp;
};
/**
* Base class for classes which identify vins as normal or cc inputs
*/
@@ -137,9 +125,6 @@ protected:
CCcontract_info * m_cp;
};
/**
* Encapsulates an array containing rows of validators
* Each row is a vector of validators (zero is possible) for validating vins or prev tx's vouts
@@ -222,7 +207,7 @@ public:
return eval->Invalid("incorrect tx structure: not all required vins are present.");
}
std::cerr << "CInputValidationPlan::validate() returns with true" << std::endl;
//std::cerr << "CInputValidationPlan::validate() returns with true" << std::endl;
return true;
}
@@ -246,7 +231,7 @@ private:
// get requested row of validators:
ValidatorsRow vValidators = m_arrayValidators[ival].second;
std::cerr << "CInputValidationPlan::execValidatorsInRow() calling validators" << " for vin iv=" << iv << " ival=" << ival << std::endl;
//std::cerr << "CInputValidationPlan::execValidatorsInRow() calling validators" << " for vin iv=" << iv << " ival=" << ival << std::endl;
for (auto v : vValidators) {
bool result;
@@ -327,7 +312,7 @@ public:
}
std::cerr << "COutputValidationPlan::validate() returns with true" << std::endl;
//std::cerr << "COutputValidationPlan::validate() returns with true" << std::endl;
return true;
}
@@ -351,7 +336,7 @@ private:
// get requested row of validators:
ValidatorsRow vValidators = m_arrayValidators[ival].second;
std::cerr << "COutputValidationPlan::execRow() calling validators" << " for vout iv=" << iv << " ival=" << ival << std::endl;
//std::cerr << "COutputValidationPlan::execRow() calling validators" << " for vout iv=" << iv << " ival=" << ival << std::endl;
for (auto v : vValidators) {
@@ -422,7 +407,7 @@ public:
GetCCaddress1of2(m_cp, shouldBeAddr, ownerPubkey, heirPubkey);
if (vout.scriptPubKey.IsPayToCryptoCondition()) {
if (Getscriptaddress(ccAddr, vout.scriptPubKey) && strcmp(shouldBeAddr, ccAddr) == 0) {
std::cerr << "CCC1of2AddressValidator::validateVout() exits with true" << std::endl;
//std::cerr << "CCC1of2AddressValidator::validateVout() exits with true" << std::endl;
return true;
}
else {
@@ -476,23 +461,24 @@ public:
if (m_checkNormals) {
ownerScript = CoinHelper::makeUserVout(vout.nValue, ownerPubkey).scriptPubKey;
heirScript = CoinHelper::makeUserVout(vout.nValue, heirPubkey).scriptPubKey;
std::cerr << "CMyPubkeyVoutValidator::validateVout() vout.scriptPubKey=" << vout.scriptPubKey.ToString() << " makeUserVout(coin,owner)=" << CoinHelper::makeUserVout(vout.nValue, ownerPubkey).scriptPubKey.ToString() << " makeUserVout(coin,heir)=" << CoinHelper::makeUserVout(vout.nValue, heirPubkey).scriptPubKey.ToString() << std::endl;
}
else {
ownerScript = Helper::makeUserVout(vout.nValue, ownerPubkey).scriptPubKey;
heirScript = Helper::makeUserVout(vout.nValue, heirPubkey).scriptPubKey;
std::cerr << "CMyPubkeyVoutValidator::validateVout() vout.scriptPubKey=" << vout.scriptPubKey.ToString() << " makeUserVout(owner)=" << Helper::makeUserVout(vout.nValue, ownerPubkey).scriptPubKey.ToString() << " makeUserVout(heir)=" << Helper::makeUserVout(vout.nValue, heirPubkey).scriptPubKey.ToString() << std::endl;
}
//std::cerr << "CMyPubkeyVoutValidator::validateVout() vout.scriptPubKey=" << vout.scriptPubKey.ToString() << " makeUserVout=" << Helper::makeUserVout(vout.nValue, ownerPubkey).scriptPubKey.ToString() << std::endl;
// recreate scriptPubKey for owner and heir and compare it with that of the vout to check:
if (vout.scriptPubKey == ownerScript || vout.scriptPubKey == heirScript) {
// this is vout to owner or heir addr:
std::cerr << "CMyPubkeyVoutValidator::validateVout() exits with true" << std::endl;
//std::cerr << "CMyPubkeyVoutValidator::validateVout() exits with true" << std::endl;
return true;
}
std::cerr << "CMyPubkeyVoutValidator::validateVout() exits with false (not the owner's or heir's addresses)" << std::endl;
message = std::string("invalid pubkey");
return false;
}
virtual bool validateVin(CTxIn vin, CTxOut prevVout, std::string& message) const { return true; }
@@ -509,7 +495,7 @@ private:
template <class Helper> class CHeirSpendValidator : CValidatorBase
{
public:
CHeirSpendValidator(CCcontract_info* cp, CScript opRetScript, uint256 latesttxid, bool isHeirSpendingBegan)
CHeirSpendValidator(CCcontract_info* cp, CScript opRetScript, uint256 latesttxid, uint8_t isHeirSpendingBegan)
: m_fundingOpretScript(opRetScript), m_latesttxid(latesttxid), m_isHeirSpendingBegan(isHeirSpendingBegan), CValidatorBase(cp) {}
virtual bool isVinValidator() const { return false; }
@@ -547,7 +533,7 @@ public:
}
}
std::cerr << "CHeirSpendValidator::validateVout() exits with true" << std::endl;
//std::cerr << "CHeirSpendValidator::validateVout() exits with true" << std::endl;
// this is not heir:
return true;
@@ -557,7 +543,7 @@ public:
private:
CScript m_fundingOpretScript;
uint256 m_latesttxid;
bool m_isHeirSpendingBegan;
uint8_t m_isHeirSpendingBegan;
};
/**
@@ -576,12 +562,13 @@ public:
uint8_t funcId, initialFuncId; // do not check heir name
uint256 fundingTxidInOpret = zeroid, dummyTxid, tokenid, initialTokenid;
uint8_t dummyIsHeirSpendingBegan;
if ((funcId = DecodeHeirOpRet<Helper>(vout.scriptPubKey, tokenid, fundingTxidInOpret)) == 0) {
if ((funcId = DecodeHeirOpRet<Helper>(vout.scriptPubKey, tokenid, fundingTxidInOpret, dummyIsHeirSpendingBegan)) == 0) {
message = std::string("invalid opreturn format");
return false;
}
if ((initialFuncId = DecodeHeirOpRet<Helper>(m_fundingOpretScript, initialTokenid, dummyTxid)) == 0) {
if ((initialFuncId = DecodeHeirOpRet<Helper>(m_fundingOpretScript, initialTokenid, dummyTxid, dummyIsHeirSpendingBegan)) == 0) {
message = std::string("invalid initial tx opreturn format");
return false;
}
@@ -606,6 +593,19 @@ private:
CScript m_fundingOpretScript;
};
/**
* empty validator always returns true
*/
template <class Helper> class CNullValidator : CValidatorBase
{
public:
CNullValidator(CCcontract_info* cp)
: CValidatorBase(cp) { }
virtual bool isVinValidator() const { return false; }
virtual bool validateVout(CTxOut vout, std::string& message) const { return true; }
virtual bool validateVin(CTxIn vin, CTxOut prevVout, std::string& message) const { return true; }
};
#endif