如何从 NEAR 协议中的私钥和/或帐户 ID 获取公钥?

Posted

技术标签:

【中文标题】如何从 NEAR 协议中的私钥和/或帐户 ID 获取公钥?【英文标题】:How to get a public key from private key and/or account id in NEAR protocol? 【发布时间】:2021-01-15 04:28:30 【问题描述】:

在多种情况下,您可能拥有帐户 ID(这是公共信息)或拥有私有(秘密)密钥(例如从 NEAR 钱包本地存储中提取它),并且您想知道相应的公共密钥。

获取相关公钥的选项有哪些?

【问题讨论】:

【参考方案1】:

NEAR 协议使用EdDSA signature,因此使用ed25519 密钥。拥有一个私有(秘密)密钥,您可以派生相应的公钥(但您不能从公钥中派生出私钥)。大多数实现 EdDSA 签名的库都允许从密钥派生公钥,以下是使用 near-api-js 的方法:

const nearApi = require('near-api-js')

// NEVER SHARE your private (secret) keys! (The key I used below is not used anywhere)
const keyPair = nearApi.KeyPair.fromString('ed25519:43qKAz3LfCTWpTAZPgA1DGsuwbiAjyosXpDrw24efAGP8Q3TcrnoUzTQHNRF5EbNTR38GRVdsHai9sRnzVu755gU')

console.log(keyPair.getPublicKey().toString())

因此,有了秘钥,你可以随时离线获取对应的公钥。

如果你没有秘钥,你将无法签署交易,但你可能仍想知道属于某个用户的公钥,此时你可以通过@查询 NEAR 协议网络987654323@:

http post https://rpc.testnet.near.org jsonrpc=2.0 id=dontcare method=query \
  params:='
    "request_type": "view_access_key_list",
    "finality": "final",
    "account_id": "near.test"
  '

或使用 cURL:

curl -X POST https://rpc.testnet.near.org -H 'content-type: application/json' --data \
  '
    "jsonrpc": "2.0",
    "id": "dontcare",
    "method": "query",
    "params": 
      "request_type": "view_access_key_list",
      "finality": "final",
      "account_id": "near.test"
    
  '

作为响应,您将找到所有公钥及其对给定 (near.test) 帐户 ID 的权限。

【讨论】:

要快速从已知私钥中获取公钥,您可以使用 NEAR CLI (npm i -g near-cli) 并运行:near replnearAPI.KeyPair.fromString('ed25519:43qKAz3LfCTWpTAZPgA1DGsuwbiAjyosXpDrw24efAGP8Q3TcrnoUzTQHNRF5EbNTR38GRVdsHai9sRnzVu755gU').publicKey.toString()nearAPI 是REPL) 作为一个有用的链接,请参阅near.github.io/account-lookup 以查找有关帐户的更多信息,包括其关联的锁定合同和余额 如何以编程方式获取私钥以广播 TX? @AndonMitev 请提出一个单独的问题,并提供有关您的用例的更多详细信息,包括您运行代码的上下文(浏览器、node.js、合同,还是其他东西?)

以上是关于如何从 NEAR 协议中的私钥和/或帐户 ID 获取公钥?的主要内容,如果未能解决你的问题,请参考以下文章

如果有人得到我的私钥和公钥,JWT 会发生啥?

使用元掩码扩展的 chrome 文件中的私钥和事务存储在哪里

RSA公私钥和签名、验签过程

hbuilder打包ios需要的私钥和profile文件和私钥证书怎么获得

当您尝试使用 PIV 卡的私钥和全局密码进行签名时,RSACryptoServiceProvider 是不是有效?

用openssl生成SSL使用的私钥和证书,并自己做CA签名