Solana/私钥, 公钥与地址/公钥

在 solana 区块链中, 公钥是一个由加密算法生成的唯一标识符, 通常与私钥成对出现. 私钥由用户持有并严格保密, 而公钥则可以公开分享, 用来表示用户的身份或账户地址. 与比特币或以太坊的地址不同, solana 的公钥本身就是账户的标识符, 而不是通过哈希函数生成的派生地址.

什么是公钥

Solana 使用的是 ed25519 椭圆曲线加密算法, 这是一种高安全性和高效性的签名算法. 每个公钥是一个 32 字节的字符串, 通常以 base58 编码格式展示给用户. 例如, 一个典型的 solana 公钥看起来像是:

6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt

例: 有 solana 地址 6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt, 求该地址对应的公钥. 公钥结果以 16 进制表示.

答: Solana 的地址就是其公钥. 因此只需将地址字符串以 base58 解码即可. 为了解决这个问题, 我们首先通过 pip install pxsol 命令安装 pxsol 库. 这是一个对人类友好的 solana python 库. 使用该库提供的 base58 功能即可解码 base58 字符串.

import pxsol

pubkey = pxsol.base58.decode('6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt')
print(pubkey.hex()) # 4cb5abf6ad79fbf5abbccafcc269d85cd2651ed4b885b5869f241aedf0a5ba29

公钥的生成

Solana 的公钥和私钥对是通过 ed25519 算法生成的. 大致生成过程如下:

  1. 私钥生成: 首先生成一个随机的 32 字节数组.
  2. 私钥派生: 通过私钥和 ed25519 相关算法, 生成一个 64 字节的派生私钥.
  3. 公钥派生: 从派生私钥中通过数学运算派生出对应的 32 字节公钥.

如果您已经完整阅读过前三节, 那么您应该对这其中的每一个步骤都了如指掌. 如果您没有阅读过, 那也不要紧, 因为 pxsol 已经为您实现了一切!

例: 有以 base58 表示的私钥 11111111111111111111111111111112, 求其对应的公钥.

答:

import pxsol

prikey = pxsol.core.PriKey.base58_decode('11111111111111111111111111111112')
pubkey = prikey.pubkey()
print(pubkey) # 6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt

公钥的应用

Solana 的公钥在网络中有多种用途, 有下面的几种常见使用场景.

账户标识

在 solana 中, 每个账户都由一个公钥唯一标识. 账户可以存储 sol(solana 的原生代币), 代币, 程序数据等. 无论是普通用户账户还是智能合约(称为程序账户), 都以公钥作为地址. 在 solana 中, 账号的地址就是其公钥的 base58 表示, 因此用户实际上是通过公钥接收 sol 或其他代币. 因此, 您可以将公钥分享给他人, 让他们向您的账户转账. 公钥可以公开, 但私钥必须严格保密.

在转账时, 仔细核对公钥, 避免因输入错误导致资金损失.

交易签名

当用户发起一笔交易(如转账, 调用程序等), 需要使用对应的私钥对交易进行签名. 网络通过公钥验证签名的有效性, 确保交易是由合法账户持有人发出的.

权限管理

Solana 中的账户支持权限分离. 例如, 一个公钥可以被指定为"只读"权限, 而另一个公钥拥有"签名"权限. 这种设计在去中心化应用和团队账户管理中非常有用.

程序交互

在 solana 上, 智能合约(称为程序, program)也有自己的公钥. 用户通过指定程序的公钥调用其功能, 公钥在此起到定位和验证的作用.