最近、golang を使用して solana コントラクトを呼び出しましたが、rust や ts ほど単純ではないことがわかり、いくつかの小さな間違いがあり、計算したシード アドレスが次のようになりました。 ts で計算したものとは若干異なるため、しばらくしてから詳細な調査を行いました。
const PDA_MARKER = "ProgramDerivedAddress" // Create a program address. // Ported from https://github.com/solana-labs/solana/blob/216983c50e0a618facc39aa07472ba6d23f1b33a/sdk/program/src/pubkey.rs#L204 func CreateProgramAddress(seeds [][]byte, programID PublicKey) (PublicKey, error) { if len(seeds) > MaxSeeds { return PublicKey{}, ErrMaxSeedLengthExceeded } for _, seed := range seeds { if len(seed) > MaxSeedLength { return PublicKey{}, ErrMaxSeedLengthExceeded } } buf := []byte{} for _, seed := range seeds { buf = append(buf, seed...) } buf = append(buf, programID[:]...) buf = append(buf, []byte(PDA_MARKER)...) hash := sha256.Sum256(buf) if IsOnCurve(hash[:]) { return PublicKey{}, errors.New("invalid seeds; address must fall off the curve") } return PublicKeyFromBytes(hash[:]), nil }
このコードの意味は、シード バイト配列を接続し、元のメッセージである「ProgramDerivedAddress」を追加して、ハッシュ アドレスを計算するために IsOnCurve 関数を使用することです。 ed25519 かどうかカーブ上に存在しない場合は、シードの最後のパラメータ (bumpSeed の値) が変更されます。この値は 255 から始まり、減少します。
暗号通貨の世界のメッセージは基本的に署名も含めて詰め込まれています
keccak256("\x19\x01"),
コードはあった方が良いです。コードを読めばすぐにわかります。
2 つのバグも修正し、リンクを送信しました:
https://github.com/daog1/solana-anchor-go
これは、アンカー IDL に基づいて go call コードを生成するプロジェクトです。
いつか会えば分かるでしょう
以上がSolana はシード アドレスをどのように計算しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。