跳至主要內容
本頁面使用機器翻譯自英語,可能包含錯誤或不清楚的語言。如需最準確的信息,請參閱英文原文。由於更新頻繁,部分內容可能與英文原文有出入。請加入我們在 Crowdin 上的努力,幫助我們改進本頁面的翻譯。 (Crowdin translation page, Contributing guide)

賬戶

凱亞賬戶​

賬戶、州和地址概覽​

Kaia 中的賬戶是一種數據結構,包含個人餘額或智能合約的相關信息。 Kaia 的狀態是其所有賬戶狀態的集合,即存儲在 Kaia 賬戶中的所有數據的過去和當前狀態。在 Kaia 節點上執行事務時,Kaia 的狀態會隨之在所有節點上發生變化。如果 Kaia 網絡中的所有節點都以相同的順序處理了相同的區塊,那麼它們的狀態應該是相同的。每個賬戶的狀態信息都與一個 20 字節的地址相關聯,該地址用於識別每個賬戶。

解耦密鑰對與地址​

在典型的區塊鏈平臺中,一個賬戶與一個經過加密處理的地址相關聯,該地址具有一定長度,通常看起來像這樣:"0x0fe2e20716753082222b52e753854f40afddffd2". 該地址與一對密鑰緊密相連。如果選擇了一對密鑰,地址就會從公開密鑰中導出。這在用戶體驗方面有很多弊端。其中包括

  • 用戶不可能擁有自己想要的地址。
  • 用戶不可能使用多個配對密鑰來提高賬戶的安全性。
  • 當私鑰意外暴露或用戶希望定期更新私鑰以提高賬戶安全性時,用戶不可能更改賬戶的配對密鑰。

這些都是很大的障礙,用戶無法將地址視為區塊鏈平臺中的標識符。為了消除這一障礙,Kaia 提供了一項功能,用戶可以選擇自己的地址和密鑰對。有了這項功能,用戶可以選擇自己想要的地址,還可以使用多個密鑰對來提高安全性。密鑰對的數量可以是一個或多個,密鑰對也可以有不同的作用。有關多密鑰對或基於角色的密鑰的詳細信息,請參閱 多密鑰對和基於角色的密鑰。

值得注意的是,Kaia 還支持密鑰對和地址強耦合的舊方案。

多密鑰對和基於角色的密鑰​

如前所述,當私人密鑰被盜、暴露或以某種方式洩露時,無法恢復賬戶的安全性:最好的辦法是生成另一個密鑰對,創建一個新賬戶,並將餘額從原來洩露的賬戶轉移到新賬戶。缺乏對多重簽名或特定用途密鑰等高級密鑰方案的支持,也是造成嚴重不便的另一個原因。為了更有效地解決這些問題,Kaia 賬戶提供了以下功能:

  • Kaia 賬戶允許更改與賬戶相關的配對密鑰。
  • Kaia 賬戶支持多個密鑰對,並能為每個密鑰分配不同的用途。
  • Kaia 賬戶與擁有與地址緊密相連的單一密鑰的賬戶保持兼容。

通過利用 Kaia 帳戶基於角色的多密鑰支持,終端用戶可以更好地處理現實生活中的安全風險情況,如私鑰管理不善。例如,當用戶意識到自己的私人密鑰被洩露時,只需從自己的賬戶中刪除被洩露的密鑰對,並創建一個新的密鑰對來替換它們,就可以替換被洩露的私人密鑰。要做到這一點,可以使用一個用於更新賬戶信息的專用密鑰,該密鑰是事先創建的,與洩露的私人密鑰分開存儲。

Kaia 錢包鑰匙格式​

Kaia 錢包密鑰格式可輕鬆處理私鑰和相應地址。它使用戶更容易通過地址來維護自己的私人密鑰。格式為 0x{private key}0x{type}0x{address in hex}(十六進制),其中 {type}必須為 "00"。其他值為保留值。示例如下:


0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d80x000xa94f5374fce5edbc8e2a8697c15331677e6ebf0b

Kaia 賬戶類型​

Kaia 有兩種賬戶:外部擁有賬戶(EOAs)和智能合約賬戶(SCA)。

外部擁有賬戶(EOAs)​

外部擁有的賬戶有 nonce 和餘額等信息。這類賬戶沒有代碼或存儲空間。 EOA 由私人密鑰控制,沒有與之相關的代碼。可使用成對密鑰創建 EOA,然後由擁有成對密鑰的任何人進行控制。賬戶密鑰在 賬戶密鑰 一節中有說明。

