1、int类型、address、string进行打包:
import (
"encoding/hex"
"github.com/ethereum/go-ethereum/accounts/abi"
)
...
addressTy, _ := abi.NewType("address", "string", []abi.ArgumentMarshaling{})
bytesTy, _ := abi.NewType("bytes", "string", nil)
uint256Ty, _ := abi.NewType("uint256", "uint64", []abi.ArgumentMarshaling{})
args := abi.Arguments{
{Type: addressTy},
{Type: bytesTy},
{Type: uint256Ty}
}
//尤其注意这里,当string转bytes的时候一定要用hex.DecodeString进行16进制转bytes
_params2, _ := hex.DecodeString(params2)
packed, err := args.Pack(
common.HexToAddress(params1),
_params2,
big.NewInt(_params3)
)
...
argPacked := hexutil.Encode(packed)
2、结构体数组的打包;
import (
"encoding/hex"
"github.com/ethereum/go-ethereum/accounts/abi"
)
...
type Transaction struct {
To common.Address `json:"to"`
Value *big.Int `json:"value"`
Data []byte `json:"data"`
}
...
//golang数组的打包,在生成新类型的时候,中括号"[]"应该在类型名的后边
structTy, _ := abi.NewType("tuple[]", "struct ty", []abi.ArgumentMarshaling{
{Name: "params1", Type: "address"},
{Name: "params2", Type: "uint256"},
{Name: "params3", Type: "bytes"},
})
args := abi.Arguments{
{Type: structTy},
}
_params3, _ := hex.DecodeString(params3)
transactions := []Transaction{
{
common.HexToAddress(params1),
big.NewInt(params2),
params3
}
}
packed, err := args.Pack(
transactions,
)
argPacked := hexutil.Encode(packed)