core/types: don't use Address zero value for invalid addresses
This commit is contained in:
		
							parent
							
								
									d5de6489d7
								
							
						
					
					
						commit
						e91ab84dbe
					
				| @ -2,6 +2,7 @@ package types | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"math/big" | ||||
| @ -21,19 +22,19 @@ type Transaction struct { | ||||
| 	AccountNonce uint64 | ||||
| 	Price        *big.Int | ||||
| 	GasLimit     *big.Int | ||||
| 	Recipient    common.Address | ||||
| 	Recipient    *common.Address // nil means contract creation
 | ||||
| 	Amount       *big.Int | ||||
| 	Payload      []byte | ||||
| 	V            byte | ||||
| 	R, S         []byte | ||||
| } | ||||
| 
 | ||||
| func NewContractCreationTx(amount, gasAmount, price *big.Int, data []byte) *Transaction { | ||||
| 	return NewTransactionMessage(common.Address{}, amount, gasAmount, price, data) | ||||
| func NewContractCreationTx(amount, gasLimit, gasPrice *big.Int, data []byte) *Transaction { | ||||
| 	return &Transaction{Recipient: nil, Amount: amount, GasLimit: gasLimit, Price: gasPrice, Payload: data} | ||||
| } | ||||
| 
 | ||||
| func NewTransactionMessage(to common.Address, amount, gasAmount, price *big.Int, data []byte) *Transaction { | ||||
| 	return &Transaction{Recipient: to, Amount: amount, Price: price, GasLimit: gasAmount, Payload: data} | ||||
| func NewTransactionMessage(to common.Address, amount, gasAmount, gasPrice *big.Int, data []byte) *Transaction { | ||||
| 	return &Transaction{Recipient: &to, Amount: amount, GasLimit: gasAmount, Price: gasPrice, Payload: data} | ||||
| } | ||||
| 
 | ||||
| func NewTransactionFromBytes(data []byte) *Transaction { | ||||
| @ -73,12 +74,21 @@ func (self *Transaction) SetNonce(AccountNonce uint64) { | ||||
| 	self.AccountNonce = AccountNonce | ||||
| } | ||||
| 
 | ||||
| func (self *Transaction) From() common.Address { | ||||
| 	return self.sender() | ||||
| 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") | ||||
| 	} | ||||
| 	var addr common.Address | ||||
| 	copy(addr[:], crypto.Sha3(pubkey[1:])) | ||||
| 	return addr, nil | ||||
| } | ||||
| 
 | ||||
| func (self *Transaction) To() common.Address { | ||||
| 	return self.Recipient | ||||
| // To returns the recipient of the transaction.
 | ||||
| // If transaction is a contract creation (with no recipient address)
 | ||||
| // To returns nil.
 | ||||
| func (tx *Transaction) To() *common.Address { | ||||
| 	return tx.Recipient | ||||
| } | ||||
| 
 | ||||
| func (tx *Transaction) Curve() (v byte, r []byte, s []byte) { | ||||
| @ -105,18 +115,6 @@ func (tx *Transaction) PublicKey() []byte { | ||||
| 	return pubkey | ||||
| } | ||||
| 
 | ||||
| func (tx *Transaction) sender() (a common.Address) { | ||||
| 	pubkey := tx.PublicKey() | ||||
| 
 | ||||
| 	// Validate the returned key.
 | ||||
| 	// Return nil if public key isn't in full format
 | ||||
| 	if len(pubkey) == 0 || pubkey[0] != 4 { | ||||
| 		return a | ||||
| 	} | ||||
| 	copy(a[:], crypto.Sha3(pubkey[1:])) | ||||
| 	return a | ||||
| } | ||||
| 
 | ||||
| func (tx *Transaction) SetSignatureValues(sig []byte) error { | ||||
| 	tx.R = sig[:32] | ||||
| 	tx.S = sig[32:64] | ||||
| @ -149,11 +147,22 @@ func (tx *Transaction) RlpEncode() []byte { | ||||
| } | ||||
| 
 | ||||
| func (tx *Transaction) String() string { | ||||
| 	var from, to string | ||||
| 	if f, err := tx.From(); err != nil { | ||||
| 		from = "[invalid sender]" | ||||
| 	} else { | ||||
| 		from = fmt.Sprintf("%x", f[:]) | ||||
| 	} | ||||
| 	if t := tx.To(); t == nil { | ||||
| 		to = "[contract creation]" | ||||
| 	} else { | ||||
| 		to = fmt.Sprintf("%x", t[:]) | ||||
| 	} | ||||
| 	return fmt.Sprintf(` | ||||
| 	TX(%x) | ||||
| 	Contract: %v | ||||
| 	From:     %x | ||||
| 	To:       %x | ||||
| 	From:     %s | ||||
| 	To:       %s | ||||
| 	Nonce:    %v | ||||
| 	GasPrice: %v | ||||
| 	GasLimit  %v | ||||
| @ -166,8 +175,8 @@ func (tx *Transaction) String() string { | ||||
| `, | ||||
| 		tx.Hash(), | ||||
| 		len(tx.Recipient) == 0, | ||||
| 		tx.From(), | ||||
| 		tx.To(), | ||||
| 		from, | ||||
| 		to, | ||||
| 		tx.AccountNonce, | ||||
| 		tx.Price, | ||||
| 		tx.GasLimit, | ||||
|  | ||||
| @ -19,8 +19,9 @@ var ( | ||||
| 		nil, | ||||
| 	) | ||||
| 
 | ||||
| 	rightvrsTx = &Transaction{ | ||||
| 		Recipient:    common.HexToAddress("b94f5374fce5edbc8e2a8697c15331677e6ebf0b"), | ||||
| 	rightvrsRecipient = common.HexToAddress("b94f5374fce5edbc8e2a8697c15331677e6ebf0b") | ||||
| 	rightvrsTx        = &Transaction{ | ||||
| 		Recipient:    &rightvrsRecipient, | ||||
| 		AccountNonce: 3, | ||||
| 		Price:        big.NewInt(1), | ||||
| 		GasLimit:     big.NewInt(2000), | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user