波卡的交易构建与签名操作指南
交易格式
Address:发送账户的SS58编码地址。 Block Hash:检查点区块的哈希。 Block Number:检查点块的编号。 Genesis Hash:链的创世哈希。 Metadata:提交时Runtime的SCALE编码元数据。 Nonce:本次交易的随机数。 Spec Version:运行时的当前规范版本。 Transaction Version:交易格式的当前版本。 Tip:可选,增加交易优先级的提示。 Era Period:可选,交易有效的检查点之后的区块数。如果为零,则交易是永久的(immortal)。
dest: 目的地地址 #[compact] value:通证数(紧凑编码compact encoding)
1
序列化交易格式
紧随其后的SCALE编码字节的紧凑编码数。 1 位:如果没有签名则为0,如果有则为1。 7 位:外部版本,它等于十进制的4。 4 个字节:Runtime的规范版本。 4 个字节:Runtime的交易版本。 32 字节:链的创世哈希。 32 字节:作为era参考的区块哈希。如果交易是永久的,那么这将是创世哈希。
一个用sp_runtime::MultiAddress::Id指示交易的签名者的编码的SCALE。 一个用sp_runtime::MultiSignature::{SigningScheme}签名(波卡支持sr25519、ed25519和ECDSA作为签名方案)的编码的SCALE。
如果交易是永久的,那么Era就是0。 否则,它将是一个Vec[u64, u64]包括时期和阶段的时期。 用随机数紧凑编码的u32。 用支付给区块生产者的小费(tip)进行紧凑编码的u128。 一个用sp_runtime::traits::SignedExtension>与此交易相关的附加数据和逻辑编码的SCALE 。
1 个字节:交易调用的pallet索引。 1 个字节:交易正在调用的pallet中的函数。 变量:被调用函数所需的SCALE编码参数。
2
总结
构造一个未签名的交易。 创建签名的有效载荷(payload)。 签署有效载荷。 将签名的有效载荷序列化为交易。 提交序列化交易。 Parity提供以下工具来帮助执行这些步骤。
Polkadot-JS Tools
yarn run:signer <submit|sendOffline> --account <from-account-ss58> --ws <endpoint> <module.method> [param1] [...] [paramX]
yarn run:signer sign --account <from-account-ss58> --seed <seed> --type <sr25519|ed25519> <payload>
yarn run:signer sign --account 121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2 --seed "pulp gaze fuel ... mercy inherit equal" --type sr25519 0x040300ff4a83f1...a8239139ff3ff7c3f6
yarn run:signer sign --account 121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2 --seed "pulp gaze fuel ... mercy inherit equal" --type sr25519 0x040300ff4a83f1...a8239139ff3ff7c3f6
Tx Wrappers
1
导入私钥
import { importPrivateKey } from '@substrate/txwrapper-polkadot';
const keypair = importPrivateKey(“pulp gaze fuel ... mercy inherit equal”);
2
从公钥导出地址
import { deriveAddress } from '@substrate/txwrapper-polkadot';
// Public key, can be either hex string, or Uint8Array
const publicKey = “0x2ca17d26ca376087dc30ed52deb74bf0f64aca96fe78b05ec3e720a72adb1235”;
const address = deriveAddress(publicKey);
3
离线构建一笔交易
归档节点不会删减任何区块或状态数据。使用--pruning archive标注。某些类型的节点(如验证者)必须以归档模式运行。
import { methods } from "@substrate/txwrapper-polkadot";
const unsigned = methods.balances.transferKeepAlive(
{
dest: "15vrtLsCQFG3qRYUcaEeeEih4JwepocNJHkpsrqojqnZPc2y",
value: 5000000000,
},
{
address: "121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2",
blockHash: "0x1fc7493f3c1e9ac758a183839906475f8363aafb1b1d3e910fe16fab4ae1b582",
blockNumber: 4302222,
genesisHash: "0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636",
// must import from client RPC call state_getMetadata
nonce: 2,
specVersion: 1019,
tip: 0,
eraPeriod: 64, // number of blocks from checkpoint that transaction is valid
transactionVersion: 1,
},
{
metadataRpc,
// Type registry
}
);
4
构建签名有效载荷
import { methods, createSigningPayload } from '@substrate/txwrapper-polkadot';
// See "Construct a transaction offline" for "{...}"
const unsigned = methods.balances.transferKeepAlive({...}, {...}, {...});
const signingPayload = createSigningPayload(unsigned, { registry });
5
序列化已签名的交易
Parity Polkadot客户端实现了一个Polkadot主机和一个本地Runtime。Runtime必须编译为WebAssembly并存储在链上。如果客户端的Runtime规范与存储在链上的Runtime规范相同,则客户端将使用客户端二进制文件执行区块。
import { createSignedTx } from "@substrate/txwrapper-polkadot";
// Example code, replace `signWithAlice` with actual remote signer.
// An example is given here:
// https://github.com/paritytech/txwrapper-core/blob/b213cabf50f18f0fe710817072a81596e1a53cae/packages/txwrapper-core/src/test-helpers/signWithAlice.ts
const signature = await signWithAlice(signingPayload);
const signedTx = createSignedTx(unsigned, signature, { metadataRpc, registry });
6
解码有效载荷类型
您可能希望在提交之前解码有效载荷(payload)以验证其内容。
import { decode } from "@substrate/txwrapper-polkadot";
// Decode an unsigned tx
const txInfo = decode(unsigned, { metadataRpc, registry });
// Decode a signing payload
const txInfo = decode(signingPayload, { metadataRpc, registry });
// Decode a signed tx
const txInfo = decode(signedTx, { metadataRpc, registry });
7
检查交易的哈希
import { getTxHash } from ‘ /txwrapper-polkadot’;
const txHash = getTxHash(signedTx);
提交已签名的有效荷载
签名者CLI(yarn run:signer submit --tx --ws ) Substrate API Sidecar 带有author_submitExtrinsic或author_submitAndWatchExtrinsic的RPC,后者将使您订阅事件event,以便在交易得到验证并包含在链中时得到通知。
备注
subkey --network polkadot generate
Secret phrase `pulp gaze fuel ... mercy inherit equal` is account:
Secret seed: 0x57450b3e09ba4598 ... ... ... ... ... ... ... .. 219756eeba80bb16
Public key (hex): 0x2ca17d26ca376087dc30ed52deb74bf0f64aca96fe78b05ec3e720a72adb1235
Account ID: 0x2ca17d26ca376087dc30ed52deb74bf0f64aca96fe78b05ec3e720a72adb1235
SS58 Address: 121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2
subkey --network polkadot generate
Secret phrase `exercise auction soft ... obey control easily` is account:
Secret seed: 0x5f4bbb9fbb69261a ... ... ... ... ... ... ... .. 4691ed7d1130fbbd
Public key (hex): 0xda04de6cd781c98acf0693dfb97c11011938ad22fcc476ed0089ac5aec3fe243
Account ID: 0xda04de6cd781c98acf0693dfb97c11011938ad22fcc476ed0089ac5aec3fe243
SS58 Address: 15vrtLsCQFG3qRYUcaEeeEih4JwepocNJHkpsrqojqnZPc2y
如果需要更好的查看代码,请参见原文,相关地址:
https://wiki.polkadot.network/docs/build-transaction-construction#tx-wrapper
波卡网络蓬勃发展,生态项目层出不穷,波卡生态研究院聚焦波卡生态动向,把握当前趋势。回复【日报】,获取波卡生态每日最新消息汇总。
欢迎大家加入我们Polkadot生态研究院的电报:
https://t.me/polkadot_eri
Staking | Gavin Wood | 跨链 | 平行链 | 国库 | Parity
KSM | Web3.0 | Kusama | Grant指南
Statemint | 区块链 | SBP计划 | NFT
XCVM | BEEFY | XCM
Wasm
评论