地址格式
基於Substrate的鏈使用的地址格式是SS58。SS58是對比特幣中的Base-58-check的修改,並做了一些小改動。值得注意的是,該格式包含一個地址類型前綴,用於標識屬於特定網絡的地址。
例如:
- 波卡地址始終以數字1开頭。
- Kusama地址始終以大寫字母开頭,如C、D、F、G、H、J。
- 通用的Substrate地址始終以數字5开頭。
這些前綴以及地址驗證方法,都嵌入在Substrate SS58格式中。永遠不要使用正則表達式進行地址驗證。
關鍵要理解,不同網絡的格式只是由地址生成工具生成的私鑰-公鑰對中的同一公鑰的其他表示形式。因此,只要格式是正確轉換的,那么基於Substrate的鏈上的地址是兼容的。
在Runtime28中,默認的地址格式(詳情請參見:
https://wiki.polkadot.network/docs/learn-accounts##address-format)爲【MultiAddress】類型。
這個【enum】是鏈上账戶的多格式地址包裝器,用於描述波卡的默認地址格式,以表示許多不同的地址類型。其中包括20字節、32字節和任意原始字節變體。它還增強了原始【indices】(詳情請參見:
https://wiki.polkadot.network/docs/learn-accounts#indices)查找功能。
注:
許多錢包允許你在不同格式之間進行轉換。也有獨立的工具;你可以在地址轉換工具(詳情請參見:
https://wiki.polkadot.network/docs/learn-account-advanced#address-conversion-tools)部分找到它們。
派生路徑
如果你想在網絡上使用同一種子創建和管理多個账戶,你可以使用派生路徑。我們可以將派生账戶視爲使用原始助記詞種子創建的根账戶的子账戶。許多波卡密鑰生成工具支持硬派生和軟派生。例如,如果你打算創建一個要在波卡鏈上使用的账戶,可以在助記詞後面加上//來派生一個硬派生的子账戶。
或者在助記詞後面加上/,來派生一個軟派生的子账戶
如果你想使用同一種子在波卡鏈上創建另一個账戶,可以更改上述字符串末尾的數字。例如,【/1】、【/2】和【/3】將會創建不同的派生账戶。
你可以在派生路徑中使用任意字母或數字,只要你認爲有意義即可;它們不必遵循任何特定的模式。你還可以在路徑中組合多個派生。例如,【//bill//account//1】和【//john/polkadot/initial】都是有效的。
要重新創建一個派生账戶,你必須知道種子和派生路徑,因此你應該使用一個明確定義的順序(例如//0、//1、//2...)或確保寫下使用的每個派生路徑。
注:
只有知道派生路徑,才能生成派生账戶。
還有一種派生類型叫做密碼派生。在波卡上,你可以在助記詞後使用///來派生密碼密鑰账戶
在這種類型的派生中,如果助記詞泄漏,沒有初始密碼就無法派生账戶。實際上,對於軟派生和硬派生的账戶,如果有人知道助記詞和派生路徑,他們就能夠訪問你的账戶。對於密碼派生的账戶,密碼應用於派生路徑。你可以知道助記詞和派生路徑,但如果沒有密碼,則無法訪問該账戶。
用數學術語來說,如果我們有一個書面派生路徑【written derivation path】和密碼【password】,就可以計算出真實的派生路徑【real derivation path】,即f(書面派生路徑,密碼【written derivation path,password】),其中f是一個函數。
然後,我們可以使用f(種子,真實派生路徑【seed,real derivation path】)來計算账戶密鑰對【account key pair】。與可以混合使用的硬派生和軟派生不同,每次派生只應指定一個密碼。
注:
密碼派生账戶的安全性取決於所選的密碼的安全性。
軟派生vs硬派生
軟派生允許某人在知道派生账戶私鑰的情況下, "逆向"找出初始账戶的私鑰。此外,還可以確定由同一種子生成的不同账戶與該種子相關聯。硬派生路徑則不允許這兩項操作——即使你知道派生私鑰,也無法計算出根地址的私鑰,也無法證明第一個账戶與第二個账戶相關聯。鑑於所有派生账戶的私鑰都是完全安全的,因此這些派生方法都有其用武之地。除非你有軟派生的特定需要,否則建議使用硬派生路徑生成账戶。
有關派生路徑格式的詳細信息和示例,請參閱Subkey文檔(詳情請參見:https://docs.substrate.io/reference/command-line-tools/subkey/)。Polkadot-JS應用程序和插件以及Parity籤名器(Parity Signer)支持使用與Subkey相同的語法進行自定義派生路徑。
有些錢包會在生成的助記詞末尾自動添加派生路徑。這將爲不同的路徑生成單獨的種子,允許使用相同的助記詞進行不同路徑的籤名,例如【//polkadot】和【//kusama】。盡管你可能正確保存了助記詞,但只有當兩個錢包使用相同的派生路徑時,在另一個錢包中使用助記詞才會生成相同的地址。
Polkadot和Kusama都在BIP44registry(詳情請參見:
https://github.com/satoshilabs/slips/blob/master/slip-0044.md)登記了路徑。
注意:
要獲得某個地址的密鑰,你必須知道其父節點私鑰和派生路徑。只有當你熟悉了這一主題的知識後,才能使用自定義派生路徑。
有人好奇:前綴是如何工作的?
SS58registry(詳情請參見:
https://github.com/paritytech/ss58-registry/blob/main/ss58-registry.json)指出:
- 波卡具有地址類型【00000000b】(十進制爲【0】)。
- Kusama(波卡金絲雀網絡)具有地址類型【00000010b】(十進制爲【2】)。
- 通用Substrate的地址類型是【00101010b】(十進制爲【42】)。
由於【Base58-check】字母表中沒有數字0,因此最小值確實是1。因此,【00000000b】在Base58-check中是1。如果我們嘗試解碼類似【1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg】的波卡地址,則結果爲
【000aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b29d7】。第一個字節爲【00】,二進制爲【00000000】,十進制爲【0】,因此符合波卡的地址類型。
讓我們來看一下Substrate地址。如果我們解碼【5CK8D1sKNwF473wbuBP6NuhQfPaWUetNsWUNAAzVwTfxqjfr】,我們會得到
【2a0aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b77e5】。第一個字節爲【2a】,從十六進制轉換成十進制(詳情請參見:
https://www.rapidtables.com/convert/number/hex-to-decimal.html)後爲【42】。42在二進制中是【00101010】,正如SS58文件中所述。
最後,讓我們看看Kusama地址。解碼【CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp】會得到【020aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b0985】,並且第一個字節爲【02】,就像指定的一樣。
如果我們嘗試以完全不同的字母开頭的Kusama地址,(例如【J4iggBtsWsb61RemU2TDWDXTNHqHNfBSAkGvVZBtn1AJV1a】),我們仍然會得到【02】作爲第一個字節:
【02f2d606a67f58fa0b3ad2b556195a0ef905676efd4e3ec62f8fa1b8461355f1142509】。有些地址始終具有相同的前綴,而像Kusama這樣的地址則可能變化很大,但這只是Base58-check編碼的一個怪現象。
系統账戶
顧名思義,系統账戶由系統使用。例如,它們用於國庫、衆貸和提名池。從Runtime的角度來看,這些账戶與鏈上的任何其他账戶一樣。這些特殊的系統账戶只是公鑰,私鑰是未知的(也無法獲取)。因此,只有該模塊(pallet)本身才能與此账戶進行交互。這些账戶永遠不會發出已籤名的外源extrinsics(詳情請參見:
https://wiki.polkadot.network/docs/learn-extrinsics),因爲它們沒有私鑰。
注:
你可以在Subscan(詳情請參見:
https://polkadot.subscan.io/account_list?role=module)上查看系統账戶。
讓我們來看看系統账戶是如何在幕後生成的。例如,要生成國庫账戶,將字符串“modl”和“py/trsry”的原始字節組合起來創建账戶ID(AccountID)。有關更多信息,請查看Substrate StackExchange上有關國庫账戶(詳情請參見:
https://substrate.stackexchange.com/questions/536/how-do-treasury-accounts-compare-to-end-user-accounts-in-frame)的文章。
同樣,在生成衆貸账戶時,將字符串“modl”和“py/cfund”的原始字節以及基金指數組合起來創建账戶ID(AccountID)。類似的邏輯也適用於提名池和平行鏈账戶。
可移植性
上述信息爲我們帶來可移植性:在多個錢包使用助記詞或種子短語的能力。可移植性取決於幾個因素:
- 派生路徑
- 助記詞格式
- 種子派生
- 籤名方案
要在多個錢包中使用完全相同的助記符,請確保它們採用兼容的方法生成密鑰和籤署信息。如果你仍在尋找易理解的文檔,請聯系項目維護者。
Ed25519密鑰與BIP39的兼容性有限,詳情請參見:
https://github.com/paritytech/substrate-bip39
BIP44Registry,詳情請參見:
https://github.com/satoshilabs/slips/blob/master/slip-0044.md
基於Khovratovich的Ed25519和BIP32,詳情請參見:
https://github.com/LedgerHQ/orakolo/blob/master/papers/Ed25519_BIP Final.pdf
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。