# Golang实现solidity的abi.encodePack方法

By [daxiong](https://paragraph.com/@daxiong) · 2022-10-05

---

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)

---

*Originally published on [daxiong](https://paragraph.com/@daxiong/golang-solidity-abi-encodepack)*
