ホームページ > バックエンド開発 > Golang > Solana はシード アドレスをどのように計算しますか?

Solana はシード アドレスをどのように計算しますか?

DDD
リリース: 2024-12-19 01:48:08
オリジナル
740 人が閲覧しました

Solana はシード アドレスをどのように計算しますか?

最近、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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート