首頁 > 後端開發 > Golang > solana是如何算出seed地址

solana是如何算出seed地址

DDD
發布: 2024-12-19 01:48:08
原創
740 人瀏覽過

solana是如何算出seed地址

最近在用golang調用solana合約,發現沒有rust和ts簡單,以及一些小的失誤,導致我算的seed地址和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
}
登入後複製

這段程式碼的意思是你seeds bytes 數組,進行了連接再加了"ProgramDerivedAddress",就是原始的message,再調用sha256.Sum256就可以算出來hash地址,IsOnCurve這函數是判斷hash是不是在判斷hash是不是在是否在ed25519曲線上,如果不在會改變你的seeds的最後一個參數,也就是bumpSeed的值,這個值是從255開始的,遞減。

加密世界的message基本上都是加料了的,算簽名的也是

keccak256("\x19\x01"),
登入後複製

有程式碼還是好,讀讀程式碼總是會知道。

另外去改了兩個bug,發個連結:
https://github.com/daog1/solana-anchor-go
這是一個根據anchor idl產生 go 呼叫程式碼的專案。
哪天你遇到了,你會懂

以上是solana是如何算出seed地址的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板