bool CzPIVWallet::RegenerateMint(const CDeterministicMint& dMint, CZerocoinMint& mint) { if (!CheckSeed(dMint)) { uint256 hashSeed = Hash(seedMaster.begin(), seedMaster.end()); return error("%s: master seed does not match!\ndmint:\n %s \nhashSeed: %s\nseed: %s", __func__, dMint.ToString(), hashSeed.GetHex(), seedMaster.GetHex()); } //Generate the coin PrivateCoin coin(Params().Zerocoin_Params(false), dMint.GetDenomination(), false); CDeterministicMint dMintDummy; GenerateMint(dMint.GetCount(), dMint.GetDenomination(), coin, dMintDummy); //Fill in the zerocoinmint object's details CBigNum bnValue = coin.getPublicCoin().getValue(); if (GetPubCoinHash(bnValue) != dMint.GetPubcoinHash()) return error("%s: failed to correctly generate mint, pubcoin hash mismatch", __func__); mint.SetValue(bnValue); CBigNum bnSerial = coin.getSerialNumber(); if (GetSerialHash(bnSerial) != dMint.GetSerialHash()) return error("%s: failed to correctly generate mint, serial hash mismatch", __func__); mint.SetSerialNumber(bnSerial); mint.SetRandomness(coin.getRandomness()); mint.SetPrivKey(coin.getPrivKey()); mint.SetVersion(coin.getVersion()); mint.SetDenomination(dMint.GetDenomination()); mint.SetUsed(dMint.IsUsed()); mint.SetTxHash(dMint.GetTxHash()); mint.SetHeight(dMint.GetHeight()); return true; }
void CzTNXTracker::Add(const CDeterministicMint& dMint, bool isNew, bool isArchived) { CMintMeta meta; meta.hashPubcoin = dMint.GetPubcoinHash(); meta.nHeight = dMint.GetHeight(); meta.nVersion = dMint.GetVersion(); meta.txid = dMint.GetTxHash(); meta.isUsed = dMint.IsUsed(); meta.hashSerial = dMint.GetSerialHash(); meta.hashStake = dMint.GetStakeHash(); meta.denom = dMint.GetDenomination(); meta.isArchived = isArchived; meta.isDeterministic = true; mapSerialHashes[meta.hashSerial] = meta; if (isNew) CWalletDB(strWalletFile).WriteDeterministicMint(dMint); }
void CzPIVWallet::GenerateMint(const uint32_t& nCount, const CoinDenomination denom, PrivateCoin& coin, CDeterministicMint& dMint) { uint512 seedZerocoin = GetZerocoinSeed(nCount); CBigNum bnValue; CBigNum bnSerial; CBigNum bnRandomness; CKey key; SeedToZPIV(seedZerocoin, bnValue, bnSerial, bnRandomness, key); coin = PrivateCoin(Params().Zerocoin_Params(false), denom, bnSerial, bnRandomness); coin.setPrivKey(key.GetPrivKey()); coin.setVersion(PrivateCoin::CURRENT_VERSION); uint256 hashSeed = Hash(seedMaster.begin(), seedMaster.end()); uint256 hashSerial = GetSerialHash(bnSerial); uint256 nSerial = bnSerial.getuint256(); uint256 hashStake = Hash(nSerial.begin(), nSerial.end()); uint256 hashPubcoin = GetPubCoinHash(bnValue); dMint = CDeterministicMint(coin.getVersion(), nCount, hashSeed, hashSerial, hashPubcoin, hashStake); dMint.SetDenomination(denom); }
bool CzTNXTracker::UpdateState(const CMintMeta& meta) { CWalletDB walletdb(strWalletFile); if (meta.isDeterministic) { CDeterministicMint dMint; if (!walletdb.ReadDeterministicMint(meta.hashPubcoin, dMint)) { // Check archive just in case if (!meta.isArchived) return error("%s: failed to read deterministic mint from database", __func__); // Unarchive this mint since it is being requested and updated if (!walletdb.UnarchiveDeterministicMint(meta.hashPubcoin, dMint)) return error("%s: failed to unarchive deterministic mint from database", __func__); } dMint.SetTxHash(meta.txid); dMint.SetHeight(meta.nHeight); dMint.SetUsed(meta.isUsed); dMint.SetDenomination(meta.denom); dMint.SetStakeHash(meta.hashStake); if (!walletdb.WriteDeterministicMint(dMint)) return error("%s: failed to update deterministic mint when writing to db", __func__); } else { CZerocoinMint mint; if (!walletdb.ReadZerocoinMint(meta.hashPubcoin, mint)) return error("%s: failed to read mint from database", __func__); mint.SetTxHash(meta.txid); mint.SetHeight(meta.nHeight); mint.SetUsed(meta.isUsed); mint.SetDenomination(meta.denom); if (!walletdb.WriteZerocoinMint(mint)) return error("%s: failed to write mint to database", __func__); } mapSerialHashes[meta.hashSerial] = meta; return true; }
bool CzPIVWallet::CheckSeed(const CDeterministicMint& dMint) { //Check that the seed is correct todo:handling of incorrect, or multiple seeds uint256 hashSeed = Hash(seedMaster.begin(), seedMaster.end()); return hashSeed == dMint.GetSeedHash(); }