Add basic support for V5 extrinsics

This commit is contained in:
James Wilson
2024-10-22 12:30:34 +01:00
parent 44517aabfc
commit 480d7d1597
3 changed files with 54 additions and 38 deletions
Generated
+15 -15
View File
@@ -327,7 +327,7 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
[[package]] [[package]]
name = "artifacts" name = "artifacts"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"substrate-runner", "substrate-runner",
] ]
@@ -1812,7 +1812,7 @@ dependencies = [
[[package]] [[package]]
name = "generate-custom-metadata" name = "generate-custom-metadata"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"frame-metadata 16.0.0", "frame-metadata 16.0.0",
"parity-scale-codec", "parity-scale-codec",
@@ -2309,7 +2309,7 @@ dependencies = [
[[package]] [[package]]
name = "integration-tests" name = "integration-tests"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"assert_matches", "assert_matches",
"cfg_aliases", "cfg_aliases",
@@ -4745,7 +4745,7 @@ dependencies = [
[[package]] [[package]]
name = "substrate-runner" name = "substrate-runner"
version = "0.36.1" version = "0.37.0"
[[package]] [[package]]
name = "subtle" name = "subtle"
@@ -4755,7 +4755,7 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
[[package]] [[package]]
name = "subxt" name = "subxt"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"assert_matches", "assert_matches",
"async-trait", "async-trait",
@@ -4798,7 +4798,7 @@ dependencies = [
[[package]] [[package]]
name = "subxt-cli" name = "subxt-cli"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"clap 4.5.4", "clap 4.5.4",
"color-eyre", "color-eyre",
@@ -4827,7 +4827,7 @@ dependencies = [
[[package]] [[package]]
name = "subxt-codegen" name = "subxt-codegen"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"frame-metadata 16.0.0", "frame-metadata 16.0.0",
"getrandom", "getrandom",
@@ -4847,7 +4847,7 @@ dependencies = [
[[package]] [[package]]
name = "subxt-core" name = "subxt-core"
version = "0.36.1" version = "0.37.1"
dependencies = [ dependencies = [
"assert_matches", "assert_matches",
"base58", "base58",
@@ -4879,7 +4879,7 @@ dependencies = [
[[package]] [[package]]
name = "subxt-lightclient" name = "subxt-lightclient"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"futures", "futures",
"futures-timer", "futures-timer",
@@ -4904,7 +4904,7 @@ dependencies = [
[[package]] [[package]]
name = "subxt-macro" name = "subxt-macro"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"darling 0.20.8", "darling 0.20.8",
"parity-scale-codec", "parity-scale-codec",
@@ -4917,7 +4917,7 @@ dependencies = [
[[package]] [[package]]
name = "subxt-metadata" name = "subxt-metadata"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"assert_matches", "assert_matches",
"bitvec", "bitvec",
@@ -4931,7 +4931,7 @@ dependencies = [
[[package]] [[package]]
name = "subxt-signer" name = "subxt-signer"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"bip32", "bip32",
"bip39", "bip39",
@@ -4958,7 +4958,7 @@ dependencies = [
[[package]] [[package]]
name = "subxt-test-macro" name = "subxt-test-macro"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"quote", "quote",
"syn 2.0.60", "syn 2.0.60",
@@ -5021,7 +5021,7 @@ dependencies = [
[[package]] [[package]]
name = "test-runtime" name = "test-runtime"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"hex", "hex",
"impl-serde", "impl-serde",
@@ -5446,7 +5446,7 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]] [[package]]
name = "ui-tests" name = "ui-tests"
version = "0.36.1" version = "0.37.0"
dependencies = [ dependencies = [
"frame-metadata 16.0.0", "frame-metadata 16.0.0",
"generate-custom-metadata", "generate-custom-metadata",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "subxt-core" name = "subxt-core"
version.workspace = true version = "0.37.1"
authors.workspace = true authors.workspace = true
edition.workspace = true edition.workspace = true
rust-version.workspace = true rust-version.workspace = true
+38 -22
View File
@@ -149,7 +149,9 @@ pub struct SignedExtrinsicDetails {
address_end_idx: usize, address_end_idx: usize,
/// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature. Equivalent to extra_start_idx. /// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature. Equivalent to extra_start_idx.
signature_end_idx: usize, signature_end_idx: usize,
/// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the signature. /// start index of the range in `bytes` of `ExtrinsicDetails` that encodes the extensions.
extra_start_idx: usize,
/// end index of the range in `bytes` of `ExtrinsicDetails` that encodes the extensions.
extra_end_idx: usize, extra_end_idx: usize,
} }
@@ -165,9 +167,8 @@ where
metadata: Metadata, metadata: Metadata,
ids: ExtrinsicPartTypeIds, ids: ExtrinsicPartTypeIds,
) -> Result<ExtrinsicDetails<T>, Error> { ) -> Result<ExtrinsicDetails<T>, Error> {
const SIGNATURE_MASK: u8 = 0b1000_0000; const SIGNATURE_MASK: u8 = 0b1100_0000;
const VERSION_MASK: u8 = 0b0111_1111; const VERSION_MASK: u8 = 0b0011_1111;
const LATEST_EXTRINSIC_VERSION: u8 = 4;
// removing the compact encoded prefix: // removing the compact encoded prefix:
let bytes: Arc<[u8]> = strip_compact_prefix(extrinsic_bytes)?.1.into(); let bytes: Arc<[u8]> = strip_compact_prefix(extrinsic_bytes)?.1.into();
@@ -179,11 +180,13 @@ where
let first_byte: u8 = Decode::decode(&mut &bytes[..])?; let first_byte: u8 = Decode::decode(&mut &bytes[..])?;
let version = first_byte & VERSION_MASK; let version = first_byte & VERSION_MASK;
if version != LATEST_EXTRINSIC_VERSION { if version != 4 && version != 5 {
return Err(BlockError::UnsupportedVersion(version).into()); return Err(BlockError::UnsupportedVersion(version).into());
} }
let is_signed = first_byte & SIGNATURE_MASK != 0; // Hack in rudimentory support for V5 extrinsics..
let is_signed = first_byte & SIGNATURE_MASK == 0b1000_0000;
let is_general = first_byte & SIGNATURE_MASK == 0b0100_0000;
// Skip over the first byte which denotes the version and signing. // Skip over the first byte which denotes the version and signing.
let cursor = &mut &bytes[1..]; let cursor = &mut &bytes[1..];
@@ -191,25 +194,37 @@ where
let signed_details = is_signed let signed_details = is_signed
.then(|| -> Result<SignedExtrinsicDetails, Error> { .then(|| -> Result<SignedExtrinsicDetails, Error> {
let address_start_idx = bytes.len() - cursor.len(); let address_start_idx = bytes.len() - cursor.len();
// Skip over the address, signature and extra fields. // Skip over the address, signature and extra fields. If V5 general
scale_decode::visitor::decode_with_visitor( // extrinsic then there is no address and signature so skip nothing,
cursor, if !is_general {
ids.address, scale_decode::visitor::decode_with_visitor(
metadata.types(), cursor,
scale_decode::visitor::IgnoreVisitor::new(), ids.address,
) metadata.types(),
.map_err(scale_decode::Error::from)?; scale_decode::visitor::IgnoreVisitor::new(),
)
.map_err(scale_decode::Error::from)?;
}
let address_end_idx = bytes.len() - cursor.len(); let address_end_idx = bytes.len() - cursor.len();
scale_decode::visitor::decode_with_visitor( if !is_general {
cursor, scale_decode::visitor::decode_with_visitor(
ids.signature, cursor,
metadata.types(), ids.signature,
scale_decode::visitor::IgnoreVisitor::new(), metadata.types(),
) scale_decode::visitor::IgnoreVisitor::new(),
.map_err(scale_decode::Error::from)?; )
.map_err(scale_decode::Error::from)?;
}
let signature_end_idx = bytes.len() - cursor.len(); let signature_end_idx = bytes.len() - cursor.len();
if is_general {
// V5 general extrinsics have an extension version byte.
// For now we just ignore it as a hack to decode V5 exts.
let _extension_version = u8::decode(cursor)?;
}
let extra_start_idx = bytes.len() - cursor.len();
scale_decode::visitor::decode_with_visitor( scale_decode::visitor::decode_with_visitor(
cursor, cursor,
ids.extra, ids.extra,
@@ -223,6 +238,7 @@ where
address_start_idx, address_start_idx,
address_end_idx, address_end_idx,
signature_end_idx, signature_end_idx,
extra_start_idx,
extra_end_idx, extra_end_idx,
}) })
}) })
@@ -320,7 +336,7 @@ where
pub fn signed_extensions_bytes(&self) -> Option<&[u8]> { pub fn signed_extensions_bytes(&self) -> Option<&[u8]> {
self.signed_details self.signed_details
.as_ref() .as_ref()
.map(|e| &self.bytes[e.signature_end_idx..e.extra_end_idx]) .map(|e| &self.bytes[e.extra_start_idx..e.extra_end_idx])
} }
/// Returns `None` if the extrinsic is not signed. /// Returns `None` if the extrinsic is not signed.