deriveExpandedSpendingKey method

SaplingExtendedSpendingKey deriveExpandedSpendingKey({
  1. required SaplingExtendedSpendingKey parent,
  2. 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),
    ),
  );
}