Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
d6da4342
Commit
d6da4342
authored
Sep 13, 2021
by
George Hotz
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
further
parent
ffaa1784
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
656 additions
and
2 deletions
+656
-2
error.go
minigeth/core/error.go
+93
-0
evm.go
minigeth/core/evm.go
+119
-0
gaspool.go
minigeth/core/gaspool.go
+54
-0
state_processor.go
minigeth/core/state_processor.go
+4
-2
state_transition.go
minigeth/core/state_transition.go
+365
-0
interpreter.go
minigeth/core/vm/interpreter.go
+21
-0
No files found.
minigeth/core/error.go
0 → 100644
View file @
d6da4342
// Copyright 2014 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
package
core
import
(
"errors"
"github.com/ethereum/go-ethereum/core/types"
)
var
(
// ErrKnownBlock is returned when a block to import is already known locally.
ErrKnownBlock
=
errors
.
New
(
"block already known"
)
// ErrBannedHash is returned if a block to import is on the banned list.
ErrBannedHash
=
errors
.
New
(
"banned hash"
)
// ErrNoGenesis is returned when there is no Genesis Block.
ErrNoGenesis
=
errors
.
New
(
"genesis not found in chain"
)
)
// List of evm-call-message pre-checking errors. All state transition messages will
// be pre-checked before execution. If any invalidation detected, the corresponding
// error should be returned which is defined here.
//
// - If the pre-checking happens in the miner, then the transaction won't be packed.
// - If the pre-checking happens in the block processing procedure, then a "BAD BLOCk"
// error should be emitted.
var
(
// ErrNonceTooLow is returned if the nonce of a transaction is lower than the
// one present in the local chain.
ErrNonceTooLow
=
errors
.
New
(
"nonce too low"
)
// ErrNonceTooHigh is returned if the nonce of a transaction is higher than the
// next one expected based on the local chain.
ErrNonceTooHigh
=
errors
.
New
(
"nonce too high"
)
// ErrGasLimitReached is returned by the gas pool if the amount of gas required
// by a transaction is higher than what's left in the block.
ErrGasLimitReached
=
errors
.
New
(
"gas limit reached"
)
// ErrInsufficientFundsForTransfer is returned if the transaction sender doesn't
// have enough funds for transfer(topmost call only).
ErrInsufficientFundsForTransfer
=
errors
.
New
(
"insufficient funds for transfer"
)
// ErrInsufficientFunds is returned if the total cost of executing a transaction
// is higher than the balance of the user's account.
ErrInsufficientFunds
=
errors
.
New
(
"insufficient funds for gas * price + value"
)
// ErrGasUintOverflow is returned when calculating gas usage.
ErrGasUintOverflow
=
errors
.
New
(
"gas uint64 overflow"
)
// ErrIntrinsicGas is returned if the transaction is specified to use less gas
// than required to start the invocation.
ErrIntrinsicGas
=
errors
.
New
(
"intrinsic gas too low"
)
// ErrTxTypeNotSupported is returned if a transaction is not supported in the
// current network configuration.
ErrTxTypeNotSupported
=
types
.
ErrTxTypeNotSupported
// ErrTipAboveFeeCap is a sanity error to ensure no one is able to specify a
// transaction with a tip higher than the total fee cap.
ErrTipAboveFeeCap
=
errors
.
New
(
"max priority fee per gas higher than max fee per gas"
)
// ErrTipVeryHigh is a sanity error to avoid extremely big numbers specified
// in the tip field.
ErrTipVeryHigh
=
errors
.
New
(
"max priority fee per gas higher than 2^256-1"
)
// ErrFeeCapVeryHigh is a sanity error to avoid extremely big numbers specified
// in the fee cap field.
ErrFeeCapVeryHigh
=
errors
.
New
(
"max fee per gas higher than 2^256-1"
)
// ErrFeeCapTooLow is returned if the transaction fee cap is less than the
// the base fee of the block.
ErrFeeCapTooLow
=
errors
.
New
(
"max fee per gas less than block base fee"
)
// ErrSenderNoEOA is returned if the sender of a transaction is a contract.
ErrSenderNoEOA
=
errors
.
New
(
"sender not an eoa"
)
)
minigeth/core/evm.go
0 → 100644
View file @
d6da4342
// Copyright 2016 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
package
core
import
(
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
)
// ChainContext supports retrieving headers and consensus parameters from the
// current blockchain to be used during transaction processing.
type
ChainContext
interface
{
// Engine retrieves the chain's consensus engine.
Engine
()
consensus
.
Engine
// GetHeader returns the hash corresponding to their hash.
GetHeader
(
common
.
Hash
,
uint64
)
*
types
.
Header
}
// NewEVMBlockContext creates a new context for use in the EVM.
func
NewEVMBlockContext
(
header
*
types
.
Header
,
chain
ChainContext
,
author
*
common
.
Address
)
vm
.
BlockContext
{
var
(
beneficiary
common
.
Address
baseFee
*
big
.
Int
)
// If we don't have an explicit author (i.e. not mining), extract from the header
if
author
==
nil
{
beneficiary
,
_
=
chain
.
Engine
()
.
Author
(
header
)
// Ignore error, we're past header validation
}
else
{
beneficiary
=
*
author
}
if
header
.
BaseFee
!=
nil
{
baseFee
=
new
(
big
.
Int
)
.
Set
(
header
.
BaseFee
)
}
return
vm
.
BlockContext
{
CanTransfer
:
CanTransfer
,
Transfer
:
Transfer
,
GetHash
:
GetHashFn
(
header
,
chain
),
Coinbase
:
beneficiary
,
BlockNumber
:
new
(
big
.
Int
)
.
Set
(
header
.
Number
),
Time
:
new
(
big
.
Int
)
.
SetUint64
(
header
.
Time
),
Difficulty
:
new
(
big
.
Int
)
.
Set
(
header
.
Difficulty
),
BaseFee
:
baseFee
,
GasLimit
:
header
.
GasLimit
,
}
}
// NewEVMTxContext creates a new transaction context for a single transaction.
func
NewEVMTxContext
(
msg
Message
)
vm
.
TxContext
{
return
vm
.
TxContext
{
Origin
:
msg
.
From
(),
GasPrice
:
new
(
big
.
Int
)
.
Set
(
msg
.
GasPrice
()),
}
}
// GetHashFn returns a GetHashFunc which retrieves header hashes by number
func
GetHashFn
(
ref
*
types
.
Header
,
chain
ChainContext
)
func
(
n
uint64
)
common
.
Hash
{
// Cache will initially contain [refHash.parent],
// Then fill up with [refHash.p, refHash.pp, refHash.ppp, ...]
var
cache
[]
common
.
Hash
return
func
(
n
uint64
)
common
.
Hash
{
// If there's no hash cache yet, make one
if
len
(
cache
)
==
0
{
cache
=
append
(
cache
,
ref
.
ParentHash
)
}
if
idx
:=
ref
.
Number
.
Uint64
()
-
n
-
1
;
idx
<
uint64
(
len
(
cache
))
{
return
cache
[
idx
]
}
// No luck in the cache, but we can start iterating from the last element we already know
lastKnownHash
:=
cache
[
len
(
cache
)
-
1
]
lastKnownNumber
:=
ref
.
Number
.
Uint64
()
-
uint64
(
len
(
cache
))
for
{
header
:=
chain
.
GetHeader
(
lastKnownHash
,
lastKnownNumber
)
if
header
==
nil
{
break
}
cache
=
append
(
cache
,
header
.
ParentHash
)
lastKnownHash
=
header
.
ParentHash
lastKnownNumber
=
header
.
Number
.
Uint64
()
-
1
if
n
==
lastKnownNumber
{
return
lastKnownHash
}
}
return
common
.
Hash
{}
}
}
// CanTransfer checks whether there are enough funds in the address' account to make a transfer.
// This does not take the necessary gas in to account to make the transfer valid.
func
CanTransfer
(
db
vm
.
StateDB
,
addr
common
.
Address
,
amount
*
big
.
Int
)
bool
{
return
db
.
GetBalance
(
addr
)
.
Cmp
(
amount
)
>=
0
}
// Transfer subtracts amount from sender and adds amount to recipient using the given Db
func
Transfer
(
db
vm
.
StateDB
,
sender
,
recipient
common
.
Address
,
amount
*
big
.
Int
)
{
db
.
SubBalance
(
sender
,
amount
)
db
.
AddBalance
(
recipient
,
amount
)
}
minigeth/core/gaspool.go
0 → 100644
View file @
d6da4342
// Copyright 2015 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
package
core
import
(
"fmt"
"math"
)
// GasPool tracks the amount of gas available during execution of the transactions
// in a block. The zero value is a pool with zero gas available.
type
GasPool
uint64
// AddGas makes gas available for execution.
func
(
gp
*
GasPool
)
AddGas
(
amount
uint64
)
*
GasPool
{
if
uint64
(
*
gp
)
>
math
.
MaxUint64
-
amount
{
panic
(
"gas pool pushed above uint64"
)
}
*
(
*
uint64
)(
gp
)
+=
amount
return
gp
}
// SubGas deducts the given amount from the pool if enough gas is
// available and returns an error otherwise.
func
(
gp
*
GasPool
)
SubGas
(
amount
uint64
)
error
{
if
uint64
(
*
gp
)
<
amount
{
return
ErrGasLimitReached
}
*
(
*
uint64
)(
gp
)
-=
amount
return
nil
}
// Gas returns the amount of gas remaining in the pool.
func
(
gp
*
GasPool
)
Gas
()
uint64
{
return
uint64
(
*
gp
)
}
func
(
gp
*
GasPool
)
String
()
string
{
return
fmt
.
Sprintf
(
"%d"
,
*
gp
)
}
minigeth/core/state_processor.go
View file @
d6da4342
...
...
@@ -18,11 +18,14 @@ package core
import
(
"fmt"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/params"
/*"fmt"
"math/big"
...
...
@@ -96,7 +99,7 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg
return
receipts
,
allLogs
,
*
usedGas
,
nil
}
/*
func applyTransaction(msg types.Message, config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, blockNumber *big.Int, blockHash common.Hash, tx *types.Transaction, usedGas *uint64, evm *vm.EVM) (*types.Receipt, error) {
func
applyTransaction
(
msg
types
.
Message
,
config
*
params
.
ChainConfig
,
bc
ChainContext
,
author
*
common
.
Address
,
gp
*
GasPool
,
statedb
*
state
.
StateDB
,
blockNumber
*
big
.
Int
,
blockHash
common
.
Hash
,
tx
*
types
.
Transaction
,
usedGas
*
uint64
,
evm
*
vm
.
EVM
)
(
*
types
.
Receipt
,
error
)
{
// Create a new context to be used in the EVM environment.
txContext
:=
NewEVMTxContext
(
msg
)
evm
.
Reset
(
txContext
,
statedb
)
...
...
@@ -155,4 +158,3 @@ func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *commo
vmenv
:=
vm
.
NewEVM
(
blockContext
,
vm
.
TxContext
{},
statedb
,
config
,
cfg
)
return
applyTransaction
(
msg
,
config
,
bc
,
author
,
gp
,
statedb
,
header
.
Number
,
header
.
Hash
(),
tx
,
usedGas
,
vmenv
)
}
*/
minigeth/core/state_transition.go
0 → 100644
View file @
d6da4342
This diff is collapsed.
Click to expand it.
minigeth/core/vm/interpreter.go
View file @
d6da4342
...
...
@@ -18,13 +18,34 @@ package vm
import
(
"hash"
"math/big"
"sync/atomic"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/math"
//"github.com/ethereum/go-ethereum/log"
)
// **** stub Tracer ****
type
Tracer
struct
{}
// CaptureStart implements the Tracer interface to initialize the tracing operation.
func
(
jst
*
Tracer
)
CaptureStart
(
env
*
EVM
,
from
common
.
Address
,
to
common
.
Address
,
create
bool
,
input
[]
byte
,
gas
uint64
,
value
*
big
.
Int
)
{
}
// CaptureState implements the Tracer interface to trace a single step of VM execution.
func
(
jst
*
Tracer
)
CaptureState
(
env
*
EVM
,
pc
uint64
,
op
OpCode
,
gas
,
cost
uint64
,
scope
*
ScopeContext
,
rData
[]
byte
,
depth
int
,
err
error
)
{
}
// CaptureFault implements the Tracer interface to trace an execution fault
func
(
jst
*
Tracer
)
CaptureFault
(
env
*
EVM
,
pc
uint64
,
op
OpCode
,
gas
,
cost
uint64
,
scope
*
ScopeContext
,
depth
int
,
err
error
)
{
}
// CaptureEnd is called after the call finishes to finalize the tracing.
func
(
jst
*
Tracer
)
CaptureEnd
(
output
[]
byte
,
gasUsed
uint64
,
t
time
.
Duration
,
err
error
)
{
}
// Config are the configuration options for the Interpreter
type
Config
struct
{
Debug
bool
// Enables debugging
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment