跳到主要内容

🔑 Collator节点session 密钥

安装 > 配置 > 运行 > 同步 > Collator节点session 密钥 > 绑定

要在 Calamari 链上进行收集整理工作,任何时间都需要两个帐户/密钥对:

  • Collator 账户: 这是持有Collator节点保证金的账户。 同时也是整理者的交易费用份额将被存入的账户。 当账户在整理时,保证金不能被花费。值得注意的是,这个账户的密钥应该被仔细保护,并且不应该存在于整理者节点的文件系统中。
  • Nimbus会话密钥: 这是一次性账户,用于识别你的单个节点和它与网络上其他节点产生的块。当调用author_insertKeyauthor_rotateKeys的RPC方法时,Substrate将此密钥存储在整理器节点的文件系统(/var/lib/substrate/chains/calamari/keystore)上的parachain keystore中。由于这是一个热钱包密钥,如果被泄露,可能会被滥用来冒充你的节点(可能会导致未来的存款被削减),所以不经常更新会话密钥是一个很好的做法 - 通常每半年一次,最多每个会话一次。

两个密钥相互关联,以创建用于交易费用奖励支付和(在未来)削减的债券节点对。

此外,您的节点可能在存储中有两个额外的密钥:

  • Aura会话密钥: 在v3.3.0之前,此密钥赋予节点出块的合法性,但现在已经弃用了。
  • VRF会话密钥: 预留密钥给未来的基于VRF的出块机制,在v3.2.1之前是不被开启的,但在未来会切换到此出块算法。
danger

以下两种方法(插入、更新)都使用 unsafe RPC 调用来设置节点会话密钥。 为使用它们,你必须停止运行中的节点,然后用-rpc-methods=unsafe CLI参数启动它。 当暴露在公共互联网上时,这种操作模式是不安全的 ,完成后重新启动节点就不需要再使用这个CLI参数。

