I recently used golang to call the solana contract, and found that it is not as simple as rust and ts, and there were some small mistakes, which caused the seed address I calculated to be somewhat different from that calculated by ts, so I did an in-depth study. After a while.
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 }
The meaning of this code is that you connect the seeds bytes array and add "ProgramDerivedAddress", which is the original message. Then call sha256.Sum256 to calculate the hash address. The IsOnCurve function is to determine whether the hash is in Whether in ed25519 On the curve, if it is not there, it will change the last parameter of your seeds, which is the value of bumpSeed. This value starts from 255 and decreases.
Messages in the crypto world are basically stuffed, including signatures
keccak256("\x19\x01"),
It’s better to have code, you will always know when you read the code.
I also fixed two bugs and sent a link:
https://github.com/daog1/solana-anchor-go
This is a project that generates go calling code based on anchor idl.
One day you meet me, you will understand
The above is the detailed content of How does Solana calculate the seed address?. For more information, please follow other related articles on the PHP Chinese website!