Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
张蕾
Geth-Modification
Commits
1f9894c0
Commit
1f9894c0
authored
Jul 29, 2014
by
obscuren
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Old code removed and renamed amount to balance
parent
27f89226
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
52 additions
and
144 deletions
+52
-144
block.go
ethchain/block.go
+0
-27
block_chain.go
ethchain/block_chain.go
+4
-3
state_transition.go
ethchain/state_transition.go
+8
-7
transaction_pool.go
ethchain/transaction_pool.go
+4
-75
types.go
ethpub/types.go
+4
-3
packages.go
ethrpc/packages.go
+4
-3
state.go
ethstate/state.go
+3
-2
state_object.go
ethstate/state_object.go
+20
-19
vm.go
ethvm/vm.go
+5
-5
No files found.
ethchain/block.go
View file @
1f9894c0
...
...
@@ -125,33 +125,6 @@ func (block *Block) Transactions() []*Transaction {
return
block
.
transactions
}
func
(
block
*
Block
)
PayFee
(
addr
[]
byte
,
fee
*
big
.
Int
)
bool
{
contract
:=
block
.
state
.
GetStateObject
(
addr
)
// If we can't pay the fee return
if
contract
==
nil
||
contract
.
Amount
.
Cmp
(
fee
)
<
0
/* amount < fee */
{
fmt
.
Println
(
"Contract has insufficient funds"
,
contract
.
Amount
,
fee
)
return
false
}
base
:=
new
(
big
.
Int
)
contract
.
Amount
=
base
.
Sub
(
contract
.
Amount
,
fee
)
block
.
state
.
Trie
.
Update
(
string
(
addr
),
string
(
contract
.
RlpEncode
()))
data
:=
block
.
state
.
Trie
.
Get
(
string
(
block
.
Coinbase
))
// Get the ether (Coinbase) and add the fee (gief fee to miner)
account
:=
ethstate
.
NewStateObjectFromBytes
(
block
.
Coinbase
,
[]
byte
(
data
))
base
=
new
(
big
.
Int
)
account
.
Amount
=
base
.
Add
(
account
.
Amount
,
fee
)
//block.state.Trie.Update(string(block.Coinbase), string(ether.RlpEncode()))
block
.
state
.
UpdateStateObject
(
account
)
return
true
}
func
(
block
*
Block
)
CalcGasLimit
(
parent
*
Block
)
*
big
.
Int
{
if
block
.
Number
.
Cmp
(
big
.
NewInt
(
0
))
==
0
{
return
ethutil
.
BigPow
(
10
,
6
)
...
...
ethchain/block_chain.go
View file @
1f9894c0
...
...
@@ -2,11 +2,12 @@ package ethchain
import
(
"bytes"
"math"
"math/big"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethwire"
"math"
"math/big"
)
var
chainlogger
=
ethlog
.
NewLogger
(
"CHAIN"
)
...
...
@@ -280,7 +281,7 @@ func AddTestNetFunds(block *Block) {
}
{
codedAddr
:=
ethutil
.
Hex2Bytes
(
addr
)
account
:=
block
.
state
.
GetAccount
(
codedAddr
)
account
.
Amount
=
ethutil
.
Big
(
"1606938044258990275541962092341162602522202993782792835301376"
)
//ethutil.BigPow(2, 200)
account
.
Balance
=
ethutil
.
Big
(
"1606938044258990275541962092341162602522202993782792835301376"
)
//ethutil.BigPow(2, 200)
block
.
state
.
UpdateStateObject
(
account
)
}
}
...
...
ethchain/state_transition.go
View file @
1f9894c0
...
...
@@ -2,11 +2,12 @@ package ethchain
import
(
"fmt"
"math/big"
"github.com/ethereum/eth-go/ethstate"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethvm"
"math/big"
)
/*
...
...
@@ -94,8 +95,8 @@ func (self *StateTransition) BuyGas() error {
var
err
error
sender
:=
self
.
Sender
()
if
sender
.
Amount
.
Cmp
(
self
.
tx
.
GasValue
())
<
0
{
return
fmt
.
Errorf
(
"Insufficient funds to pre-pay gas. Req %v, has %v"
,
self
.
tx
.
GasValue
(),
sender
.
Amount
)
if
sender
.
Balance
.
Cmp
(
self
.
tx
.
GasValue
())
<
0
{
return
fmt
.
Errorf
(
"Insufficient funds to pre-pay gas. Req %v, has %v"
,
self
.
tx
.
GasValue
(),
sender
.
Balance
)
}
coinbase
:=
self
.
Coinbase
()
...
...
@@ -178,8 +179,8 @@ func (self *StateTransition) TransitionState() (err error) {
return
}
if
sender
.
Amount
.
Cmp
(
self
.
value
)
<
0
{
return
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
self
.
value
,
sender
.
Amount
)
if
sender
.
Balance
.
Cmp
(
self
.
value
)
<
0
{
return
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
self
.
value
,
sender
.
Balance
)
}
var
snapshot
*
ethstate
.
State
...
...
@@ -240,8 +241,8 @@ func (self *StateTransition) TransitionState() (err error) {
}
func
(
self
*
StateTransition
)
transferValue
(
sender
,
receiver
*
ethstate
.
StateObject
)
error
{
if
sender
.
Amount
.
Cmp
(
self
.
value
)
<
0
{
return
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
self
.
value
,
sender
.
Amount
)
if
sender
.
Balance
.
Cmp
(
self
.
value
)
<
0
{
return
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
self
.
value
,
sender
.
Balance
)
}
// Subtract the amount from the senders account
...
...
ethchain/transaction_pool.go
View file @
1f9894c0
...
...
@@ -4,11 +4,12 @@ import (
"bytes"
"container/list"
"fmt"
"math/big"
"sync"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethstate"
"github.com/ethereum/eth-go/ethwire"
"math/big"
"sync"
)
var
txplogger
=
ethlog
.
NewLogger
(
"TXP"
)
...
...
@@ -91,78 +92,6 @@ func (pool *TxPool) addTransaction(tx *Transaction) {
pool
.
Ethereum
.
Broadcast
(
ethwire
.
MsgTxTy
,
[]
interface
{}{
tx
.
RlpData
()})
}
/*
// Process transaction validates the Tx and processes funds from the
// sender to the recipient.
func (pool *TxPool) ProcessTransaction(tx *Transaction, state *State, toContract bool) (gas *big.Int, err error) {
fmt.Printf("state root before update %x\n", state.Root())
defer func() {
if r := recover(); r != nil {
txplogger.Infoln(r)
err = fmt.Errorf("%v", r)
}
}()
gas = new(big.Int)
addGas := func(g *big.Int) { gas.Add(gas, g) }
addGas(GasTx)
// Get the sender
sender := state.GetAccount(tx.Sender())
if sender.Nonce != tx.Nonce {
err = NonceError(tx.Nonce, sender.Nonce)
return
}
sender.Nonce += 1
defer func() {
//state.UpdateStateObject(sender)
// Notify all subscribers
pool.Ethereum.Reactor().Post("newTx:post", tx)
}()
txTotalBytes := big.NewInt(int64(len(tx.Data)))
txTotalBytes.Div(txTotalBytes, ethutil.Big32)
addGas(new(big.Int).Mul(txTotalBytes, GasSStore))
rGas := new(big.Int).Set(gas)
rGas.Mul(gas, tx.GasPrice)
// Make sure there's enough in the sender's account. Having insufficient
// funds won't invalidate this transaction but simple ignores it.
totAmount := new(big.Int).Add(tx.Value, rGas)
if sender.Amount.Cmp(totAmount) < 0 {
err = fmt.Errorf("[TXPL] Insufficient amount in sender's (%x) account", tx.Sender())
return
}
state.UpdateStateObject(sender)
fmt.Printf("state root after sender update %x\n", state.Root())
// Get the receiver
receiver := state.GetAccount(tx.Recipient)
// Send Tx to self
if bytes.Compare(tx.Recipient, tx.Sender()) == 0 {
// Subtract the fee
sender.SubAmount(rGas)
} else {
// Subtract the amount from the senders account
sender.SubAmount(totAmount)
// Add the amount to receivers account which should conclude this transaction
receiver.AddAmount(tx.Value)
state.UpdateStateObject(receiver)
fmt.Printf("state root after receiver update %x\n", state.Root())
}
txplogger.Infof("[TXPL] Processed Tx %x\n", tx.Hash())
return
}
*/
func
(
pool
*
TxPool
)
ValidateTransaction
(
tx
*
Transaction
)
error
{
// Get the last block so we can retrieve the sender and receiver from
// the merkle trie
...
...
@@ -183,7 +112,7 @@ func (pool *TxPool) ValidateTransaction(tx *Transaction) error {
totAmount
:=
new
(
big
.
Int
)
.
Set
(
tx
.
Value
)
// Make sure there's enough in the sender's account. Having insufficient
// funds won't invalidate this transaction but simple ignores it.
if
sender
.
Amount
.
Cmp
(
totAmount
)
<
0
{
if
sender
.
Balance
.
Cmp
(
totAmount
)
<
0
{
return
fmt
.
Errorf
(
"[TXPL] Insufficient amount in sender's (%x) account"
,
tx
.
Sender
())
}
...
...
ethpub/types.go
View file @
1f9894c0
...
...
@@ -3,12 +3,13 @@ package ethpub
import
(
"encoding/json"
"fmt"
"strings"
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethstate"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethutil"
"strings"
)
// Peer interface exposed to QML
...
...
@@ -175,9 +176,9 @@ func (c *PStateObject) GetStorage(address string) string {
return
""
}
func
(
c
*
PStateObject
)
Valu
e
()
string
{
func
(
c
*
PStateObject
)
Balanc
e
()
string
{
if
c
.
object
!=
nil
{
return
c
.
object
.
Amount
.
String
()
return
c
.
object
.
Balance
.
String
()
}
return
""
...
...
ethrpc/packages.go
View file @
1f9894c0
...
...
@@ -3,10 +3,11 @@ package ethrpc
import
(
"encoding/json"
"errors"
"github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethutil"
"math/big"
"strings"
"github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethutil"
)
type
EthereumApi
struct
{
...
...
@@ -272,7 +273,7 @@ func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *string) error {
return
err
}
state
:=
p
.
ethp
.
GetStateObject
(
args
.
Address
)
*
reply
=
NewSuccessRes
(
BalanceRes
{
Balance
:
state
.
Valu
e
(),
Address
:
args
.
Address
})
*
reply
=
NewSuccessRes
(
BalanceRes
{
Balance
:
state
.
Balanc
e
(),
Address
:
args
.
Address
})
return
nil
}
...
...
ethstate/state.go
View file @
1f9894c0
package
ethstate
import
(
"math/big"
"github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethutil"
"math/big"
)
var
statelogger
=
ethlog
.
NewLogger
(
"STATE"
)
...
...
@@ -33,7 +34,7 @@ func NewState(trie *ethtrie.Trie) *State {
func
(
self
*
State
)
GetBalance
(
addr
[]
byte
)
*
big
.
Int
{
stateObject
:=
self
.
GetStateObject
(
addr
)
if
stateObject
!=
nil
{
return
stateObject
.
Amount
return
stateObject
.
Balance
}
return
ethutil
.
Big0
...
...
ethstate/state_object.go
View file @
1f9894c0
...
...
@@ -2,10 +2,11 @@ package ethstate
import
(
"fmt"
"math/big"
"github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethutil"
"math/big"
)
type
Code
[]
byte
...
...
@@ -30,7 +31,7 @@ type StateObject struct {
// Address of the object
address
[]
byte
// Shared attributes
Amount
*
big
.
Int
Balance
*
big
.
Int
CodeHash
[]
byte
Nonce
uint64
// Contract related attributes
...
...
@@ -78,7 +79,7 @@ func NewStateObject(addr []byte) *StateObject {
// This to ensure that it has 20 bytes (and not 0 bytes), thus left or right pad doesn't matter.
address
:=
ethutil
.
Address
(
addr
)
object
:=
&
StateObject
{
address
:
address
,
Amount
:
new
(
big
.
Int
),
gasPool
:
new
(
big
.
Int
)}
object
:=
&
StateObject
{
address
:
address
,
Balance
:
new
(
big
.
Int
),
gasPool
:
new
(
big
.
Int
)}
object
.
State
=
NewState
(
ethtrie
.
NewTrie
(
ethutil
.
Config
.
Db
,
""
))
object
.
storage
=
make
(
Storage
)
object
.
gasPool
=
new
(
big
.
Int
)
...
...
@@ -86,9 +87,9 @@ func NewStateObject(addr []byte) *StateObject {
return
object
}
func
NewContract
(
address
[]
byte
,
Amount
*
big
.
Int
,
root
[]
byte
)
*
StateObject
{
func
NewContract
(
address
[]
byte
,
balance
*
big
.
Int
,
root
[]
byte
)
*
StateObject
{
contract
:=
NewStateObject
(
address
)
contract
.
Amount
=
Amount
contract
.
Balance
=
balance
contract
.
State
=
NewState
(
ethtrie
.
NewTrie
(
ethutil
.
Config
.
Db
,
string
(
root
)))
return
contract
...
...
@@ -103,7 +104,7 @@ func NewStateObjectFromBytes(address, data []byte) *StateObject {
func
(
self
*
StateObject
)
MarkForDeletion
()
{
self
.
remove
=
true
statelogger
.
DebugDetailf
(
"%x: #%d %v (deletion)
\n
"
,
self
.
Address
(),
self
.
Nonce
,
self
.
Amount
)
statelogger
.
DebugDetailf
(
"%x: #%d %v (deletion)
\n
"
,
self
.
Address
(),
self
.
Nonce
,
self
.
Balance
)
}
func
(
c
*
StateObject
)
GetAddr
(
addr
[]
byte
)
*
ethutil
.
Value
{
...
...
@@ -190,19 +191,19 @@ func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value {
}
func
(
c
*
StateObject
)
AddAmount
(
amount
*
big
.
Int
)
{
c
.
Set
Amount
(
new
(
big
.
Int
)
.
Add
(
c
.
Amount
,
amount
))
c
.
Set
Balance
(
new
(
big
.
Int
)
.
Add
(
c
.
Balance
,
amount
))
statelogger
.
Debugf
(
"%x: #%d %v (+ %v)
\n
"
,
c
.
Address
(),
c
.
Nonce
,
c
.
Amount
,
amount
)
statelogger
.
Debugf
(
"%x: #%d %v (+ %v)
\n
"
,
c
.
Address
(),
c
.
Nonce
,
c
.
Balance
,
amount
)
}
func
(
c
*
StateObject
)
SubAmount
(
amount
*
big
.
Int
)
{
c
.
Set
Amount
(
new
(
big
.
Int
)
.
Sub
(
c
.
Amount
,
amount
))
c
.
Set
Balance
(
new
(
big
.
Int
)
.
Sub
(
c
.
Balance
,
amount
))
statelogger
.
Debugf
(
"%x: #%d %v (- %v)
\n
"
,
c
.
Address
(),
c
.
Nonce
,
c
.
Amount
,
amount
)
statelogger
.
Debugf
(
"%x: #%d %v (- %v)
\n
"
,
c
.
Address
(),
c
.
Nonce
,
c
.
Balance
,
amount
)
}
func
(
c
*
StateObject
)
Set
Amount
(
amount
*
big
.
Int
)
{
c
.
Amount
=
amount
func
(
c
*
StateObject
)
Set
Balance
(
amount
*
big
.
Int
)
{
c
.
Balance
=
amount
}
//
...
...
@@ -213,8 +214,8 @@ func (c *StateObject) SetAmount(amount *big.Int) {
func
(
c
*
StateObject
)
ReturnGas
(
gas
,
price
*
big
.
Int
)
{}
func
(
c
*
StateObject
)
ConvertGas
(
gas
,
price
*
big
.
Int
)
error
{
total
:=
new
(
big
.
Int
)
.
Mul
(
gas
,
price
)
if
total
.
Cmp
(
c
.
Amount
)
>
0
{
return
fmt
.
Errorf
(
"insufficient amount: %v, %v"
,
c
.
Amount
,
total
)
if
total
.
Cmp
(
c
.
Balance
)
>
0
{
return
fmt
.
Errorf
(
"insufficient amount: %v, %v"
,
c
.
Balance
,
total
)
}
c
.
SubAmount
(
total
)
...
...
@@ -247,12 +248,12 @@ func (self *StateObject) RefundGas(gas, price *big.Int) {
rGas
:=
new
(
big
.
Int
)
.
Set
(
gas
)
rGas
.
Mul
(
rGas
,
price
)
self
.
Amount
.
Sub
(
self
.
Amount
,
rGas
)
self
.
Balance
.
Sub
(
self
.
Balance
,
rGas
)
}
func
(
self
*
StateObject
)
Copy
()
*
StateObject
{
stateObject
:=
NewStateObject
(
self
.
Address
())
stateObject
.
Amount
.
Set
(
self
.
Amount
)
stateObject
.
Balance
.
Set
(
self
.
Balance
)
stateObject
.
CodeHash
=
ethutil
.
CopyBytes
(
self
.
CodeHash
)
stateObject
.
Nonce
=
self
.
Nonce
if
self
.
State
!=
nil
{
...
...
@@ -290,7 +291,7 @@ func (c *StateObject) Init() Code {
// Debug stuff
func
(
self
*
StateObject
)
CreateOutputForDiff
()
{
fmt
.
Printf
(
"%x %x %x %x
\n
"
,
self
.
Address
(),
self
.
State
.
Root
(),
self
.
Amount
.
Bytes
(),
self
.
Nonce
)
fmt
.
Printf
(
"%x %x %x %x
\n
"
,
self
.
Address
(),
self
.
State
.
Root
(),
self
.
Balance
.
Bytes
(),
self
.
Nonce
)
self
.
EachStorage
(
func
(
addr
string
,
value
*
ethutil
.
Value
)
{
fmt
.
Printf
(
"%x %x
\n
"
,
addr
,
value
.
Bytes
())
})
...
...
@@ -309,14 +310,14 @@ func (c *StateObject) RlpEncode() []byte {
root
=
""
}
return
ethutil
.
Encode
([]
interface
{}{
c
.
Nonce
,
c
.
Amount
,
root
,
ethcrypto
.
Sha3Bin
(
c
.
Code
)})
return
ethutil
.
Encode
([]
interface
{}{
c
.
Nonce
,
c
.
Balance
,
root
,
ethcrypto
.
Sha3Bin
(
c
.
Code
)})
}
func
(
c
*
StateObject
)
RlpDecode
(
data
[]
byte
)
{
decoder
:=
ethutil
.
NewValueFromBytes
(
data
)
c
.
Nonce
=
decoder
.
Get
(
0
)
.
Uint
()
c
.
Amount
=
decoder
.
Get
(
1
)
.
BigInt
()
c
.
Balance
=
decoder
.
Get
(
1
)
.
BigInt
()
c
.
State
=
NewState
(
ethtrie
.
NewTrie
(
ethutil
.
Config
.
Db
,
decoder
.
Get
(
2
)
.
Interface
()))
c
.
storage
=
make
(
map
[
string
]
*
ethutil
.
Value
)
c
.
gasPool
=
new
(
big
.
Int
)
...
...
ethvm/vm.go
View file @
1f9894c0
...
...
@@ -682,7 +682,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
// Create a new contract
contract
:=
self
.
env
.
State
()
.
NewStateObject
(
addr
)
if
contract
.
Amount
.
Cmp
(
value
)
>=
0
{
if
contract
.
Balance
.
Cmp
(
value
)
>=
0
{
closure
.
object
.
SubAmount
(
value
)
contract
.
AddAmount
(
value
)
...
...
@@ -700,7 +700,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
// main script.
contract
.
Code
,
_
,
err
=
c
.
Call
(
self
,
nil
)
}
else
{
err
=
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
value
,
closure
.
object
.
Amount
)
err
=
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
value
,
closure
.
object
.
Balance
)
}
if
err
!=
nil
{
...
...
@@ -736,8 +736,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
// Get the arguments from the memory
args
:=
mem
.
Get
(
inOffset
.
Int64
(),
inSize
.
Int64
())
if
closure
.
object
.
Amount
.
Cmp
(
value
)
<
0
{
vmlogger
.
Debugf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
value
,
closure
.
object
.
Amount
)
if
closure
.
object
.
Balance
.
Cmp
(
value
)
<
0
{
vmlogger
.
Debugf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
value
,
closure
.
object
.
Balance
)
closure
.
ReturnGas
(
gas
,
nil
)
...
...
@@ -784,7 +784,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
receiver
:=
self
.
env
.
State
()
.
GetOrNewStateObject
(
stack
.
Pop
()
.
Bytes
())
receiver
.
AddAmount
(
closure
.
object
.
Amount
)
receiver
.
AddAmount
(
closure
.
object
.
Balance
)
closure
.
object
.
MarkForDeletion
()
...
...
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