3

我的问题是:

  1. 种子是什么?
  2. 为什么需要种子?
  3. 种子输入是随机的还是特定的?

举些例子:

  1. 第一个参数是函数的种子findProgramAddress
const [_pda, _nonce] = await PublicKey.findProgramAddress(
  [Buffer.from(anchor.utils.bytes.utf8.encode("escrow"))],
  program.programId
)
  1. 第二个参数是函数 createWithSeed 的种子?
const GREETING_SEED = 'hello';
const greetedPubkey = await PublicKey.createWithSeed(
  payer.publicKey,
  GREETING_SEED,
  programId,
);
4

1 回答 1

7

在为 Solana 链上程序创建程序派生地址时,该函数Pubkey::create_program_address只需将种子与程序地址散列在一起,以创建一些新的 32 字节地址。然而,这个 32 字节的地址可能是 ed25519 曲线上的一个点,这意味着有一个与之关联的私钥。这意味着攻击者可以真正为您的程序派生地址签名,从而破坏 Solana 编程模型的安全性。

为了避开这种攻击,Pubkey::create_program_address如果结果值ed25519 曲线上的有效点,将失败。因此,为了让开发人员更轻松,Pubkey::find_program_address将迭代调用Pubkey::create_program_address,直到找到给定种子和程序 id 的安全地址。第一个返回值是安全地址,第二个返回值是用于创建程序地址的附加种子。

以下是一些额外的资源:

于 2021-08-27T22:45:40.443 回答