Cleanup extrinsic encoding (#150)

* Cleanup extrinsic encoding

* Removed now-defunct type

* Add uncheckedLength encoding
This commit is contained in:
Jaco Greeff
2018-09-12 12:14:50 +02:00
committed by GitHub
parent 18b02e91d8
commit eb0356b6eb
10 changed files with 73 additions and 42 deletions
@@ -13,7 +13,8 @@ const keyring = testingPairs();
describe('encode', () => { describe('encode', () => {
it('encodes extrinsic correctly', () => { it('encodes extrinsic correctly', () => {
expect( expect(
encode(keyring.nobody.publicKey(), 1234)( encode(
keyring.nobody.publicKey(), 1234,
extrinsics.timestamp.public.set, extrinsics.timestamp.public.set,
[10101], [10101],
'latest' 'latest'
@@ -10,14 +10,11 @@ import { ExtrinsicWithAccount } from '../types';
import encodeCall from './call'; import encodeCall from './call';
import encodeExtrinsic from './extrinsic'; import encodeExtrinsic from './extrinsic';
type Encoder = (extrinsic: SectionItem<Extrinsics>, values: Array<any>, version: EncodingVersions) => ExtrinsicWithAccount; export default function encode (publicKey: Uint8Array, index: number | BN, extrinsic: SectionItem<Extrinsics>, values: Array<any>, version: EncodingVersions): ExtrinsicWithAccount {
return encodeCall(
export default function encode (publicKey: Uint8Array, index: number | BN): Encoder { publicKey,
return (extrinsic: SectionItem<Extrinsics>, values: Array<any>, version: EncodingVersions): ExtrinsicWithAccount => index,
encodeCall( encodeExtrinsic(extrinsic, values, version),
publicKey, version
index, );
encodeExtrinsic(extrinsic, values, version),
version
);
} }
@@ -14,7 +14,8 @@ const keyring = testingPairs();
describe('unchecked', () => { describe('unchecked', () => {
it('encodes extrinsic correctly (nobody)', () => { it('encodes extrinsic correctly (nobody)', () => {
expect( expect(
encode(keyring.nobody, 1234)( encode(
keyring.nobody, 1234,
extrinsics.timestamp.public.set, extrinsics.timestamp.public.set,
[10101] [10101]
) )
@@ -37,9 +38,11 @@ describe('unchecked', () => {
it('encodes extrinsic correctly (one)', () => { it('encodes extrinsic correctly (one)', () => {
expect( expect(
encode(keyring.one, 258, 'poc-1')( encode(
keyring.one, 258,
extrinsics.staking.public.transfer, extrinsics.staking.public.transfer,
[keyring.two.publicKey(), 69] [keyring.two.publicKey(), 69],
'poc-1'
) )
).toEqual( ).toEqual(
new Uint8Array([ new Uint8Array([
@@ -62,7 +65,8 @@ describe('unchecked', () => {
it('encodes extrinsic correctly (one + latest)', () => { it('encodes extrinsic correctly (one + latest)', () => {
expect( expect(
encode(keyring.one, 258)( encode(
keyring.one, 258,
extrinsics.staking.public.transfer, extrinsics.staking.public.transfer,
[keyring.two.publicKey(), 69] [keyring.two.publicKey(), 69]
) )
@@ -89,7 +93,8 @@ describe('unchecked', () => {
it('encodes timetamp.set extrinsic correctly (actual values)', () => { it('encodes timetamp.set extrinsic correctly (actual values)', () => {
expect( expect(
encode(keyring.nobody, 0)( encode(
keyring.nobody, 0,
extrinsics.timestamp.public.set, extrinsics.timestamp.public.set,
[0x5b13c37b] [0x5b13c37b]
) )
@@ -102,7 +107,8 @@ describe('unchecked', () => {
it('encoded parachains.setHeads correctly (actual values)', () => { it('encoded parachains.setHeads correctly (actual values)', () => {
expect( expect(
encode(keyring.nobody, 0)( encode(
keyring.nobody, 0,
extrinsics.parachains.public.setHeads, extrinsics.parachains.public.setHeads,
[[]] [[]]
) )
@@ -13,21 +13,15 @@ import u8aConcat from '@polkadot/util/u8a/concat';
import encode from './index'; import encode from './index';
import prefixes from './prefixes'; import prefixes from './prefixes';
type Encoder = (extrinsic: SectionItem<Extrinsics>, values: Array<any>) => UncheckedRaw; export default function unchecked (pair: KeyringPair, index: number | BN, extrinsic: SectionItem<Extrinsics>, values: Array<any>, version: EncodingVersions = 'latest'): UncheckedRaw {
const message = encode(pair.publicKey(), index, extrinsic, values, version);
const signature = pair.sign(message);
export default function unchecked (pair: KeyringPair, index: number | BN, version: EncodingVersions = 'latest'): Encoder { return u8aConcat(
const encoder = encode(pair.publicKey(), index); version === 'poc-1'
? prefixes.none
return (extrinsic: SectionItem<Extrinsics>, values: Array<any>): UncheckedRaw => { : prefixes.publicKey,
const message = encoder(extrinsic, values, version); message,
const signature = pair.sign(message); signature
);
return u8aConcat(
version === 'poc-1'
? prefixes.none
: prefixes.publicKey,
message,
signature
);
};
} }
@@ -0,0 +1,24 @@
// Copyright 2017-2018 @polkadot/extrinsics authors & contributors
// This software may be modified and distributed under the terms
// of the ISC license. See the LICENSE file for details.
import BN from 'bn.js';
import { EncodingVersions, SectionItem } from '@polkadot/params/types';
import { UncheckedRaw } from '@polkadot/primitives/extrinsic';
import { KeyringPair } from '@polkadot/util-keyring/types';
import { Extrinsics } from '../../types';
import encodeUnchecked from './unchecked';
import encodeLength from './length';
export default function uncheckedLength (pair: KeyringPair, index: number | BN, extrinsic: SectionItem<Extrinsics>, values: Array<any>, version: EncodingVersions = 'latest'): UncheckedRaw {
return encodeLength(
encodeUnchecked(
pair,
index,
extrinsic,
values,
version
)
);
}
@@ -44,7 +44,8 @@ describe('decodeRaw', () => {
) )
).toMatchObject({ ).toMatchObject({
extrinsics: [ extrinsics: [
encodeUnchecked(keyring.nobody, 0)( encodeUnchecked(
keyring.nobody, 0,
extrinsics.timestamp.public.set, extrinsics.timestamp.public.set,
[10101] [10101]
) )
@@ -23,11 +23,13 @@ describe('encodeBlock', () => {
stateRoot: hexToU8a('0xf707774183723f201b875024069f30e7089b7f83c3c3cdc534b10d15fca91262') stateRoot: hexToU8a('0xf707774183723f201b875024069f30e7089b7f83c3c3cdc534b10d15fca91262')
}, },
extrinsics: [ extrinsics: [
encodeUnchecked(keyring.nobody, 0)( encodeUnchecked
(keyring.nobody, 0,
extrinsics.timestamp.public.set, extrinsics.timestamp.public.set,
[0x5b13c3a4] [0x5b13c3a4]
), ),
encodeUnchecked(keyring.nobody, 0)( encodeUnchecked(
keyring.nobody, 0,
extrinsics.parachains.public.setHeads, extrinsics.parachains.public.setHeads,
[[]] [[]]
) )
@@ -34,11 +34,13 @@ describe('block', () => {
it('creates a valid block, with defaults submitted', () => { it('creates a valid block, with defaults submitted', () => {
const transactions = [ const transactions = [
encodeUnchecked(keyring.nobody, 0)( encodeUnchecked(
keyring.nobody, 0,
extrinsics.timestamp.public.set, extrinsics.timestamp.public.set,
[0x5b13c3a4] [0x5b13c3a4]
), ),
encodeUnchecked(keyring.nobody, 0)( encodeUnchecked(
keyring.nobody, 0,
extrinsics.parachains.public.setHeads, extrinsics.parachains.public.setHeads,
[[]] [[]]
) )
@@ -25,11 +25,13 @@ describe('root', () => {
it('calculates the root correctly (actual)', () => { it('calculates the root correctly (actual)', () => {
expect( expect(
root([ root([
encodeUnchecked(keyring.nobody, 0)( encodeUnchecked(
keyring.nobody, 0,
extrinsics.timestamp.public.set, extrinsics.timestamp.public.set,
[0x5b13c3a4] [0x5b13c3a4]
), ),
encodeUnchecked(keyring.nobody, 0)( encodeUnchecked(
keyring.nobody, 0,
extrinsics.parachains.public.setHeads, extrinsics.parachains.public.setHeads,
[[]] [[]]
) )
@@ -22,11 +22,13 @@ describe('header', () => {
it('applies the all transactions (extrinsicsRoot)', () => { it('applies the all transactions (extrinsicsRoot)', () => {
const transactions = [ const transactions = [
encodeUnchecked(keyring.nobody, 0)( encodeUnchecked(
keyring.nobody, 0,
extrinsics.timestamp.public.set, extrinsics.timestamp.public.set,
[54321] [54321]
), ),
encodeUnchecked(keyring.one, 0)( encodeUnchecked(
keyring.one, 0,
extrinsics.timestamp.public.set, extrinsics.timestamp.public.set,
[12345] [12345]
) )