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
					
				| @ -268,27 +268,34 @@ func Transition(ctx *cli.Context) error { | ||||
| // txWithKey is a helper-struct, to allow us to use the types.Transaction along with
 | ||||
| // a `secretKey`-field, for input
 | ||||
| type txWithKey struct { | ||||
| 	key *ecdsa.PrivateKey | ||||
| 	tx  *types.Transaction | ||||
| 	key       *ecdsa.PrivateKey | ||||
| 	tx        *types.Transaction | ||||
| 	protected bool | ||||
| } | ||||
| 
 | ||||
| func (t *txWithKey) UnmarshalJSON(input []byte) error { | ||||
| 	// Read the secretKey, if present
 | ||||
| 	type sKey struct { | ||||
| 		Key *common.Hash `json:"secretKey"` | ||||
| 	// Read the metadata, if present
 | ||||
| 	type txMetadata struct { | ||||
| 		Key       *common.Hash `json:"secretKey"` | ||||
| 		Protected *bool        `json:"protected"` | ||||
| 	} | ||||
| 	var key sKey | ||||
| 	if err := json.Unmarshal(input, &key); err != nil { | ||||
| 	var data txMetadata | ||||
| 	if err := json.Unmarshal(input, &data); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if key.Key != nil { | ||||
| 		k := key.Key.Hex()[2:] | ||||
| 	if data.Key != nil { | ||||
| 		k := data.Key.Hex()[2:] | ||||
| 		if ecdsaKey, err := crypto.HexToECDSA(k); err != nil { | ||||
| 			return err | ||||
| 		} else { | ||||
| 			t.key = ecdsaKey | ||||
| 		} | ||||
| 	} | ||||
| 	if data.Protected != nil { | ||||
| 		t.protected = *data.Protected | ||||
| 	} else { | ||||
| 		t.protected = true | ||||
| 	} | ||||
| 	// Now, read the transaction itself
 | ||||
| 	var tx types.Transaction | ||||
| 	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() | ||||
| 		if key != nil && v.BitLen()+r.BitLen()+s.BitLen() == 0 { | ||||
| 			// 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 { | ||||
| 				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}, | ||||
| 			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"} | ||||
|  | ||||
							
								
								
									
										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