屬性

屬性類型說明
類型uint8 (Go)外部擁有賬戶的類型。 EOA 必須為 0x1。
nonceuint64 (Go)用於確定交易順序的序列號。下一個要處理的事務具有與此值相同的 nonce。
balance*big.Int (Go)賬戶中 KAIA 的金額。
humanReadablebool (Go)布爾值,表示賬戶與人類可讀地址相關聯。由於目前還不支持 HRA(人類可讀地址),因此該值對所有賬戶都是假的。
keyAccountKey與該賬戶相關的密鑰。該字段可以是 AccountKeyLegacy、AccountKeyPublic、AccountKeyFail、AccountKeyWeightedMultisig、AccountKeyRoleBased 中的任意一個。交易中的簽名就是用這個密鑰驗證的。

智能合約賬戶(SCAs)​

與 EOA 不同,SCA 有與之相關的代碼,並受其代碼控制。 SCA 由智能合約部署交易創建;一旦部署完成,SCA 自身無法啟動新的交易,必須由 EOA 或其他 SCA 觸發另一個賬戶。

屬性

屬性類型說明
類型uint8 (Go)智能合約賬戶類型。 SCA 必須為 0x2。
nonceuint64 (Go)用於確定交易順序的序列號。下一個要處理的事務的 nonce 與此值相同。
balance*big.Int (Go)賬戶中 KAIA 的金額。
humanReadablebool (Go)布爾值,表示賬戶與人類可讀地址相關聯。由於目前還不支持 HRA(人類可讀地址),因此該值對所有賬戶都是假的。
keyAccountKey與該賬戶相關的密鑰。該字段可以是 AccountKeyLegacy、AccountKeyPublic、AccountKeyFail、AccountKeyWeightedMultisig、AccountKeyRoleBased 中的任意一個。交易中的簽名就是用這個密鑰驗證的。
codeHash[]byte (Go)賬戶智能合約代碼的哈希值。這個值是不可變的,這意味著它只有在智能合約創建時才會被設置。
storageRoot[32]byte (Go)包含賬戶中所有存儲變量值的 Merkle Patricia Trie 根的 256 位散列。
codeFormatuint8 (Go)支持解釋器版本。最多可設置 16 個。目前,它只支持 EVM(0x00) 。
vmVersionuint8 (Go)合約部署時的協議升級(硬分叉)信息(例如 0x0(康斯坦丁堡)、0x1(伊斯坦布爾、倫敦......))。最多可使用 16 個。它與合同一起自動創建。
備註

注意:從 kaia v1.7.0 開始,智能合約賬戶將添加 vmVersion 屬性。

Kaia 帳戶類型 ID​

以下是分配給每個賬戶類型的賬戶類型 ID。

賬戶類型賬戶類型 ID
外部擁有賬戶(EOA)0x1
智能合約賬戶(SCA)0x2

賬戶密鑰​

賬戶密鑰表示與賬戶相關的密鑰結構。

AccountKeyNil ​

AccountKeyNil 表示空鍵。如果賬戶試圖擁有一個 AccountKeyNil 對象,交易將失敗。 AccountKeyNil 僅用於具有基於角色密鑰的 TxTypeAccountUpdate 交易。例如,如果一個賬戶只嘗試更新 RoleAccountUpdate 密鑰,那麼 TxTypeAccountUpdate 事務的密鑰字段將是

[AccountKeyNil, NewKey, AccountKeyNil]

然後,只更新 RoleAccountUpdate 密鑰。其他角色不會更新。詳情請參考 基於帳戶密鑰的角色。

屬性​

沒有 AccountKeyNil 的屬性。

RLP 編碼​

0x80

AccountKeyLegacy ​

AccountKeyLegacy 用於地址來源於相應密鑰對的賬戶。如果賬戶擁有 AccountKeyLegacy,則交易驗證過程如下(典型的區塊鏈平臺都是這樣做的):

  • 從 ecrecover(txhash, txsig) 獲取公鑰。
  • 獲取公鑰地址。
  • 地址是發件人。

屬性​

屬性類型說明
類型uint8 (Go)AccountKeyLegacy 的類型。必須是 0x01。

RLP 編碼​

0x01c0

AccountKeyPublic ​

