使用Go进行转换string至solidity中的bytes32

背景

  1. 在合约中使用了bytes32进行默克尔书的proof的数组
  2. 业务系统使用了golang进行储存中心化的凭证数据

实现

  1. 合约接收
1
2
3
4
5
function setMerkleRoot(uint256 treeid,bytes32 newRoot_) external onlyOwner {
//...
 _trees = newRoot_;
//...
}
  1. 此前错误的实现
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. 业务中进行编码
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
}

原因

  1. 输入root 字符串来自于别的业务系统,使用的默克尔树的签名产生的root字段生成为hash的模式,直接转换为byte会被合约解析为address(0)
  • 解析编码内容
  • 追溯原理