这条命令演示了一个会话密钥的插入,该密钥是用

  • 为您的平台构建/安装 subkey

  • 为您的平台安装 jq utility

  • 生成一个Nimbus(nmbs)密钥,用subkey/jq插入私钥/检查私钥的有效性

    #!/bin/bash
    subkey generate \
    --scheme sr25519 \
    --network calamari \
    --output-type json \
    --words 12 \
    > ./nmbs.json
    echo '{
    "jsonrpc":"2.0",
    "id":1,
    "method":"author_insertKey",
    "params": [
    "nmbs",
    "nmbs mnemonic phrase",
    "nmbs hex public key"
    ]
    }' | jq \
    --arg mnemonic "$(jq -r .secretPhrase ./nmbs.json)" \
    --arg hex "$(jq -r .publicKey ./nmbs.json)" \
    '. | .params[1] = $mnemonic | .params[2] = $hex' > ./insert-nmbs.json
    echo '{
    "jsonrpc":"2.0",
    "id":1,
    "method":"author_hasKey",
    "params": [
    "nmbs hex public key",
    "nmbs"
    ]
    }' | jq \
    --arg hex "$(jq -r .publicKey ./nmbs.json)" \
    '. | .params[0] = $hex' > ./check-nmbs.json
  • 生成 VRF (rand) 密钥并用subkey/jq插入私钥/检查私钥的有效性

    #!/bin/bash
    subkey generate \
    --scheme sr25519 \
    --network calamari \
    --output-type json \
    --words 12 \
    > ./rand.json
    echo '{
    "jsonrpc":"2.0",
    "id":1,
    "method":"author_insertKey",
    "params": [
    "rand",
    "rand mnemonic phrase",
    "rand hex public key"
    ]
    }' | jq \
    --arg mnemonic "$(jq -r .secretPhrase ./rand.json)" \
    --arg hex "$(jq -r .publicKey ./rand.json)" \
    '. | .params[1] = $mnemonic | .params[2] = $hex' > ./insert-rand.json
    echo '{
    "jsonrpc":"2.0",
    "id":1,
    "method":"author_hasKey",
    "params": [
    "rand hex public key",
    "rand"
    ]
    }' | jq \
    --arg hex "$(jq -r .publicKey ./rand.json)" \
    '. | .params[0] = $hex' > ./check-rand.json
  • 使用 RPC author_insertKey 来插入刚刚生成的session keys

    #!/bin/bash
    for key in nmbs rand; do
    curl \
    --header 'Content-Type: application/json;charset=utf-8' \
    --data @./insert-${key}.json \
    http://localhost:9133
    done
  • 验证:检查存储在节点中的会话密钥是否与生成的密钥匹配(执行一下命令之后,返回结果里应该有一个像这样的字段"result":true)

    #!/bin/bash
    for key in nmbs rand; do
    has_key=$(curl \
    -s \
    --header 'Content-Type: application/json;charset=utf-8' \
    --data @./check-${key}.json \
    http://localhost:9133
    echo "${key}: ${has_key}"
    done
  • 验证:检查日志是否显示节点正在使用认证的角色运行:(AUTHORITY检查时间戳)

    #!/bin/bash
    journalctl -u calamari.service -g AUTHORITY
  • 从这两个个文件 nmbs.json/rand.json 保存分别各自的公钥,并且安全地备份这三个私钥文件到安全且离线的地方

  • 清除: 从文件系统中删除之前步骤中创建的私钥

    #!/bin/bash
    rm ./nmbs.json ./rand.json ./insert-nmbs.json ./insert-rand.json
note

检查你的节点如果没有出现这样的日志 2022-07-19 17:24:18 [Parachain] 🔏 No Nimbus keys available. We will not be able to author.
或者甚至重启节点之后还是不能生成这样的日志,请细致地重复以上的步骤。

将节点帐户绑定到 session 密钥

note

如果节点日志不包含[Relaychain] 💤 Idle[Parachain] 💤 Idle消息,意味着您的节点需要继续同步。当节点未同步完成,不要绑定 一个未完全同步的节点帐户到 session 密钥。这样做会导致节点被系统拒绝接入。

账户和session key的绑定是在链上完成的,使用 polkadot.js进行账户绑定。

  • 在浏览器中 打开calamari/developer/extrinsics session.setkeys()

    note

    现在展示的图片都是从dolphin测试网上截去的,但是在calamari主网上操作都是一样的。

    • 在标有using the selected account的第一个框中,选择持有 400,000 KMA collator绑定帐户。
    • 在标有submit the following extrinsic的第二个(下拉)框中,选择session.
    • 在第三个(下拉)框中,选择setKeys(keys, proof)
    • 在标有aura: SpConsensusAuraSr25519AppSr25519Public and proof: Bytes第四个对话框中输入 aura 会话密钥的十六进制公钥,或者输入一个虚设的公钥: 0x0000000000000000000000000000000000000000000000000000000000000000
      note

      aura 在 节点版本pre-v3.3.0 之后就被废弃了,所以这个值实际上是不会被用到的。

    • 在标有nimbus: NimbusPrimitivesNimbusCryptoPublic and proof: Bytes第五对话框中输入 nimbus 会话密钥的十六进制公钥。
    • 在标有vrf: SessionKeyPrimitivesVrfVrfCryptoPublic and proof: Bytes第六对话框中输入 vrf 会话密钥的十六进制公钥。
    • 在标有 proof: Bytes对话框, 再次输入十六进制的nimbus session公钥。
    • 单击Submit Transaction按钮,交易确认并成功的弹框将会在浏览器的右上角出现。
  • 通过在浏览器中加载 calamari/developer/chainstate 来验证整理者帐户和 session密钥是否已绑定session.nextkeys()

    note

    再次说明一次,现在展示的图片都是从dolphin测试网上截去的,但是在calamari主网上操作都是一样的。

    • 在第一个(下拉)框中,标记为selected state query,选择session.
    • 在第二个(下拉)框中,选择nextKeys(AccountId32): Option<CalamariRuntimeOpaqueSessionKeys>
    • 在第三个(下拉)框中,选择持有 KMA Collator绑定帐户。
    • 保持include option选中复选框选中。
    • blockhash to query at框设置为默认0x
    • 单击第二个下拉框右侧的(+) 图标.
    • 验证是否出现了一个标记为session.nextKeys(AccountId32): Option<CalamariRuntimeOpaqueSessionKeys> 的json 对象,该对象的aura, nimbusvrf值为之前设置的 session keys 的十六进制公钥。