deriveExpandedSpendingKey method
SaplingExtendedSpendingKey
deriveExpandedSpendingKey({
- required SaplingExtendedSpendingKey parent,
- required Bip32KeyIndex index,
Implementation
SaplingExtendedSpendingKey deriveExpandedSpendingKey({
required SaplingExtendedSpendingKey parent,
required Bip32KeyIndex index,
}) {
final ctx = deriveFromSecret(parent: parent, index: index);
JubJubFr ask = JubJubFr.fromBytes64(
PrfExpand.saplingZip32ChildIAsk.apply(ctx.key),
);
JubJubFr nsk = JubJubFr.fromBytes64(
PrfExpand.saplingZip32ChildINsk.apply(ctx.key),
);
ask += parent.sk.ask.inner;
nsk += parent.sk.nsk;
final sk = SaplingExpandedSpendingKey(
ask: SaplingSpendAuthorizingKey(ask),
nsk: nsk,
ovk: deriveChildOvk(parentOvk: parent.sk.ovk, childSk: ctx.key),
);
final fvk = parent.sk.toFvk();
final pfBytes = QuickCrypto.blake2b256Hash(
fvk.toBytes(),
personalization: "ZcashSaplingFVFP".codeUnits,
);
return SaplingExtendedSpendingKey(
sk: sk,
keyData: SaplingZip32KeyData(
depth: parent.keyData.depth.increase(),
fingerPrint: Bip32FingerPrint(pfBytes),
index: index,
chainCode: ctx.chainCode,
dk: parent.keyData.dk.deriveChild(ctx.key),
),
);
}