serialize method
Encodes this message into a buffer.
Implementation
Buffer serialize() {
// Create a fixed-length writable buffer for signed data.
final signaturesBuffer = BufferWriter(2048);
// Write the version number.
final int? version = this.version;
if (version != null) {
final int maskedVersion = versionPrefixFlag | version;
signaturesBuffer.setUint8(maskedVersion);
}
/// Write the message header.
signaturesBuffer.setUint8(header.numRequiredSignatures);
signaturesBuffer.setUint8(header.numReadonlySignedAccounts);
signaturesBuffer.setUint8(header.numReadonlyUnsignedAccounts);
// Write the encoded account keys length.
final int keysLength = accountKeys.length;
signaturesBuffer.setBuffer(shortvec.encodeLength(keysLength));
/// Write the account addresses.
for (final accountKey in accountKeys) {
signaturesBuffer.setBuffer(accountKey.toBytes());
}
/// Write the 32-byte SHA-256 hash.
final Blockhash blockhash = recentBlockhash;
// ignore: unnecessary_null_comparison
check(blockhash != null, 'Message requires a recentBlockhash.');
signaturesBuffer.setBuffer(base58.decode(blockhash));
// Create a fixed-length writable buffer with the maximum packet size.
final instructionsBuffer = BufferWriter(packetDataSize);
// Write the encoded instructions length.
final List<int> ixsEncodedLength =
shortvec.encodeLength(instructions.length);
instructionsBuffer.setBuffer(ixsEncodedLength);
// Write the message instructions.
for (final MessageInstruction instruction in instructions) {
// Program ID index.
final int programIdIndex = instruction.programIdIndex;
instructionsBuffer.setUint8(programIdIndex);
// Compact array of account address indexes.
final List<int> keyIndicesCount =
shortvec.encodeLength(instruction.accounts.length);
instructionsBuffer.setBuffer(keyIndicesCount);
final Iterable<int> keyIndices = instruction.accounts;
instructionsBuffer.setBuffer(keyIndices);
// Compact array of opaque 8-bit data.
final Uint8List data = base58.decode(instruction.data);
final List<int> dataLength = shortvec.encodeLength(data.length);
instructionsBuffer.setBuffer(dataLength);
instructionsBuffer.setBuffer(data);
}
// Create a fixed-length writable buffer with the maximum packet size.
final addressTableLookupsBuffer = BufferWriter(packetDataSize);
if (version != null) {
// Write the encoded table lookups length.
final List<int> addressTableLookupsLength =
shortvec.encodeLength(addressTableLookups.length);
addressTableLookupsBuffer.setBuffer(addressTableLookupsLength);
for (final MessageAddressTableLookup addressTableLookup
in addressTableLookups) {
// Compact array of the writable indexes length.
final List<int> writableIndexes = addressTableLookup.writableIndexes;
final List<int> writableIndexesCount =
shortvec.encodeLength(writableIndexes.length);
// Compact array of the readonly indexes length.
final List<int> readonlyIndexes = addressTableLookup.readonlyIndexes;
final List<int> readonlyIndexesCount =
shortvec.encodeLength(readonlyIndexes.length);
addressTableLookupsBuffer
.setBuffer(addressTableLookup.accountKey.toBytes());
addressTableLookupsBuffer.setBuffer(writableIndexesCount);
addressTableLookupsBuffer.setBuffer(writableIndexes);
addressTableLookupsBuffer.setBuffer(readonlyIndexesCount);
addressTableLookupsBuffer.setBuffer(readonlyIndexes);
}
}
/// Resize and merge the buffers.
return signaturesBuffer.toBuffer(slice: true) +
instructionsBuffer.toBuffer(slice: true) +
addressTableLookupsBuffer.toBuffer(slice: true);
}