go-substrate-rpc-client
go-substrate-rpc-client copied to clipboard
Can sign and send transactions to moonbeam?
trafficstars
How do I sign and send a transaction to Moonbeam, I understand Polkadot's method!
// Transfer 转账 https://kusama.subscan.io/extrinsic?module=Balances&call=transfer_keep_alive
func (service *Service) Transfer(signer Signer, to types.AccountID, amount uint64) *types.Hash {
// 获取元数据信息
metadata := service.GetMetadata()
if metadata == nil {
return nil
}
toMultiAddress, err := types.NewMultiAddressFromAccountID(to.ToBytes())
if err != nil {
zap.S().Warnf("failed to get to [%v] multi address, err: %v", to.ToHexString(), err)
return nil
}
// Transfer Call
transferCall, err := types.NewCall(metadata, "Balances.transfer_keep_alive", toMultiAddress, types.NewUCompactFromUInt(amount))
if err != nil {
zap.S().Warnf("failed to new Balances.transfer_keep_alive call, err: %v", err)
return nil
}
// Extrinsic
extrinsic := types.NewExtrinsic(transferCall)
if signer.IsProxy {
proxyType := signer.ProxyType
realAccount := signer.RealAccountId
// 获取被代理账户的账户 ID
realMultiAddress, err := types.NewMultiAddressFromAccountID(realAccount.ToBytes())
if err != nil {
zap.S().Warnf("failed to get real [%v] multi address, err: %v", realAccount.ToHexString(), err)
return nil
}
call, err := types.NewCall(metadata, "Proxy.proxy", realMultiAddress, types.NewOption[byte](byte(proxyType)), transferCall)
if err != nil {
zap.S().Warnf("failed to new Proxy.proxy call, err: %v", err)
return nil
}
// Extrinsic
extrinsic = types.NewExtrinsic(call)
}
extrinsicByte, err := extrinsic.MarshalJSON()
if err != nil {
zap.S().Warnf("failed to unmarshal extrinsic, err: %v", err)
return nil
}
zap.S().Infof("singer: %v, real account: %v, extrinsic: %v\n", signer.Origin.Address, signer.RealAccountId.ToHexString(), FormatExtrinsic(extrinsicByte))
// 获取签名配置
options := service.GetSignatureOptions(signer.Origin.PublicKey)
if options == nil {
return nil
}
// 对交易体签名
err = extrinsic.Sign(signer.Origin, *options)
if err != nil {
zap.S().Warnf("failed to sign extrinsic, err: %v", err)
return nil
}
// 提交交易并返回交易哈希
txHash, err := service.Api.RPC.Author.SubmitExtrinsic(extrinsic)
if err != nil {
zap.S().Warnf("failed to submit extrinsic, err: %v", err)
return nil
}
return &txHash
}
// 从助记词派生出密钥对
keypair, err := signature.KeyringPairFromSecret(mnemonic+derivationPath, uint16(networkId))
if err != nil {
zap.S().Warnf("failed to derive key pair: %v", err)
return nil
}