<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          波卡的交易構(gòu)建與簽名操作指南

          共 7865字,需瀏覽 16分鐘

           ·

          2023-03-04 13:48


          波卡知識(shí)圖譜是我們針對(duì)波卡從零到一的入門級(jí)文章,我們嘗試從波卡最基礎(chǔ)的部分講起,為大家提供全方位了解波卡的內(nèi)容,當(dāng)然這是一項(xiàng)巨大的工程,也充滿了挑戰(zhàn),然而我們希望通過這樣的努力讓大家能夠正確認(rèn)知波卡,也讓不了解波卡的人方便快速掌握波卡相關(guān)知識(shí),今天是該欄目的第84期,波卡的交易架構(gòu)是比較新穎的設(shè)計(jì),開發(fā)者需要細(xì)致地理解波卡的交易是如何構(gòu)建的,以及相關(guān)的簽名是如何操作的。

          本文將討論波卡中的交易格式以及如何創(chuàng)建、簽署和廣播交易。本文演示了一些可用的工具,集成時(shí)請(qǐng)始終參考每個(gè)工具的文檔。



          交易格式


          波卡有一些所有交易通用的基本交易信息。
          • Address:發(fā)送賬戶的SS58編碼地址。
          • Block Hash:檢查點(diǎn)區(qū)塊的哈希。
          • Block Number:檢查點(diǎn)塊的編號(hào)。
          • Genesis Hash:鏈的創(chuàng)世哈希。
          • Metadata:提交時(shí)Runtime的SCALE編碼元數(shù)據(jù)。
          • Nonce:本次交易的隨機(jī)數(shù)。
          • Spec Version:運(yùn)行時(shí)的當(dāng)前規(guī)范版本。
          • Transaction Version:交易格式的當(dāng)前版本。
          • Tip:可選,增加交易優(yōu)先級(jí)的提示。
          • Era Period:可選,交易有效的檢查點(diǎn)之后的區(qū)塊數(shù)。如果為零,則交易是永久的(immortal)。


          警告:使交易變成永久的(immortal)存在一些風(fēng)險(xiǎn)。如果一個(gè)賬戶被收回并且用戶重新為該賬戶注資,那么他們可以重播一個(gè)永久的交易。始終默認(rèn)使用非永久的(mortal)外源。


          從System模塊查詢的隨機(jī)數(shù)(nonce)不考慮待處理的交易(pending transactions)。如果你想同時(shí)提交多個(gè)有效交易,你必須手動(dòng)跟蹤和增加隨機(jī)數(shù)。


          每個(gè)交易都有自己的(或沒有)要添加的參數(shù)。例如,Balances pallet中的transferKeepAlive函數(shù)將采用:
          • dest: 目的地地址
          • #[compact] value:通證數(shù)(緊湊編碼compact encoding)



          1

          序列化交易格式


          使用該--chain 選項(xiàng)選擇鏈。可以是polkadot、kusama、westend、 rococo或自定義鏈規(guī)范。默認(rèn)情況下,客戶端將啟動(dòng)Polkadot。觀看視頻,學(xué)習(xí)單個(gè)代碼庫如何為四個(gè)不同的區(qū)塊鏈提供支持, 以了解有關(guān)鏈的選擇的內(nèi)部工作原理的更多信息。相關(guān)視頻內(nèi)容:


          在提交之前,交易會(huì)被序列化。序列化交易是十六進(jìn)制編碼的SCALE編碼字節(jié)。波卡的Runtime是可升級(jí)的,因此任何接口都可能發(fā)生變化,元數(shù)據(jù)允許開發(fā)人員相應(yīng)地構(gòu)建任何外源(extrinsics)或存儲(chǔ)條目。話雖這么說,序列化格式可以描述如下:
          • 緊隨其后的SCALE編碼字節(jié)的緊湊編碼數(shù)。
          • 1 位:如果沒有簽名則為0,如果有則為1。
          • 7 位:外部版本,它等于十進(jìn)制的4。
          • 4 個(gè)字節(jié):Runtime的規(guī)范版本。
          • 4 個(gè)字節(jié):Runtime的交易版本。
          • 32 字節(jié):鏈的創(chuàng)世哈希。
          • 32 字節(jié):作為era參考的區(qū)塊哈希。如果交易是永久的,那么這將是創(chuàng)世哈希。


          如果有一個(gè)簽名是:
          • 一個(gè)用sp_runtime::MultiAddress::Id指示交易的簽名者的編碼的SCALE。
          • 一個(gè)用sp_runtime::MultiSignature::{SigningScheme}簽名(波卡支持sr25519、ed25519和ECDSA作為簽名方案)的編碼的SCALE。


          一個(gè)用sp_runtime::generic::Era指示該交易的有效期的編碼的SCALE:
          • 如果交易是永久的,那么Era就是0。
          • 否則,它將是一個(gè)Vec[u64, u64]包括時(shí)期和階段的時(shí)期。
          • 用隨機(jī)數(shù)緊湊編碼的u32。
          • 用支付給區(qū)塊生產(chǎn)者的小費(fèi)(tip)進(jìn)行緊湊編碼的u128。
          • 一個(gè)用sp_runtime::traits::SignedExtension>與此交易相關(guān)的附加數(shù)據(jù)和邏輯編碼的SCALE 。


          具體交易參數(shù)或調(diào)用數(shù)據(jù),包括:
          • 1 個(gè)字節(jié):交易調(diào)用的pallet索引。
          • 1 個(gè)字節(jié):交易正在調(diào)用的pallet中的函數(shù)。
          • 變量:被調(diào)用函數(shù)所需的SCALE編碼參數(shù)。


          元數(shù)據(jù)為您提供了解如何構(gòu)建特定于您的交易的序列化調(diào)用數(shù)據(jù)所需的所有信息。您可以在Substrate文檔中閱讀有關(guān)元數(shù)據(jù)、其格式以及如何獲取它的更多信息 。相關(guān)內(nèi)容:
          https://docs.substrate.io/reference/command-line-tools/subxt/#metadata


          2

          總結(jié)


          獲得所有必要信息后,您將需要:
          • 構(gòu)造一個(gè)未簽名的交易。
          • 創(chuàng)建簽名的有效載荷(payload)。
          • 簽署有效載荷。
          • 將簽名的有效載荷序列化為交易。
          • 提交序列化交易。
          • Parity提供以下工具來幫助執(zhí)行這些步驟。




          Polkadot-JS Tools



          Polkadot-JS Tools包含一組用于與Substrate客戶端交互的命令行工具,包括一個(gè)名為“Signer CLI”的工具,用于創(chuàng)建、簽名和廣播交易。


          此示例將使用signer submit命令,該命令將創(chuàng)建并提交交易。signer sendOffline命令具有完全相同的API,但不會(huì)廣播交易。submit并且sendOffline必須連接到節(jié)點(diǎn)以獲取當(dāng)前元數(shù)據(jù)并構(gòu)建有效交易。他們的API具有以下格式:
          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>


          從121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2發(fā)送0.5T到15vrtLsCQFG3qRYUcaEeeEih4JwepocNJHkpsrqojqnZPc2y:
          yarn run:signer sign --account 121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2 --seed "pulp gaze fuel ... mercy inherit equal" --type sr25519 0x040300ff4a83f1...a8239139ff3ff7c3f6


          這將返回要簽名的有效載荷和等待簽名的輸入。獲取此有效載荷并使用您的正常簽名環(huán)境(例如air gapped機(jī)器、VM等)。簽署有效載荷:
          yarn run:signer sign --account 121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2 --seed "pulp gaze fuel ... mercy inherit equal" --type sr25519 0x040300ff4a83f1...a8239139ff3ff7c3f6


          保存輸出并將其帶到您將廣播的機(jī)器上,將其輸入到submit的簽名字段中,然后發(fā)送交易(或者如果使用sendOffline則返回序列化交易)。




          Tx Wrappers



          如果您不想使用CLI進(jìn)行簽名操作,Parity提供了一個(gè)名為TxWrapper Core的SDK來離線生成和簽署交易。對(duì)于波卡、Kusama和選擇平行鏈,請(qǐng)使用該txwrapper-polkadot包。其他基于Substrate的鏈將有自己的txwrapper-{chain}實(shí)現(xiàn),請(qǐng)參閱示例以獲取指南。TxWrapperCore相關(guān)內(nèi)容:
          https://github.com/paritytech/txwrapper-core
          其余txwrapper-{chain}實(shí)例相關(guān)內(nèi)容:
          https://github.com/paritytech/txwrapper-core/blob/main/packages/txwrapper-examples/README.md



          1

          導(dǎo)入私鑰


          import { importPrivateKey } from '@substrate/txwrapper-polkadot';
          const keypair = importPrivateKey(“pulp gaze fuel ... mercy inherit equal”);

          客戶端將啟動(dòng)Polkadot。觀看視頻,學(xué)習(xí)單個(gè)代碼庫如何為四個(gè)不同的區(qū)塊鏈提供支持, 以了解有關(guān)鏈的選擇的內(nèi)部工作原理的更多信息。相關(guān)視頻內(nèi)容:



          2

          從公鑰導(dǎo)出地址


          import { deriveAddress } from '@substrate/txwrapper-polkadot';

          // Public key, can be either hex string, or Uint8Arrayconst publicKey = “0x2ca17d26ca376087dc30ed52deb74bf0f64aca96fe78b05ec3e720a72adb1235”;const address = deriveAddress(publicKey);



          3

          離線構(gòu)建一筆交易

          歸檔節(jié)點(diǎn)不會(huì)刪減任何區(qū)塊或狀態(tài)數(shù)據(jù)。使用--pruning archive標(biāo)注。某些類型的節(jié)點(diǎn)(如驗(yàn)證者)必須以歸檔模式運(yùn)行。

          import { methods } from "@substrate/txwrapper-polkadot";

          const unsigned = methods.balances.transferKeepAlive( { dest: "15vrtLsCQFG3qRYUcaEeeEih4JwepocNJHkpsrqojqnZPc2y", value: 5000000000, }, { address: "121X5bEgTZcGQx5NZjwuTjqqKoiG8B2wEAvrUFjuw24ZGZf2", blockHash: "0x1fc7493f3c1e9ac758a183839906475f8363aafb1b1d3e910fe16fab4ae1b582", blockNumber: 4302222, genesisHash: "0xe3777fa922cafbff200cadeaea1a76bd7898ad5b89f7848999058b50e715f636", metadataRpc, // 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, registry, // Type registry });


          4

          構(gòu)建簽名有效載荷


          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客戶端實(shí)現(xiàn)了一個(gè)Polkadot主機(jī)和一個(gè)本地Runtime。Runtime必須編譯為WebAssembly并存儲(chǔ)在鏈上。如果客戶端的Runtime規(guī)范與存儲(chǔ)在鏈上的Runtime規(guī)范相同,則客戶端將使用客戶端二進(jìn)制文件執(zhí)行區(qū)塊。

          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.tsconst signature = await signWithAlice(signingPayload);const signedTx = createSignedTx(unsigned, signature, { metadataRpc, registry });



          6

          解碼有效載荷類型


          您可能希望在提交之前解碼有效載荷(payload)以驗(yàn)證其內(nèi)容。

          import { decode } from "@substrate/txwrapper-polkadot";

          // Decode an unsigned txconst txInfo = decode(unsigned, { metadataRpc, registry });

          // Decode a signing payloadconst txInfo = decode(signingPayload, { metadataRpc, registry });

          // Decode a signed txconst txInfo = decode(signedTx, { metadataRpc, registry });



          7

          檢查交易的哈希


          import { getTxHash } from@substrate/txwrapper-polkadot’;const txHash = getTxHash(signedTx);


          否則,客戶端將從鏈上執(zhí)行Wasm Runtime。因此,在同步鏈時(shí),客戶端將使用其關(guān)聯(lián)的Wasm二進(jìn)制文件執(zhí)行過去運(yùn)行時(shí)的區(qū)塊。此功能還允許無硬分叉升級(jí):客戶端可以在不更新客戶端的情況下執(zhí)行新的Runtime。




          提交已簽名的有效荷載



          有幾種方法可以提交簽名的有效載荷:
          • 簽名者CLI(yarn run:signer submit --tx  --ws )
          • Substrate API Sidecar
          • 帶有author_submitExtrinsic或author_submitAndWatchExtrinsic的RPC,后者將使您訂閱事件event,以便在交易得到驗(yàn)證并包含在鏈中時(shí)得到通知。




          備注



          示例中使用的一些地址。請(qǐng)參閱子項(xiàng)文檔:
          https://docs.substrate.io/reference/command-line-tools/subkey/
          $ subkey --network polkadot generateSecret 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 generateSecret phrase `exercise auction soft ... obey control easily` is account: Secret seed: 0x5f4bbb9fbb69261a ... ... ... ... ... ... ... .. 4691ed7d1130fbbd Public key (hex): 0xda04de6cd781c98acf0693dfb97c11011938ad22fcc476ed0089ac5aec3fe243 Account ID: 0xda04de6cd781c98acf0693dfb97c11011938ad22fcc476ed0089ac5aec3fe243 SS58 Address: 15vrtLsCQFG3qRYUcaEeeEih4JwepocNJHkpsrqojqnZPc2y


          如果需要更好的查看代碼,請(qǐng)參見原文,相關(guān)地址:

          https://wiki.polkadot.network/docs/build-transaction-construction#tx-wrapper





          波卡網(wǎng)絡(luò)蓬勃發(fā)展,生態(tài)項(xiàng)目層出不窮,波卡生態(tài)研究院聚焦波卡生態(tài)動(dòng)向,把握當(dāng)前趨勢(shì)?;貜?fù)【日?qǐng)?bào)】,獲取波卡生態(tài)每日最新消息匯總







          歡迎大家加入我們Polkadot生態(tài)研究院的電報(bào):

          https://t.me/polkadot_eri

          歡迎大家訪問波卡生態(tài)研究院的Mirror地址:
          https://mirror.xyz/0x9A259b3a2316281Cc948cE2Cf1Ac610a79844f05




          精選文章



          智能合約 | 經(jīng)濟(jì)模型 | Slash | 通貨膨脹 | NPoS | Web3基金
          Staking
           | Gavin Wood | 跨鏈 | 平行鏈 | 國庫 Parity
          KSM | Web3.0 | Kusama | Grant指南
          Statemint | 區(qū)塊鏈 SBP計(jì)劃 | NFT
          XCVM | BEEFY | XCM
          Wasm



           

          瀏覽 54
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天操人人射 | 99九九99九九九99九他书对 | 日本中文字幕不卡 | 菠萝蜜二区三区免费视频免费 | 欧美日韩a级大全免费高清在线播放 |