以太坊智能合约地址生成之CREATE2指令

本文深入探讨了Create2合约地址生成的实现细节,通过Go语言代码示例,详细解释了如何根据发送者地址、盐值及字节码生成特定的智能合约地址,并提供了丰富的测试用例验证算法正确性。

承接上篇,不多做介绍,直接上代码:

func Create2ContractAddr(sendAddr string, salt string, byteCode []byte) (string,error) {
	//keccak256( 0xff ++ sendAddr ++ salt ++ keccak256(byteCode))[12:]
	var (
		data []byte
		err error
		buf []byte
	)

	data = append(data, byte(0xff))

	if buf, err = hex.DecodeString(sendAddr); err != nil {
		return "",err
	}
	data = append(data, buf...)

	if buf, err = hex.DecodeString(salt); err != nil {
		return "",err
	}
	data = append(data, buf...)

	buf = Keccak256Hash(byteCode)
	data = append(data, buf...)

	buf = Keccak256Hash(data)
	return hex.EncodeToString(buf[12:]),nil
}

下面是丰富的测试用例:

//测试用例来自https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1014.md
func TestCreate2ContractAddr(t *testing.T) {
	var testcases = []struct {
		sender string
		salt string
		byteCode []byte
		want string
	} {
		{
			"0000000000000000000000000000000000000000",
			"0000000000000000000000000000000000000000000000000000000000000000",
			[]byte{0x00},
			"4d1a2e2bb4f88f0250f26ffff098b0b30b26bf38",
		},
		{
			"deadbeef00000000000000000000000000000000",
			"0000000000000000000000000000000000000000000000000000000000000000",
			[]byte{0x00},
			"b928f69bb1d91cd65274e3c79d8986362984fda3",
		},
		{
			"deadbeef00000000000000000000000000000000",
			"000000000000000000000000feed000000000000000000000000000000000000",
			[]byte{0x00},
			"d04116cdd17bebe565eb2422f2497e06cc1c9833",
		},
		{
			"0000000000000000000000000000000000000000",
			"0000000000000000000000000000000000000000000000000000000000000000",
			[]byte{0xde,0xad,0xbe,0xef},//deadbeef
			"70f2b2914a2a4b783faefb75f459a580616fcb5e",
		},
		{
			"00000000000000000000000000000000deadbeef",
			"00000000000000000000000000000000000000000000000000000000cafebabe",
			[]byte{0xde,0xad,0xbe,0xef},//deadbeef
			"60f3f640a8508fc6a86d45df051962668e1e8ac7",
		},
		{
			"00000000000000000000000000000000deadbeef",
			"00000000000000000000000000000000000000000000000000000000cafebabe",
			[]byte{0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef},
			"1d8bfdc5d46dc4f61d6b6115972536ebe6a8854c",
		},
		{
			"0000000000000000000000000000000000000000",
			"0000000000000000000000000000000000000000000000000000000000000000",
			[]byte{},
			"e33c0c7f7df4809055c3eba6c09cfe4baf1bd9e0",
		},
	}
	for _, oneCase := range testcases {
		var got string
		var err error
		if got, err = Create2ContractAddr(oneCase.sender, oneCase.salt, oneCase.byteCode); err != nil {
			t.Error(err)
			return
		}

		if got != oneCase.want {
			t.Error("generate contract address error")
			t.Error("want:", oneCase.want)
			t.Error("got: ", got)
			return
		}
	}
}

(全文完)

参考资料:

https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1014.md

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值