共计 2633 个字符,预计需要花费 7 分钟才能阅读完成。
Aptos 链上的资产,都属于某个账户。所谓资产,是指包含币、NFT 在内的,人造稀缺的货色,所以他们的拜访,肯定要有管制。任何资产,在区块链账户中,都体现为一种资源(resource)。资源是 Move 语言中一种原始数据类型,它体现出稀缺性和访问控制能力。不过,资源也能够用于代表其余的链上能力,可辨认信息,或者访问控制。
每一个账户都能够用一条 32 字节的地址来示意。账户中能够蕴含数据,数据被保留在资源里。一个账户的初始资源,就是账户自身的数据(认证秘钥和序列号)。创立完账户后,能够再增加其余资源(比方币和 NFT)。
账户地址示例:
账户地址由 32 个字节组成,通常用 64 个 16 进制数字示意,每个数字示意半个字节(nibble)。在 你的第一笔交易 中,有对于地址的例子,大略是上面这样:
Alice: eeff357ea5c1a4e7bc11b2b17ff2dc2dcca69750bfef1e1ebcaccf8c8018175b
Bob: 19aadeca9388e009d136245b9a67423f3eee242b03142849eb4f81a4a409e59c
创立账户
当用户通过 Aptos SDK 创立一个账户,会经验上面几个加密步骤:
- 首先创立一组秘钥对:一个公钥 + 一个私钥
- 用户明确要应用的签名策略:对于一笔交易,要应用单签还是多签
- 联合公钥和签名策略,生个一个 32 字节的认证秘钥
- 初始化账户序列号为 0。把上一步生成的认证秘钥和序列号,都存进账户的初始化资源中
- 基于认证秘钥,生成 32 字节的账户地址
从当初开始,用户就能够用账户私钥来签订每一笔交易了。
账户序列号
序列号,用于示意一个账户中,有多少笔交易被提交到链上,并且确认过了。每一笔从该账户收回的交易,无论最终执行了,还是勾销了,只有被链上保留,都会导致序列号自增 1。
发动交易的时候,就须要附带上账户的以后序列号。当 Aptos 公链筹备执行交易的时候,它会查看这个序列号,跟链上保留的账户以后序列号做比拟。只有在交易附带序列号和账户序列号相等时,交易才会被执行,否则就会回绝。通过这种形式,能够防止旧的交易被反复执行,从而防止了重放攻打(replay attack)。
这些交易(译注:分割上下文,应该是指所有序列号大于账户以后序列号的交易)会被暂存在 mempool 中,晓得它们正好是账户的下一个序列号(随着交易的执行,账户序列号会一直增长);或者直到它们过期被革除。交易执行之后,账户序列号自增 1。账户序列号永远是枯燥递增的。
账户地址
在创立新账户的过程中,会生成一个 32 字节的认证秘钥,而后,这个认证秘钥就会作为账户地址返回。
不过,认证秘钥当前是能够变更的,比方,你生成了新的一组秘钥对来重置秘钥。但账户地址是不变的。因而,只有初始化账户生成的 32 字节认证秘钥,跟地址雷同。在账户创立之后,无论私钥、公钥还是认证秘钥产生变更,账户地址都不变了。账户地址自创立之后,是永远不会变动的。
签名策略
Aptos 链反对下列签名策略:
- 单签应用 ED25519 规范
- 多签应用 MultiED25519 规范
缺省策略是单签。
签名策略标识
在生成认证秘钥的时候,你要提供 1 字节的签名策略标识,来示意到底应用单签还是多签。
- 单签标识:
0x00
-
多签标识:
0x01
。留神多签的状况下,还须要提供K
值,来生成 K-of-N 状态的多签秘钥。单签认证
要生成单签的认证秘钥和账户地址:
- 创立秘钥对:新建一组秘钥对(privkey_A, pubkey_A)。Aptos 链在 Ed25519 曲线算法的根底上,应用 PureEdDSA 策略生成秘钥对,正如 RFC8032 规范定义的那样。
-
派生一个 32 字节的认证秘钥:
auth_key = sha3-256(pubkey_A | 0x00)
其中
|
示意连贯,0x00
是单字节的单签策略标识。 -
用这个初始化认证秘钥,作为永恒的账户地址
多签认证
所谓 K-of-N 多签的认证秘钥,是指一个账户具备 N 个签名人,至多其中的 K 集体签订之后,交易才会被认证为已签发。
要生成多签的认证秘钥和账户地址: - 创立秘钥对:生成 N 个 Ed25519 规范的公钥:p_1, …, p_n
- 确认 K 值:签发交易须要的起码签名人数量
-
派生一个 32 字节的认证秘钥:
auth_key = sha3-256(p_1 | . . . | p_n | K | 0x01)
其中
|
示意连贯,0x01
是单字节的多签策略标识。 -
用这个初始化认证秘钥,作为永恒的账户地址。
签名人访问控制
交易的发起人,总是由一个签名人来示意。当调用 Move 模块中的函数时,如果有 signer 作为参数,Move 虚拟机将签订交易的账户身份转化为 Move 模块入口中的 signer。上面的代码,展现了初始化和提现时,signer 的用法;反之,如果一个函数中没有 signer 这个参数,例如上面的充值函数,它就不须要访问控制:
module Test::Coin {struct Coin has key { amount: u64} public fun initialize(account: &signer) {move_to(account, Coin { amount: 1000}); } public fun withdraw(account: &signer, amount: u64): Coin acquires Coin {let balance = &mut borrow_global_mut<Coin>(Signer::address_of(account)).amount; *balance = *balance - amount; Coin {amount} } public fun deposit(account: address, coin: Coin) acquires Coin {let balance = &mut borrow_global_mut<Coin>(account).amount; *balance = *balance + coin.amount; Coin {amount: _} = coin; } }
账户状态
账户的状态,由账户所属的代码(Move modules)和数据(Move resoruces)独特组成。一个账户中,能够蕴含任意数量的代码和数据。
- 代码 / 模块(Move modules):Move 在模块中蕴含代码,比方 类型 和 过程申明,然而不蕴含数据。Move 模块编码了 Aptos 链的全局状态规定。
- 资源(Move resoruces):资源蕴含了数据,但不含代码。每条资源都有对应的类型,而类型是在 Move 模块中申明的,并且会公布到链上的分布式数据库。