最近在用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中文網其他相關文章!