cmd/evm: add support for signing transactions in the unprotected format (#23937)
* cmd/evm: add support for signing transactions in the unprotected format * cmd/evm: simplify signing of unprotected txs
This commit is contained in:
		
							parent
							
								
									17f1c2dc0f
								
							
						
					
					
						commit
						23f69c6db0
					
				| @ -270,25 +270,32 @@ func Transition(ctx *cli.Context) error { | |||||||
| type txWithKey struct { | type txWithKey struct { | ||||||
| 	key       *ecdsa.PrivateKey | 	key       *ecdsa.PrivateKey | ||||||
| 	tx        *types.Transaction | 	tx        *types.Transaction | ||||||
|  | 	protected bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (t *txWithKey) UnmarshalJSON(input []byte) error { | func (t *txWithKey) UnmarshalJSON(input []byte) error { | ||||||
| 	// Read the secretKey, if present
 | 	// Read the metadata, if present
 | ||||||
| 	type sKey struct { | 	type txMetadata struct { | ||||||
| 		Key       *common.Hash `json:"secretKey"` | 		Key       *common.Hash `json:"secretKey"` | ||||||
|  | 		Protected *bool        `json:"protected"` | ||||||
| 	} | 	} | ||||||
| 	var key sKey | 	var data txMetadata | ||||||
| 	if err := json.Unmarshal(input, &key); err != nil { | 	if err := json.Unmarshal(input, &data); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if key.Key != nil { | 	if data.Key != nil { | ||||||
| 		k := key.Key.Hex()[2:] | 		k := data.Key.Hex()[2:] | ||||||
| 		if ecdsaKey, err := crypto.HexToECDSA(k); err != nil { | 		if ecdsaKey, err := crypto.HexToECDSA(k); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} else { | 		} else { | ||||||
| 			t.key = ecdsaKey | 			t.key = ecdsaKey | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	if data.Protected != nil { | ||||||
|  | 		t.protected = *data.Protected | ||||||
|  | 	} else { | ||||||
|  | 		t.protected = true | ||||||
|  | 	} | ||||||
| 	// Now, read the transaction itself
 | 	// Now, read the transaction itself
 | ||||||
| 	var tx types.Transaction | 	var tx types.Transaction | ||||||
| 	if err := json.Unmarshal(input, &tx); err != nil { | 	if err := json.Unmarshal(input, &tx); err != nil { | ||||||
| @ -317,7 +324,15 @@ func signUnsignedTransactions(txs []*txWithKey, signer types.Signer) (types.Tran | |||||||
| 		v, r, s := tx.RawSignatureValues() | 		v, r, s := tx.RawSignatureValues() | ||||||
| 		if key != nil && v.BitLen()+r.BitLen()+s.BitLen() == 0 { | 		if key != nil && v.BitLen()+r.BitLen()+s.BitLen() == 0 { | ||||||
| 			// This transaction needs to be signed
 | 			// This transaction needs to be signed
 | ||||||
| 			signed, err := types.SignTx(tx, signer, key) | 			var ( | ||||||
|  | 				signed *types.Transaction | ||||||
|  | 				err    error | ||||||
|  | 			) | ||||||
|  | 			if txWithKey.protected { | ||||||
|  | 				signed, err = types.SignTx(tx, signer, key) | ||||||
|  | 			} else { | ||||||
|  | 				signed, err = types.SignTx(tx, types.FrontierSigner{}, key) | ||||||
|  | 			} | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return nil, NewError(ErrorJson, fmt.Errorf("tx %d: failed to sign tx: %v", i, err)) | 				return nil, NewError(ErrorJson, fmt.Errorf("tx %d: failed to sign tx: %v", i, err)) | ||||||
| 			} | 			} | ||||||
|  | |||||||
| @ -195,6 +195,14 @@ func TestT8n(t *testing.T) { | |||||||
| 			output: t8nOutput{result: true}, | 			output: t8nOutput{result: true}, | ||||||
| 			expOut: "exp_arrowglacier.json", | 			expOut: "exp_arrowglacier.json", | ||||||
| 		}, | 		}, | ||||||
|  | 		{ // Sign unprotected (pre-EIP155) transaction
 | ||||||
|  | 			base: "./testdata/23", | ||||||
|  | 			input: t8nInput{ | ||||||
|  | 				"alloc.json", "txs.json", "env.json", "Berlin", "", | ||||||
|  | 			}, | ||||||
|  | 			output: t8nOutput{result: true}, | ||||||
|  | 			expOut: "exp.json", | ||||||
|  | 		}, | ||||||
| 	} { | 	} { | ||||||
| 
 | 
 | ||||||
| 		args := []string{"t8n"} | 		args := []string{"t8n"} | ||||||
|  | |||||||
							
								
								
									
										16
									
								
								cmd/evm/testdata/23/alloc.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								cmd/evm/testdata/23/alloc.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | { | ||||||
|  |   "0x095e7baea6a6c7c4c2dfeb977efac326af552d87" : { | ||||||
|  |     "balance" : "0x0de0b6b3a7640000", | ||||||
|  |     "code" : "0x6001", | ||||||
|  |     "nonce" : "0x00", | ||||||
|  |     "storage" : { | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { | ||||||
|  |     "balance" : "0x0de0b6b3a7640000", | ||||||
|  |     "code" : "0x", | ||||||
|  |     "nonce" : "0x00", | ||||||
|  |     "storage" : { | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										7
									
								
								cmd/evm/testdata/23/env.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								cmd/evm/testdata/23/env.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | { | ||||||
|  |   "currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", | ||||||
|  |   "currentDifficulty" : "0x020000", | ||||||
|  |   "currentGasLimit" : "0x3b9aca00", | ||||||
|  |   "currentNumber" : "0x05", | ||||||
|  |   "currentTimestamp" : "0x03e8" | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								cmd/evm/testdata/23/exp.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								cmd/evm/testdata/23/exp.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | { | ||||||
|  |   "result": { | ||||||
|  |     "stateRoot": "0x65334305e4accfa18352deb24f007b837b5036425b0712cf0e65a43bfa95154d", | ||||||
|  |     "txRoot": "0x75e61774a2ff58cbe32653420256c7f44bc715715a423b0b746d5c622979af6b", | ||||||
|  |     "receiptsRoot": "0xf951f9396af203499cc7d379715a9110323de73967c5700e2f424725446a3c76", | ||||||
|  |     "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", | ||||||
|  |     "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", | ||||||
|  |     "receipts": [ | ||||||
|  |       { | ||||||
|  |         "root": "0x", | ||||||
|  |         "status": "0x1", | ||||||
|  |         "cumulativeGasUsed": "0x520b", | ||||||
|  |         "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", | ||||||
|  |         "logs": null, | ||||||
|  |         "transactionHash": "0x72fadbef39cd251a437eea619cfeda752271a5faaaa2147df012e112159ffb81", | ||||||
|  |         "contractAddress": "0x0000000000000000000000000000000000000000", | ||||||
|  |         "gasUsed": "0x520b", | ||||||
|  |         "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", | ||||||
|  |         "transactionIndex": "0x0" | ||||||
|  |       } | ||||||
|  |     ], | ||||||
|  |     "currentDifficulty": "0x20000", | ||||||
|  |     "gasUsed": "0x520b" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								cmd/evm/testdata/23/readme.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								cmd/evm/testdata/23/readme.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | These files examplify how to sign a transaction using the pre-EIP155 scheme.  | ||||||
							
								
								
									
										15
									
								
								cmd/evm/testdata/23/txs.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								cmd/evm/testdata/23/txs.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | [ | ||||||
|  |   { | ||||||
|  |     "input" : "0x", | ||||||
|  |     "gas" : "0x5f5e100", | ||||||
|  |     "gasPrice" : "0x1", | ||||||
|  |     "nonce" : "0x0", | ||||||
|  |     "to" : "0x095e7baea6a6c7c4c2dfeb977efac326af552d87", | ||||||
|  |     "value" : "0x186a0", | ||||||
|  |     "v" : "0x0", | ||||||
|  |     "r" : "0x0", | ||||||
|  |     "s" : "0x0", | ||||||
|  |     "secretKey" : "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", | ||||||
|  |     "protected": false | ||||||
|  |   } | ||||||
|  | ] | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user