AccountKeyPublic 用於有一個公鑰的賬戶。
如果賬戶有一個 AccountKeyPublic 對象,交易驗證過程如下:

  • 從 ecrecover(txhash, txsig) 獲取公鑰。

  • 檢查派生公鑰是否與相應的

    account's public key.

屬性​

屬性類型說明
類型uint8 (Go)AccountKeyPublic 的類型。必須是 0x02。
Key[33]byte (Go)密鑰應是 S256 曲線上的壓縮公鑰。

RLP 編碼​

0x02 + encode(CompressedPubKey)

注意:CompressedPubKey 是SEC1 中定義的壓縮格式的公鑰。簡言之,如果 PubkeyY 是偶數,則為 0x02{PubkeyX},否則為 0x03{PubkeyX}。

RLP 編碼 (示例)​


prvkey 0xf8cc7c3813ad23817466b1802ee805ee417001fcce9376ab8728c92dd8ea0a6b
pubkeyX 0xdbac81e8486d68eac4e6ef9db617f7fbd79a04a3b323c982a09cdfc61f0ae0e8
pubkeyY 0x906d7170ba349c86879fb8006134cbf57bda9db9214a90b607b6b4ab57fc026e
RLP: 0x02a102dbac81e8486d68eac4e6ef9db617f7fbd79a04a3b323c982a09cdfc61f0ae0e8

AccountKeyFail ​

如果賬戶的密鑰是 AccountKeyFail,則交易驗證過程總是失敗。它可用於智能合約賬戶,使智能合約賬戶發送的交易總是失敗。

屬性​

屬性類型說明
類型uint8 (Go)AccountKeyFail 的類型。必須是 0x03。

RLP 編碼​

0x03c0

AccountKeyWeightedMultiSig ​

AccountKeyWeightedMultiSig 是一種賬戶密鑰類型,包含一個閾值和加權公鑰(WeightedPublicKeys),後者包含一個由公鑰及其權重組成的列表。要使交易對與 AccountKeyWeightedMultiSig 關聯的賬戶有效,必須滿足以下條件:

  • 已簽名公鑰的加權和應大於閾值。
  • 交易中不應包含無效簽名。
  • 已簽名公鑰的數量應少於加權公鑰的數量。
備註

The following multiSig validation logic has been added with the IstanbulEVM hardfork.

  • 交易中不應包含無效簽名。
  • 已簽名公鑰的數量應少於加權公鑰的數量。

屬性​

屬性類型說明
類型uint8 (Go)AccountKeyWeightedMultiSig 的類型。必須是 0x04。
Thresholduint (Go)驗證閾值。要成為有效交易,簽名的權重總和應大於或等於閾值。
WeightedPublicKeys[]{uint, [33]byte} (Go)加權公鑰列表。加權公開密鑰包含一個壓縮公開密鑰及其權重。

RLP 編碼​

0x04 + encode([threshold, [[weight, CompressedPubKey1], [weight2, CompressedPubKey2]]])

RLP 編碼 (示例)​


Threshold 3
Key0 Weight: 1
PubkeyX 0xc734b50ddb229be5e929fc4aa8080ae8240a802d23d3290e5e6156ce029b110e
PubkeyY 0x61a443ac3ffff164d1fb3617875f07641014cf17af6b7dc38e429fe838763712
Key1 Weight: 1
PubkeyX 0x12d45f1cc56fbd6cd8fc877ab63b5092ac77db907a8a42c41dad3e98d7c64dfb
PubkeyY 0x8ef355a8d524eb444eba507f236309ce08370debaa136cb91b2f445774bff842
Key2 Weight: 1
PubkeyX 0xea9a9f85065a00d7b9ffd3a8532a574035984587fd08107d8f4cbad6b786b0cd
PubkeyY 0xb95ebb02d9397b4a8faceb58d485d612f0379a923ec0ddcf083378460a56acca
Key3 Weight: 1
PubkeyX 0x8551bc489d62fa2e6f767ba87fe93a62b679fca8ff3114eb5805e6487b51e8f6
PubkeyY 0x4206aa84bc8955fcbfcc396854228aa63ebacd81b7311a31ab9d71d90b7ec3d7
RLP: 0x04f89303f890e301a102c734b50ddb229be5e929fc4aa8080ae8240a802d23d3290e5e6156ce029b110ee301a10212d45f1cc56fbd6cd8fc877ab63b5092ac77db907a8a42c41dad3e98d7c64dfbe301a102ea9a9f85065a00d7b9ffd3a8532a574035984587fd08107d8f4cbad6b786b0cde301a1038551bc489d62fa2e6f767ba87fe93a62b679fca8ff3114eb5805e6487b51e8f6

