填充密钥池
写在前面
TopUpKeyPool 填充密钥池
if (IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) { return false; }if (IsLocked()) return false;unsigned int nTargetSize; if (kpSize > 0) nTargetSize = kpSize; else nTargetSize = std::max(gArgs.GetArg("-keypool", DEFAULT_KEYPOOL_SIZE), (int64_t) 0);int64_t missingExternal = std::max(std::max((int64_t) nTargetSize, (int64_t) 1) - (int64_t)setExternalKeyPool.size(), (int64_t) 0); int64_t missingInternal = std::max(std::max((int64_t) nTargetSize, (int64_t) 1) - (int64_t)setInternalKeyPool.size(), (int64_t) 0);if (!IsHDEnabled() || !CanSupportFeature(FEATURE_HD_SPLIT)) { missingInternal = 0; }bool internal = false; WalletBatch batch(*database);if (i < missingInternal) { internal = true; }int64_t index = ++m_max_keypool_index;CPubKey pubkey(GenerateNewKey(batch, internal));bool fCompressed = CanSupportFeature(FEATURE_COMPRPUBKEY);CKey secret; int64_t nCreationTime = GetTime(); CKeyMetadata metadata(nCreationTime);if (IsHDEnabled()) { DeriveNewChildKey(batch, metadata, secret, (CanSupportFeature(FEATURE_HD_SPLIT) ? internal : false)); } else { secret.MakeNewKey(fCompressed); }if (fCompressed) { SetMinVersion(FEATURE_COMPRPUBKEY); }CPubKey CKey::GetPubKey() const { assert(fValid); secp256k1_pubkey pubkey; size_t clen = CPubKey::PUBLIC_KEY_SIZE; CPubKey result; int ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &pubkey, begin()); assert(ret); secp256k1_ec_pubkey_serialize(secp256k1_context_sign, (unsigned char*)result.begin(), &clen, &pubkey, fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED); assert(result.size() == clen); assert(result.IsValid()); return result; }mapKeyMetadata[pubkey.GetID()] = metadata;UpdateTimeFirstKey(nCreationTime);if (!AddKeyPubKeyWithDB(batch, secret, pubkey)) { throw std::runtime_error(std::string(__func__) + ": AddKey failed"); }
if (!batch.WritePool(index, CKeyPool(pubkey, internal))) { throw std::runtime_error(std::string(__func__) + ": writing generated key failed"); }if (internal) { setInternalKeyPool.insert(index); } else { setExternalKeyPool.insert(index); }m_pool_key_to_index[pubkey.GetID()] = index;
DeriveNewChildKey 衍生子密钥
后记

Last updated

