使用Go进行转换string至solidity中的bytes32 背景 在合约中使用了bytes32进行默克尔书的proof的数组 业务系统使用了golang进行储存中心化的凭证数据 实现 合约接收 1 2 3 4 5 function setMerkleRoot(uint256 treeid,bytes32 newRoot_) external onlyOwner { //... _trees = newRoot_; //... } 此前错误的实现 1 2 3 4 5 6 7 8 func (p *Promoter) SetRoot(root string, chainId int64) (string, error) { //.... value := [32]byte{} copy(value[:],root) setRoot, err := newPromoter.SetMerkleRoot(init,..., value) //... return setRoot.Hash().Hex(), nil } 业务中进行编码 1 2 3 4 5 6 7 8 func (p *Promoter) SetRoot(root string, chainId int64) (string, error) { //.... value := [32]byte{} copy(value[:], common.HexToHash(root).Bytes()) setRoot, err := newPromoter.SetMerkleRoot(init,..., value) //... return setRoot.Hash().Hex(), nil } 原因 输入root 字符串来自于别的业务系统,使用的默克尔树的签名产生的root字段生成为hash的模式,直接转换为byte会被合约解析为address(0) 解析编码内容 追溯原理