doupang9614
2018-06-09 09:29
浏览 2.5k
已采纳

如何在Golang中获得与solidity`abi.encodePacked`相同的返回值

How can i run abi.encodePacked in golang?

in solidity i use keccak256(abi.encodePacked(a, b)) to calc the signature of the params.

here is my contract.

pragma solidity ^0.4.24;

import "openzeppelin-solidity/contracts/ECRecovery.sol";


contract MyContract {
    using ECRecovery for bytes32;
    address permittedSinger;

    function doSomething(
    bytes32 id, uint256 amount, bytes sig
    ) {
        bytes32 hash = getHash(msg.sender, id, amount);
        address msgSigner = hash.recover(sig);
        require(msgSigner == permittedSinger);
    }

    function getMsgSigner(bytes32 proveHash, bytes sig) public pure returns (address) {
        return proveHash.recover(sig);
    }

    function getHash(
    address receiver, bytes32 id, uint256 amount
    ) pure returns (bytes32) {
        return keccak256(abi.encodePacked(receiver, id, amount));
    }
}

图片转代码服务由CSDN问答提供 功能建议

我如何运行abi.encodePacking in golang?

使用 keccak256(abi.encodePacked(a,b))计算参数的签名。

这是我的合同。 \ n

  pragma solidity ^ 0.4.24; 
 
import“ openzeppelin-solidity / contracts / ECRecovery.sol”; 
 
 
contract MyContract {
对字节数32使用ECRecovery; 
允许的地址歌手;  
 
函数doSomething(
 bytes32 id,uint256数量,字节sig 
){
 bytes32 hash = getHash(msg.sender,id,amount); 
地址msgSigner = hash.recover(sig); \  n require(msgSigner == allowedSinger); 
} 
 
函数getMsgSigner(bytes32provenHash,bytes sig)公共纯返回值(地址){
返回proviseHash.recover(sig); 
} 
 
函数 getHash(
地址接收者,bytes32 id,uint256数量
)纯返回(bytes32){
返回keccak256(abi.encodePacked(接收者,id,数量)); 
} 
} 
   
 
  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

  • dounong5373 2018-06-09 15:45
    最佳回答

    finally I managed to do it. :)

    package main
    
    import (
        "math/big"
        "github.com/ethereum/go-ethereum/common/hexutil"
        "github.com/ethereum/go-ethereum/accounts/abi"
        "log"
        "github.com/ethereum/go-ethereum/common"
        "github.com/ethereum/go-ethereum/crypto/sha3"
    )
    
    func main() {
        uint256Ty, _ := abi.NewType("uint256")
        bytes32Ty, _ := abi.NewType("bytes32")
        addressTy, _ := abi.NewType("address")
    
        arguments := abi.Arguments{
            {
                Type: addressTy,
            },
            {
                Type: bytes32Ty,
            },
            {
                Type: uint256Ty,
            },
        }
    
        bytes, _ := arguments.Pack(
            common.HexToAddress("0x0000000000000000000000000000000000000000"),
            [32]byte{'I','D','1'},
            big.NewInt(42),
        )
    
        var buf []byte
        hash := sha3.NewKeccak256()
        hash.Write(bytes)
        buf = hash.Sum(buf)
    
        log.Println(hexutil.Encode(buf))
        // output:
        // 0x1f214438d7c061ad56f98540db9a082d372df1ba9a3c96367f0103aa16c2fe9a
    }
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题