账户
凯亚账户
账户、州和地址概览
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。 |
nonce | uint64 (Go) | 用于确定交易顺序的序列号。 下一个要处理的事务具有与此值相同的 nonce。 |
balance | *big.Int (Go) | 账户中 KAIA 的金额。 |
humanReadable | bool (Go) | 布尔值,表示账户与人类可读地址相关联。 由于目前还不支持 HRA(人类可读地址),因此该值对所有账户都是假的。 |
key | AccountKey | 与该账户相关的密钥。 该字段可以是 AccountKeyLegacy、AccountKeyPublic、AccountKeyFail、AccountKeyWeightedMultisig、AccountKeyRoleBased 中的任意一个。 交易中的签名就是用这个密钥验证的。 |
智能合约账户(SCAs)
与 EOA 不同,SCA 有与之相关的代码,并受其代码控制。 SCA 由智能合约部署交易创建;一旦部署完成,SCA 自身无法启动新的交易,必须由 EOA 或其他 SCA 触发另一个账户。
属性
属性 | 类型 | 说明 |
---|---|---|
类型 | uint8 (Go) | 智能合约账户类型。 SCA 必须为 0x2。 |
nonce | uint64 (Go) | 用于确定交易顺序的序列号。 下一个要处理的事务的 nonce 与此值相同。 |
balance | *big.Int (Go) | 账户中 KAIA 的金额。 |
humanReadable | bool (Go) | 布尔值,表示账户与人类可读地址相关联。 由于目前还不支持 HRA(人类可读地址),因此该值对所有账户都是假的。 |
key | AccountKey | 与该账户相关的密钥。 该字段可以是 AccountKeyLegacy、AccountKeyPublic、AccountKeyFail、AccountKeyWeightedMultisig、AccountKeyRoleBased 中的任意一个。 交易中的签名就是用这个密钥验证的。 |
codeHash | []byte (Go) | 账户智能合约代码的哈希值。 这个值是不可变的,这意味着它只有在智能合约创建时才会被设置。 |
storageRoot | [32]byte (Go) | 包含账户中所有存储变量值的 Merkle Patricia Trie 根的 256 位散列。 |
codeFormat | uint8 (Go) | 支持解释器版本。 最多可设置 16 个。 目前,它只支持 EVM(0x00) 。 |
vmVersion | uint8 (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 的属性。