|
|
|
@ -8,7 +8,6 @@ import ( |
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
|
"github.com/ethereum/go-ethereum/crypto" |
|
|
|
|
"github.com/ethereum/go-ethereum/crypto/secp256k1" |
|
|
|
|
"github.com/ethereum/go-ethereum/logger" |
|
|
|
|
"github.com/ethereum/go-ethereum/logger/glog" |
|
|
|
|
"github.com/ethereum/go-ethereum/rlp" |
|
|
|
@ -93,9 +92,9 @@ func (self *Transaction) SetNonce(AccountNonce uint64) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *Transaction) From() (common.Address, error) { |
|
|
|
|
pubkey := self.PublicKey() |
|
|
|
|
if len(pubkey) == 0 || pubkey[0] != 4 { |
|
|
|
|
return common.Address{}, errors.New("invalid public key") |
|
|
|
|
pubkey, err := self.PublicKey() |
|
|
|
|
if err != nil { |
|
|
|
|
return common.Address{}, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var addr common.Address |
|
|
|
@ -110,34 +109,34 @@ func (tx *Transaction) To() *common.Address { |
|
|
|
|
return tx.Recipient |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (tx *Transaction) Curve() (v byte, r []byte, s []byte) { |
|
|
|
|
func (tx *Transaction) GetSignatureValues() (v byte, r []byte, s []byte) { |
|
|
|
|
v = byte(tx.V) |
|
|
|
|
r = common.LeftPadBytes(tx.R.Bytes(), 32) |
|
|
|
|
s = common.LeftPadBytes(tx.S.Bytes(), 32) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (tx *Transaction) Signature(key []byte) []byte { |
|
|
|
|
hash := tx.Hash() |
|
|
|
|
sig, _ := secp256k1.Sign(hash[:], key) |
|
|
|
|
return sig |
|
|
|
|
} |
|
|
|
|
func (tx *Transaction) PublicKey() ([]byte, error) { |
|
|
|
|
if !crypto.ValidateSignatureValues(tx.V, tx.R, tx.S) { |
|
|
|
|
return nil, errors.New("invalid v, r, s values") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (tx *Transaction) PublicKey() []byte { |
|
|
|
|
hash := tx.Hash() |
|
|
|
|
v, r, s := tx.Curve() |
|
|
|
|
v, r, s := tx.GetSignatureValues() |
|
|
|
|
sig := append(r, s...) |
|
|
|
|
sig = append(sig, v-27) |
|
|
|
|
|
|
|
|
|
//pubkey := crypto.Ecrecover(append(hash[:], sig...))
|
|
|
|
|
//pubkey, _ := secp256k1.RecoverPubkey(hash[:], sig)
|
|
|
|
|
p, err := crypto.SigToPub(hash[:], sig) |
|
|
|
|
if err != nil { |
|
|
|
|
glog.V(logger.Error).Infof("Could not get pubkey from signature: ", err) |
|
|
|
|
return nil |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pubkey := crypto.FromECDSAPub(p) |
|
|
|
|
return pubkey |
|
|
|
|
if len(pubkey) == 0 || pubkey[0] != 4 { |
|
|
|
|
return nil, errors.New("invalid public key") |
|
|
|
|
} |
|
|
|
|
return pubkey, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (tx *Transaction) SetSignatureValues(sig []byte) error { |
|
|
|
|