Skip to content

Commit 3a3af20

Browse files
bysomeonevipwzw
authored andcommitted
[[FIX]] add address key format fork
1 parent 3a9604d commit 3a3af20

File tree

8 files changed

+39
-8
lines changed

8 files changed

+39
-8
lines changed

common/address/driver.go

+2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ type Driver interface {
4040
FromString(addr string) ([]byte, error)
4141
// ToString encode to string
4242
ToString(addr []byte) string
43+
// FormatAddr to unified format
44+
FormatAddr(addr string) string
4345
}
4446

4547
// DriverInfo driver info

common/address/driver_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ func (m *mockDriver) ToString([]byte) string { return "" }
4848

4949
func (m *mockDriver) FromString(string) ([]byte, error) { return nil, nil }
5050

51+
func (m *mockDriver) FormatAddr(addr string) string { return "" }
52+
5153
func Test_RegisterDriver(t *testing.T) {
5254

5355
m := &mockDriver{}

common/address/util.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import (
66
"github.com/ethereum/go-ethereum/common"
77
)
88

9+
// ForkFormatAddressKey 地址key格式化分叉名称,主要针对eth地址
10+
const ForkFormatAddressKey = "ForkFormatAddressKey"
11+
912
// IsEthAddress verifies whether a string can represent
1013
// a valid hex-encoded eth address
1114
func IsEthAddress(addr string) bool {
@@ -19,9 +22,11 @@ func ToLower(addr string) string {
1922

2023
// FormatAddrKey format addr as db key
2124
func FormatAddrKey(addr string) []byte {
25+
2226
// eth地址有大小写区分, 统一采用小写格式key存储(#1245)
2327
if IsEthAddress(addr) {
24-
addr = ToLower(addr)
28+
ethDriver, _ := LoadDriver(2, -1)
29+
addr = ethDriver.FormatAddr(addr)
2530
}
2631

2732
return []byte(addr)

rpc/types/types.go

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ package types
77

88
import (
99
"encoding/json"
10+
11+
_ "github.com/33cn/chain33/system/address"
1012
)
1113

1214
// TransParm transport parameter

system/address/btc/address.go

+4
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ func (b *btc) FromString(addr string) ([]byte, error) {
7777
return decodeFromString(address.NormalVer, addr)
7878
}
7979

80+
func (b *btc) FormatAddr(addr string) string { return addr }
81+
8082
type btcMultiSign struct{}
8183

8284
// PubKeyToAddr public key to address
@@ -111,6 +113,8 @@ func (b *btcMultiSign) FromString(addr string) ([]byte, error) {
111113
return decodeFromString(address.MultiSignVer, addr)
112114
}
113115

116+
func (b *btcMultiSign) FormatAddr(addr string) string { return addr }
117+
114118
func encodeToString(version byte, raw []byte) string {
115119
var ad [25]byte
116120
ad[0] = version

system/address/eth/address.go

+21-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package eth
33
import (
44
"errors"
55

6+
"github.com/33cn/chain33/common/crypto/client"
7+
68
"github.com/33cn/chain33/common/address"
79
"github.com/ethereum/go-ethereum/common"
810
"github.com/ethereum/go-ethereum/crypto"
@@ -41,7 +43,7 @@ func (e *eth) PubKeyToAddr(pubKey []byte) string {
4143
if value, ok := addrCache.Get(pubStr); ok {
4244
return value.(string)
4345
}
44-
addr := PubKey2EthAddr(pubKey)
46+
addr := pubKey2EthAddr(pubKey)
4547
addrCache.Add(pubStr, addr)
4648
return addr
4749
}
@@ -61,7 +63,7 @@ func (e *eth) GetName() string {
6163

6264
// ToString trans to string format
6365
func (e *eth) ToString(addr []byte) string {
64-
return address.ToLower(common.BytesToAddress(addr).String())
66+
return formatAddr(common.BytesToAddress(addr).String())
6567
}
6668

6769
// FromString trans to byte format
@@ -72,16 +74,29 @@ func (e *eth) FromString(addr string) ([]byte, error) {
7274
return common.HexToAddress(addr).Bytes(), nil
7375
}
7476

75-
// PubKey2EthAddr format eth addr
76-
func PubKey2EthAddr(pubKey []byte) string {
77+
func (e *eth) FormatAddr(addr string) string {
78+
79+
return formatAddr(addr)
80+
}
81+
82+
func formatAddr(addr string) string {
83+
ctx := client.GetCryptoContext()
84+
if ctx.API == nil || ctx.API.GetConfig().IsFork(ctx.CurrBlockHeight, address.ForkFormatAddressKey) {
85+
return address.ToLower(addr)
86+
}
87+
return addr
88+
}
89+
90+
// pubKey2EthAddr format eth addr
91+
func pubKey2EthAddr(pubKey []byte) string {
7792

7893
pub, err := crypto.DecompressPubkey(pubKey)
7994
// ecdsa public key, compatible with ethereum, get address from eth api
8095
if err == nil {
81-
return address.ToLower(crypto.PubkeyToAddress(*pub).String())
96+
return formatAddr(crypto.PubkeyToAddress(*pub).String())
8297
}
8398
// just format as eth address if pubkey not compatible
8499
var a common.Address
85100
a.SetBytes(crypto.Keccak256(pubKey[1:])[12:])
86-
return address.ToLower(a.String())
101+
return formatAddr(a.String())
87102
}

types/fork.go

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package types
66

77
import (
8+
"github.com/33cn/chain33/common/address"
89
"strings"
910
)
1011

@@ -139,6 +140,7 @@ func (f *Forks) SetTestNetFork() {
139140
f.SetFork("ForkCacheDriver", 2580000)
140141
f.SetFork("ForkTicketFundAddrV1", 3350000)
141142
f.SetFork("ForkRootHash", 4500000)
143+
f.SetFork(address.ForkFormatAddressKey, 0)
142144
}
143145

144146
func (f *Forks) setLocalFork() {

types/types.go

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"github.com/golang/protobuf/proto"
2626

2727
// 注册system的crypto 加密算法
28-
_ "github.com/33cn/chain33/system/address"
2928
_ "github.com/33cn/chain33/system/crypto/init"
3029
)
3130

0 commit comments

Comments
 (0)