Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/cql-faucet/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ const (

var (
apiTimeout = time.Second * 10
regexAddress = regexp.MustCompile("^4[a-zA-Z0-9]{50}$")
regexAddress = regexp.MustCompile("^[a-zA-Z0-9]{64}$")
regexMediaURL = regexp.MustCompile("^(http|ftp|https)://([\\w\\-_]+(?:(?:\\.[\\w\\-_]+)+))([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?$")
regexApplicationID = regexp.MustCompile("^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[8|9|aA|bB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$")
)
Expand Down
22 changes: 0 additions & 22 deletions cmd/cql-faucet/verifier.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,28 +234,6 @@ func (v *Verifier) dispenseOne(r *applicationRecord) (err error) {

// decode target account address
var targetAddress proto.AccountAddress
var addrVersion byte
if addrVersion, targetAddress, err = crypto.Addr2Hash(r.address); err != nil || addrVersion != crypto.TestNet {
if err == nil && addrVersion != crypto.TestNet {
err = ErrInvalidAddress
}

// log error
log.WithError(err).Warning("decode transfer target address failed")

// mark failed
r.failReason = err.Error()
r.state = StateFailed
if err = v.p.updateRecord(r); err != nil {
return
}

log.WithFields(log.Fields(r.asMap())).Info("dispensed application record failed")

// skip invalid address faucet application
err = nil
return
}

req := &pt.AddTxReq{}
resp := &pt.AddTxResp{}
Expand Down
17 changes: 2 additions & 15 deletions cmd/cql-utils/addrgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package main

import (
"encoding/hex"
"flag"
"fmt"
"os"

Expand All @@ -28,14 +27,6 @@ import (
"github.com/CovenantSQL/CovenantSQL/utils/log"
)

var (
isTestNetAddr bool
)

func init() {
flag.BoolVar(&isTestNetAddr, "addrgen", false, "addrgen generates a testnet address from your key pair")
}

func runAddrgen() {
var publicKey *asymmetric.PublicKey

Expand Down Expand Up @@ -68,10 +59,6 @@ func runAddrgen() {
if err != nil {
log.WithError(err).Fatal("unexpected error")
}
addr, err := crypto.PubKey2Addr(publicKey, crypto.TestNet)
if err != nil {
log.WithError(err).Fatal("unexpected error")
}
fmt.Printf("wallet address hash: %s\n", keyHash.String())
fmt.Printf("wallet address: %s\n", addr)

fmt.Printf("wallet address: %s\n", keyHash.String())
}
42 changes: 2 additions & 40 deletions crypto/address.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,32 +17,13 @@
package crypto

import (
"github.com/pkg/errors"

"github.com/CovenantSQL/CovenantSQL/crypto/asymmetric"
"github.com/CovenantSQL/CovenantSQL/crypto/hash"
"github.com/CovenantSQL/CovenantSQL/proto"
"github.com/btcsuite/btcutil/base58"
"github.com/pkg/errors"
)

const (
// MainNet is the version byte for main net.
MainNet byte = 0x0
// TestNet is the version byte for test net.
TestNet byte = 0x6f
)

// PubKey2Addr converts the pubKey to a address
// and the format refers to https://bitcoin.org/en/developer-guide#standard-transactions
func PubKey2Addr(pubKey *asymmetric.PublicKey, version byte) (addr string, err error) {
var internalAddr proto.AccountAddress
if internalAddr, err = PubKeyHash(pubKey); err != nil {
return
}

addr = Hash2Addr(internalAddr, version)
return
}

// PubKeyHash generates the account hash address for specified public key.
func PubKeyHash(pubKey *asymmetric.PublicKey) (addr proto.AccountAddress, err error) {
if pubKey == nil {
Expand All @@ -58,22 +39,3 @@ func PubKeyHash(pubKey *asymmetric.PublicKey) (addr proto.AccountAddress, err er
addr = proto.AccountAddress(hash.THashH(enc))
return
}

// Addr2Hash converts base58 address to internal account address hash.
func Addr2Hash(addr string) (version byte, internalAddr proto.AccountAddress, err error) {
var hashBytes []byte
if hashBytes, version, err = base58.CheckDecode(addr); err != nil {
return
}
var h *hash.Hash
if h, err = hash.NewHash(hashBytes); err != nil {
return
}
internalAddr = proto.AccountAddress(*h)
return
}

// Hash2Addr converts interal account address hash to base58 format.
func Hash2Addr(addr proto.AccountAddress, version byte) string {
return base58.CheckEncode(addr[:], version)
}
77 changes: 19 additions & 58 deletions crypto/address_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,88 +17,49 @@
package crypto

import (
"encoding/base64"
"encoding/hex"
"testing"

"github.com/CovenantSQL/CovenantSQL/crypto/asymmetric"
"github.com/btcsuite/btcutil/base58"
. "github.com/smartystreets/goconvey/convey"

"github.com/CovenantSQL/CovenantSQL/crypto/asymmetric"
)

func TestPubKeyHashAndAddressing(t *testing.T) {
testPubkeyAndAddr := []struct {
pubkey string
addr string
nettype byte
pubkey string
addr string
}{
{
pubkey: "AwVygZRpvwCc+8SKnbwQrtlXPze7/hte0ksObyml37Gi",
addr: "1EcL9WYyB59jVLSX9kxFdfY53aDoWAKSFRkwwV2cvMMNCWj81J",
nettype: MainNet,
},
{
pubkey: "AwVygZRpvwCc+8SKnbwQrtlXPze7/hte0ksObyml37Gi",
addr: "4j1EutL6ZQ9HhYqj9Ves8EDVihvvxfhWnCHi2ZqXxf6Q9GK45v5",
nettype: TestNet,
pubkey: "0367aa51809a7c1dc0f82c02452fec9557b3e1d10ce7c919d8e73d90048df86d20",
addr: "ba0ba731c7a76ccef2c1170f42038f7e228dfb474ef0190dfe35d9a37911ed37",
},
{
pubkey: "Aua4icZ7gvBbzw4MDkGvFOEXG88lY4IJccigDQRghj1c",
addr: "12HRffwitkFR4ooMu6x5EAnHscKyftfuTZnTc3ciYmoSh9HxMY5",
nettype: MainNet,
pubkey: "02914bca0806f040dd842207c44474ab41ecd29deee7f2d355789c5c78d448ca16",
addr: "1a7b0959bbd0d0ec529278a61c0056c277bffe75b2646e1699b46b10a90210be",
},
{
pubkey: "Aua4icZ7gvBbzw4MDkGvFOEXG88lY4IJccigDQRghj1c",
addr: "4k44FQmGUyKZ2sJeXSqz6mLFXGggq4D6oWeQgfyDtWYVUDQS2bj",
nettype: TestNet,
pubkey: "02ec784ca599f21ef93fe7abdc68d78817ab6c9b31f2324d15ea174d9da498b4c4",
addr: "9e1618775cceeb19f110e04fbc6c5bca6c8e4e9b116e193a42fe69bf602e7bcd",
},
{
pubkey: "An/n4w2Lb3QYPzpQjAlADcK14LnwDbkl21gdasuwND1a",
addr: "1FinCZcguUux4fxM5dJuuGCUNRTw49Dx26KnAzA8Kh4djuHeH2",
nettype: MainNet,
pubkey: "03ae859eac5b72ee428c7a85f10b2ce748d9de5e480aefbb70f6597dfa8b2175e5",
addr: "9235bc4130a2ed4e6c35ea189dab35198ebb105640bedb97dd5269cc80863b16",
},
{
pubkey: "An/n4w2Lb3QYPzpQjAlADcK14LnwDbkl21gdasuwND1a",
addr: "4j2MMwPAH8Z3v8BEyRXDnVpA82nB6DgRHxxGroLfU4S7Qk5k9vQ",
nettype: TestNet,
pubkey: "02c1db96f2ba7e1cb4e9822d12de0f63fb666feb828c7f509e81fab9bd7a34039c",
addr: "58aceaf4b730b54bf00c0fb3f7b14886de470767f313c2d108968cd8bf0794b7",
},
}

Convey("Test the public key and address", t, func() {
for i := range testPubkeyAndAddr {
pubByte, err := base64.StdEncoding.DecodeString(testPubkeyAndAddr[i].pubkey)
So(err, ShouldBeNil)
pub, err := asymmetric.ParsePubKey(pubByte)
addr, err := PubKey2Addr(pub, testPubkeyAndAddr[i].nettype)
So(addr, ShouldEqual, testPubkeyAndAddr[i].addr)
}
})

Convey("Randomly generate some key pairs and calculate public key hash values", t, func() {
for i := 0; i < 20; i++ {
_, pub, err := asymmetric.GenSecp256k1KeyPair()
So(err, ShouldBeNil)
h, err := PubKeyHash(pub)
So(err, ShouldBeNil)
addr, err := PubKey2Addr(pub, MainNet)
So(err, ShouldBeNil)
targetAddr := base58.CheckEncode(h[:], MainNet)
So(addr, ShouldEqual, targetAddr)
t.Logf("main net address: %s", targetAddr)

addr, err = PubKey2Addr(pub, TestNet)
pubByte, err := hex.DecodeString(testPubkeyAndAddr[i].pubkey)
So(err, ShouldBeNil)
targetAddr = base58.CheckEncode(h[:], TestNet)
pub, _ := asymmetric.ParsePubKey(pubByte)
addr, err := PubKeyHash(pub)
So(addr.String(), ShouldEqual, testPubkeyAndAddr[i].addr)
So(err, ShouldBeNil)
t.Logf("test net address: %s", targetAddr)
}
})

Convey("Test Hash/Addr bi-directional convert", t, func() {
version, internalAddr, err := Addr2Hash("4j2MMwPAH8Z3v8BEyRXDnVpA82nB6DgRHxxGroLfU4S7Qk5k9vQ")
So(version, ShouldEqual, TestNet)
So(err, ShouldBeNil)

addr := Hash2Addr(internalAddr, MainNet)
So(addr, ShouldEqual, "1FinCZcguUux4fxM5dJuuGCUNRTw49Dx26KnAzA8Kh4djuHeH2")
})
}