关于区块链:Aptos概念账户

8次阅读

共计 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 链反对下列签名策略:

  1. 单签应用 ED25519 规范
  2. 多签应用 MultiED25519 规范

缺省策略是单签。

签名策略标识

在生成认证秘钥的时候,你要提供 1 字节的签名策略标识,来示意到底应用单签还是多签。

  • 单签标识:0x00
  • 多签标识:0x01。留神多签的状况下,还须要提供 K 值,来生成 K-of-N 状态的多签秘钥。

    单签认证

    要生成单签的认证秘钥和账户地址:

  1. 创立秘钥对:新建一组秘钥对(privkey_A, pubkey_A)。Aptos 链在 Ed25519 曲线算法的根底上,应用 PureEdDSA 策略生成秘钥对,正如 RFC8032 规范定义的那样。
  2. 派生一个 32 字节的认证秘钥:

    auth_key = sha3-256(pubkey_A | 0x00)

    其中 | 示意连贯,0x00 是单字节的单签策略标识。

  3. 用这个初始化认证秘钥,作为永恒的账户地址

    多签认证

    所谓 K-of-N 多签的认证秘钥,是指一个账户具备 N 个签名人,至多其中的 K 集体签订之后,交易才会被认证为已签发。
    要生成多签的认证秘钥和账户地址:

  4. 创立秘钥对:生成 N 个 Ed25519 规范的公钥:p_1, …, p_n
  5. 确认 K 值:签发交易须要的起码签名人数量
  6. 派生一个 32 字节的认证秘钥:

    auth_key = sha3-256(p_1 | . . . | p_n | K | 0x01)

    其中 | 示意连贯,0x01 是单字节的多签策略标识。

  7. 用这个初始化认证秘钥,作为永恒的账户地址。

    签名人访问控制

    交易的发起人,总是由一个签名人来示意。当调用 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 模块中申明的,并且会公布到链上的分布式数据库。
正文完
 0