fixes `getRecipient`: using `sender` param instead of calculating sender itself

usually, there is always a sender around `getRecipient` call.
no need to recalculate sender. and more important, in some of
JSON-RPC/GraphQL call, the sender is come from `rpcCallData`,
not from `tx.getSender`. or in ohter situation when the tx is
an unsigned tx, without `r,s,v` fields to calculate sender.
This commit is contained in:
jangko 2021-05-04 13:27:18 +07:00
parent c46b7186ca
commit 39ce2390ae
No known key found for this signature in database
GPG Key ID: 31702AE10541E6B9
6 changed files with 16 additions and 15 deletions

View File

@ -109,7 +109,7 @@ proc traceTransaction*(chainDB: BaseChainDB, header: BlockHeader,
for idx, tx in body.transactions: for idx, tx in body.transactions:
let sender = tx.getSender let sender = tx.getSender
let recipient = tx.getRecipient let recipient = tx.getRecipient(sender)
if idx == txIndex: if idx == txIndex:
vmState.enableTracing() vmState.enableTracing()
@ -167,7 +167,7 @@ proc dumpBlockState*(db: BaseChainDB, header: BlockHeader, body: BlockBody, dump
for idx, tx in body.transactions: for idx, tx in body.transactions:
let sender = tx.getSender let sender = tx.getSender
let recipient = tx.getRecipient let recipient = tx.getRecipient(sender)
before.captureAccount(stateBefore, sender, senderName & $idx) before.captureAccount(stateBefore, sender, senderName & $idx)
before.captureAccount(stateBefore, recipient, recipientName & $idx) before.captureAccount(stateBefore, recipient, recipientName & $idx)
@ -182,7 +182,7 @@ proc dumpBlockState*(db: BaseChainDB, header: BlockHeader, body: BlockBody, dump
for idx, tx in body.transactions: for idx, tx in body.transactions:
let sender = tx.getSender let sender = tx.getSender
let recipient = tx.getRecipient let recipient = tx.getRecipient(sender)
after.captureAccount(stateAfter, sender, senderName & $idx) after.captureAccount(stateAfter, sender, senderName & $idx)
after.captureAccount(stateAfter, recipient, recipientName & $idx) after.captureAccount(stateAfter, recipient, recipientName & $idx)
vmState.removeTracedAccounts(sender, recipient) vmState.removeTracedAccounts(sender, recipient)

View File

@ -69,9 +69,8 @@ proc getSender*(transaction: Transaction): EthAddress =
if not transaction.getSender(result): if not transaction.getSender(result):
raise newException(ValidationError, "Could not derive sender address from transaction") raise newException(ValidationError, "Could not derive sender address from transaction")
proc getRecipient*(tx: Transaction): EthAddress = proc getRecipient*(tx: Transaction, sender: EthAddress): EthAddress =
if tx.isContractCreation: if tx.isContractCreation:
let sender = tx.getSender()
result = generateAddress(sender, tx.accountNonce) result = generateAddress(sender, tx.accountNonce)
else: else:
result = tx.to result = tx.to

View File

@ -165,7 +165,7 @@ proc txSetupComputation(tx: Transaction, sender: EthAddress, vmState: BaseVMStat
depth: 0, depth: 0,
gas: gas, gas: gas,
sender: sender, sender: sender,
contractAddress: tx.getRecipient(), contractAddress: tx.getRecipient(sender),
codeAddress: tx.to, codeAddress: tx.to,
value: tx.value, value: tx.value,
data: tx.payload data: tx.payload
@ -189,7 +189,7 @@ proc txInitialAccessListEIP2929(tx: Transaction, sender: EthAddress, vmState: Ba
# For contract creations the EVM will add the contract address to the # For contract creations the EVM will add the contract address to the
# access list itself, after calculating the new contract address. # access list itself, after calculating the new contract address.
if not tx.isContractCreation: if not tx.isContractCreation:
db.accessList(tx.getRecipient()) db.accessList(tx.getRecipient(sender))
for c in activePrecompiles(): for c in activePrecompiles():
db.accessList(c) db.accessList(c)

View File

@ -63,7 +63,7 @@ proc setupComputation*(vmState: BaseVMState, tx: Transaction, sender: EthAddress
depth: 0, depth: 0,
gas: gas, gas: gas,
sender: sender, sender: sender,
contractAddress: tx.getRecipient(), contractAddress: tx.getRecipient(sender),
codeAddress: tx.to, codeAddress: tx.to,
value: tx.value, value: tx.value,
data: tx.payload data: tx.payload

View File

@ -68,10 +68,11 @@ proc generatePremixData*(nimbus, geth: JsonNode) =
var data = "var premixData = " & premixData.pretty & "\n" var data = "var premixData = " & premixData.pretty & "\n"
writeFile(getFileDir("index.html") / "premixData.js", data) writeFile(getFileDir("index.html") / "premixData.js", data)
proc hasInternalTx(tx: Transaction, blockNumber: Uint256): bool = proc hasInternalTx(tx: Transaction, blockNumber: Uint256, sender: EthAddress): bool =
let let
number = %(blockNumber.prefixHex) number = %(blockNumber.prefixHex)
code = request("eth_getCode", %[%tx.getRecipient.prefixHex, number]) recipient = tx.getRecipient(sender)
code = request("eth_getCode", %[%recipient.prefixHex, number])
recipientHasCode = code.getStr.len > 2 # "0x" recipientHasCode = code.getStr.len > 2 # "0x"
if tx.isContractCreation: if tx.isContractCreation:
@ -146,16 +147,17 @@ proc requestPostState*(premix, n: JsonNode, blockNumber: Uint256) =
for t in txs: for t in txs:
var txKind = TxKind.Regular var txKind = TxKind.Regular
let tx = parseTransaction(t) let tx = parseTransaction(t)
let sender = tx.getSender
if tx.isContractCreation: txKind = TxKind.ContractCreation if tx.isContractCreation: txKind = TxKind.ContractCreation
if hasInternalTx(tx, blockNumber): if hasInternalTx(tx, blockNumber, sender):
let txTrace = requestInternalTx(t["hash"], tracer) let txTrace = requestInternalTx(t["hash"], tracer)
for address, account in txTrace: for address, account in txTrace:
updateAccount(address, account, blockNumber) updateAccount(address, account, blockNumber)
premix.add account premix.add account
if not tx.isContractCreation: txKind = TxKind.ContractCall if not tx.isContractCreation: txKind = TxKind.ContractCall
else: else:
premix.requestAccount(blockNumber, tx.getRecipient) premix.requestAccount(blockNumber, tx.getRecipient(sender))
premix.requestAccount(blockNumber, tx.getSender) premix.requestAccount(blockNumber, sender)
t["txKind"] = %($txKind) t["txKind"] = %($txKind)

View File

@ -60,7 +60,7 @@ proc dumpAccount(accountDb: ReadOnlyStateDB, address: EthAddress, name: string):
} }
proc dumpDebugData(tester: Tester, vmState: BaseVMState, sender: EthAddress, gasUsed: GasInt, success: bool) = proc dumpDebugData(tester: Tester, vmState: BaseVMState, sender: EthAddress, gasUsed: GasInt, success: bool) =
let recipient = tester.tx.getRecipient() let recipient = tester.tx.getRecipient(sender)
let miner = tester.header.coinbase let miner = tester.header.coinbase
var accounts = newJObject() var accounts = newJObject()