AccountKeyRoleBased ​

AccountKeyRoleBased 表示基於角色的密鑰。角色在 角色中指定。

屬性​

屬性類型說明
類型uint8 (Go)AccountKeyRoleBased 的類型。必須是 0x05。
Keys{AccountKey}` (Go)鑰匙列表。密鑰可以是 AccountKeyNil、AccountKeyLegacy、AccountKeyPublic、AccountKeyFail 和 AccountKeyWeightedMultiSig 中的任意一種。

角色​

基於 AccountKeyRoleBased 的角色定義如下:

角色說明
RoleTransaction索引 0。默認鍵。 TxTypeAccountUpdate 以外的交易應由該角色的密鑰簽名。
RoleAccountUpdate索引 1. TxTypeAccountUpdate 交易應由該密鑰簽名。如果賬戶中沒有該鍵,則使用 RoleTransaction 鍵驗證 TxTypeAccountUpdate 交易。
RoleFeePayer索引 2. 如果該賬戶要代替發件人發送 tx 費用,則交易應由該密鑰簽名。如果賬戶中沒有該密鑰,則使用 RoleTransaction 密鑰驗證收費授權交易。

RLP 編碼​

0x05 + encode([key1, key2, key3])

請注意,key1、key2 和 key3 可以是上述任何鍵(AccountKeyNil、AccountKeyLegacy、AccountKeyPublic、AccountKeyFail 和 AccountKeyWeightedMultiSig\ )。

可忽略和可擴展的角色​

最後一個索引中的角色可以省略,省略的角色會映射到第一個角色。但是,中間的角色不能省略,也就是說,如果沒有角色賬戶更新,就不能設置角色交易和角色付費人。例如,如果基於角色的密鑰設置為 "0x05 + encode([key1,key2])",那麼 RoleFeePayer 就會像設置為 "0x05 + encode([key1,key2,key1]) "一樣工作。

這一功能允許將來增加更多的角色。如果提供了新角色,則已用舊角色創建的賬戶的新角色會映射到第一個角色。

RLP 編碼 (示例)​


RoleTransaction Key
PubkeyX 0xe4a01407460c1c03ac0c82fd84f303a699b210c0b054f4aff72ff7dcdf01512d
PubkeyY 0x0a5735a23ce1654b14680054a993441eae7c261983a56f8e0da61280758b5919
RoleAccountUpdate Key
Threshold: 2
Key0 Weight:1
PubkeyX 0xe4a01407460c1c03ac0c82fd84f303a699b210c0b054f4aff72ff7dcdf01512d
PubkeyY 0x0a5735a23ce1654b14680054a993441eae7c261983a56f8e0da61280758b5919
Key1 Weight:1
PubkeyX 0x36f6355f5b532c3c1606f18fa2be7a16ae200c5159c8031dd25bfa389a4c9c06
PubkeyY 0x6fdf9fc87a16ac359e66d9761445d5ccbb417fb7757a3f5209d713824596a50d
RoleFeePayer Key
PubkeyX 0xc8785266510368d9372badd4c7f4a94b692e82ba74e0b5e26b34558b0f081447
PubkeyY 0x94c27901465af0a703859ab47f8ae17e54aaba453b7cde5a6a9e4a32d45d72b2
RLP: 0x05f898a302a103e4a01407460c1c03ac0c82fd84f303a699b210c0b054f4aff72ff7dcdf01512db84e04f84b02f848e301a103e4a01407460c1c03ac0c82fd84f303a699b210c0b054f4aff72ff7dcdf01512de301a10336f6355f5b532c3c1606f18fa2be7a16ae200c5159c8031dd25bfa389a4c9c06a302a102c8785266510368d9372badd4c7f4a94b692e82ba74e0b5e26b34558b0f081447

賬戶密鑰類型 ID​

以下是分配給每個賬戶密鑰類型的賬戶密鑰類型 ID。

賬戶密鑰類型賬戶密鑰類型 ID
AccountKeyLegacy0x01
AccountKeyPublic0x02
AccountKeyFail0x03
AccountKeyWeightedMultiSig0x04
AccountKeyRoleBased0x05
讓這個頁面變得更好