calculateSignatureHash function
Uint8List
calculateSignatureHash({
- required Transaction tx,
- required int inputIndex,
- required TxInput txInput,
- required ScriptPublicKey prevScriptPublicKey,
- required SigHashType hashType,
- 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;
}