账户、地址和密钥
Please read Substrate to Polkadot SDK page first.
账户代表一个身份(通常是个人或组织),能够进行交易或持有资金。 虽然账户最常用于代表个人,但这并非必须如此。 账户可以用于代表用户或其他实体执行操作,或自主执行操作。 此外,任何单个个人或实体都可以拥有多个账户,用于不同的目的。 例如,Polkadot 是一个基于 Substrate 的区块链,它拥有专门的账户用于持有资金,这些资金与用于进行交易的账户分开。 您如何实现和使用账户完全取决于您作为区块链或平行链开发人员。
公钥和私钥
通常,每个账户都有一个拥有者,该拥有者拥有一个公钥和私钥对。 私钥是一个加密安全的随机生成的数字序列。 为了便于人类阅读,私钥会生成一个随机的单词序列,称为秘密种子短语或助记词。 秘密种子短语很重要,因为如果私钥丢失,它可以用来恢复对账户的访问权限。
对于大多数网络,与账户关联的公钥是该账户在网络上的识别方式,并且其某种形式用作交易的目标地址。 但是,基于 Substrate 的链使用底层公钥来派生一个或多个公钥地址。 Substrate 允许您为账户生成多个地址和地址格式,而不是直接使用公钥。
地址编码和链特定地址
通过从单个公钥派生多个地址,您可以与多个链交互,而无需为每个网络创建单独的公钥和私钥对。 默认情况下,与账户公钥关联的地址使用 Substrate SS58 地址格式。 SS58 地址格式是base-58 编码的增强版本。 SS58 地址格式的重要特征包括:
- 编码后的地址由 58 个字母数字字符组成,与十六进制编码的地址相比,地址更短,更容易识别。
- 地址不使用在字符串中难以区分的字符。
例如,字符
0
、O
、I
和l
不在 SS58 地址中使用。 - 地址可以包含网络特定的前缀,因此您可以使用相同的公钥为不同的链派生地址。
- 地址可以使用派生路径从同一个公钥创建多个地址,因此您可以将不同的地址用于不同的目的。 例如,您可以创建子账户来分离资金或执行特定类型的交易。
- 地址可以使用校验和进行验证,以防止输入错误。
检查网络特定地址
由于单个公钥可以用来为不同的 Substrate 链派生地址,因此单个账户可以拥有多个链特定地址。
例如,如果您检查 alice
账户公钥 0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d
的地址,则取决于链特定地址类型。
链地址类型 | 地址 |
---|---|
Polkadot (SS58) | 15oF4uVJwmo4TdGW7VfQxNLavjCXviqxT9S1MgbjMNHr6Sp5 |
Kusama (SS58) | HNZata7iMYWmk5RvZRTiAsSDhV8366zq2YGb3tLH5Upf74F |
通用 Substrate 链 (SS58) | 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY |
注册网络特定地址
每个基于 Substrate 的区块链都可以注册一个自定义前缀来创建一个网络特定地址类型。
例如,所有 Polkadot 地址都以 1
开头。
所有 Kusama 地址都以大写字母开头。
所有未注册的 Substrate 链都以 5
开头。
您可以使用 subkey inspect
命令和 --network
命令行选项或使用Subscan查找公钥的网络特定地址。
有关生成公钥和私钥对以及检查地址的信息,请参阅subkey。 有关注册链特定地址的信息,请参阅SS58 存储库中的说明。
FRAME 中的账户信息
从概念上讲,账户代表具有一个或多个公钥地址的公钥/私钥对的身份。 但是,在使用 FRAME 构建的运行时中,账户被定义为一个存储映射,它具有一个 32 字节的地址标识符和相应的账户信息,例如账户已进行的交易数量、依赖于账户的模块数量以及账户余额。
账户属性(例如 AccountId
)可以在 frame_system
模块中泛型定义。
然后,泛型类型在运行时实现中解析为特定类型,并最终分配一个特定值。
例如,FRAME 中的 Account
类型依赖于关联的 AccountId
类型。AccountId
类型仍然是泛型类型,直到它在需要此信息的模块的运行时实现中分配一个类型。
有关账户如何在 frame_system
模块中定义以及 Account
存储映射中的账户属性的更多信息,请参阅账户数据结构。
有关使用泛型类型的更多信息,请参阅Substrate 的 Rust。
专用账户
作为区块链开发的灵活且模块化的框架,Substrate 本身不要求您定义或使用任何特定类型的账户。 但是,不同的链可以实现不同的规则,用于如何使用账户以及控制它们的密钥。 例如,如果您的应用程序需要以下内容,您可能会实现专用账户:
- 自定义加密方案
- 复杂或多用户签名规则
- 对特定功能的访问限制
- 对特定模块的访问限制
在大多数情况下,专用账户是在特定 FRAME 模块的上下文中实现的,无论是在预构建的模块(如Staking或Multisig)中,还是在您设计的自定义模块中。
例如,Staking 模块会获取想要抵押的原始 FRAME 系统账户,并生成stash 和controller 账户抽象来识别执行特定操作所需的账户。 您可以在 Polkadot 生态系统中看到这些账户抽象的实现。但是,您可以使用相同的框架来实现不同的账户规则或账户类型,或者作为具有自己的账户抽象的自定义模块的灵感。
多重签名账户
通常,一个账户只有一个拥有者,并且该拥有者持有用于签署交易的私钥。 Multisig 模块使您能够配置一个专用账户,用于执行多个账户拥有者必须批准的交易。 多重签名账户是一个具有公钥但没有私钥的地址。 多重签名账户的公钥地址是从授权账户签署者的确定性列表以及关联的交易请求区块高度和外部函数索引标识符派生的。
Multisig 模块使多个方能够共享执行某些交易的责任。 任何账户持有者都可以指定允许批准多重签名交易的账户以及分派到运行时的调用所需的最低批准数量。
代理和无密钥账户
Proxy 模块提供了另一种使用 FRAME 为基于 Substrate 的链配置专用账户的方法。 使用代理账户,主账户拥有者可以指定一个或多个其他账户代表他们行事。 代理账户可用于通过将主账户资金与分配给特定角色的账户隔离来增加安全层,这些账户可以代表主账户完成任务。
通过配置一个或多个代理账户,账户拥有者可以执行以下操作:
- 指定允许代表主账户拥有者提交交易的代理账户的最大数量。
- 为每个代理执行的交易配置时间延迟。
- 对每个代理可以发出的交易类型设置限制。
- 在执行交易之前宣布由代理执行的交易。
- 取消或拒绝由代理执行的已宣布交易。
- 创建匿名(纯代理)账户,这些账户没有私钥,可以通过其自己的配置代理在没有账户所有权的情况下行事。
运行时实现
虽然 Proxy 模块提供了此框架来配置代理账户,但实现细节取决于您作为运行时开发人员。 例如,默认的 Proxy 模块会根据代理类型过滤代理账户可以分派的调用。 但是,运行时实现定义了代理类型以及每个代理类型允许执行的交易。 Polkadot 使您能够使用以下代理类型来限制代理账户的交易:
- Any
- NonTransfer
- Governance
- Staking
- IdentityJudgement
- CancelProxy
- Auction
枚举的代理类型列表以及将代理类型与交易匹配的逻辑在Polkadot 运行时中定义。
匿名代理账户
匿名或纯代理账户是一种特殊的代理账户,它具有随机生成的地址,但没有相应的私钥。 通常,如果您想将权限委托给一个账户,该账户可以在没有您的干预和没有访问您的密钥的情况下分派函数调用,则会创建这种类型的代理账户。 创建具有委托权限的新账户后,该账户可以用作接收者来销毁资金或持有等待执行转账的代币。
下一步去哪里
在 Substrate 中,账户需要公钥和私钥才能接收资金、签署交易和执行交易。 在高级别上,有三种类型的账户:
- 允许最终用户与区块链交互的用户账户。
- 通过限制质押和治理的某些操作来为验证者和提名人提供额外安全性的网络账户。
- 由有效原点执行以执行模块特定操作的模块账户。
有关使用账户、地址和密钥的更多信息,请参阅以下资源: