calculateSignatureHash function

Uint8List calculateSignatureHash({
  1. required Transaction tx,
  2. required int inputIndex,
  3. required TxInput txInput,
  4. required ScriptPublicKey prevScriptPublicKey,
  5. required SigHashType hashType,
  6. required SighashReusedValues reusedValues,
})

Implementation

Uint8List calculateSignatureHash({
  required Transaction tx,
  required int inputIndex,
  required TxInput txInput,
  required ScriptPublicKey prevScriptPublicKey,
  required SigHashType hashType,
  required SighashReusedValues reusedValues,
}) {
  final builder = BytesBuilder();

  // version
  final version = _getUint16(tx.version);
  builder.add(version);

  // previosOutputsHash
  final previousOutputsHash = _getPreviousOutputsHash(
    tx: tx,
    hashType: hashType,
    reusedValues: reusedValues,
  );
  builder.add(previousOutputsHash);

  // sequencesHash
  final sequencesHash = _getSequencesHash(
    tx: tx,
    hashType: hashType,
    reusedValues: reusedValues,
  );
  builder.add(sequencesHash);

  // sigOpCountsHash
  final sigOpCountsHash = _getSigOpCountsHash(
    tx: tx,
    hashType: hashType,
    reusedValues: reusedValues,
  );
  builder.add(sigOpCountsHash);

  // hashOutpoint
  _addOutpoint(txInput.previousOutpoint, builder: builder);

  // prevScriptPublicKey
  builder.add(_getUint16(prevScriptPublicKey.version));
  final script = prevScriptPublicKey.scriptPublicKey;
  builder.add(Int64(script.length).toBytes());
  builder.add(script);

  // amount
  builder.add(txInput.utxoEntry.amount.toInt64().toBytes());

  // sequence
  builder.add(txInput.sequence.toBytes());

  // sigOpCount
  builder.addByte(txInput.sigOpCount);

  // outputsHash
  final outputsHash = _getOutputsHash(
    tx: tx,
    inputIndex: inputIndex,
    hashType: hashType,
    reusedValues: reusedValues,
  );
  builder.add(outputsHash);

  // lockTime
  builder.add(tx.lockTime.toBytes());

  // subnetworkId
  builder.add(tx.subnetworkId);

  // gas
  builder.add(tx.gas.toBytes());

  // payloadHash
  builder.add(Uint8List(32));

  // hashType
  builder.addByte(hashType.raw);

  final blake2b = Blake2bDigest(
    digestSize: 32,
    key: stringToBytesUtf8(kTransactionSigningDomain),
  );

  final hash = blake2b.process(builder.takeBytes());

  return hash;
}