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
Hide 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 {
...
@@ -125,33 +125,6 @@ func (block *Block) Transactions() []*Transaction {
return
block
.
transactions
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
{
func
(
block
*
Block
)
CalcGasLimit
(
parent
*
Block
)
*
big
.
Int
{
if
block
.
Number
.
Cmp
(
big
.
NewInt
(
0
))
==
0
{
if
block
.
Number
.
Cmp
(
big
.
NewInt
(
0
))
==
0
{
return
ethutil
.
BigPow
(
10
,
6
)
return
ethutil
.
BigPow
(
10
,
6
)
...
...
ethchain/block_chain.go
View file @
1f9894c0
...
@@ -2,11 +2,12 @@ package ethchain
...
@@ -2,11 +2,12 @@ package ethchain
import
(
import
(
"bytes"
"bytes"
"math"
"math/big"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethwire"
"github.com/ethereum/eth-go/ethwire"
"math"
"math/big"
)
)
var
chainlogger
=
ethlog
.
NewLogger
(
"CHAIN"
)
var
chainlogger
=
ethlog
.
NewLogger
(
"CHAIN"
)
...
@@ -280,7 +281,7 @@ func AddTestNetFunds(block *Block) {
...
@@ -280,7 +281,7 @@ func AddTestNetFunds(block *Block) {
}
{
}
{
codedAddr
:=
ethutil
.
Hex2Bytes
(
addr
)
codedAddr
:=
ethutil
.
Hex2Bytes
(
addr
)
account
:=
block
.
state
.
GetAccount
(
codedAddr
)
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
)
block
.
state
.
UpdateStateObject
(
account
)
}
}
}
}
...
...
ethchain/state_transition.go
View file @
1f9894c0
...
@@ -2,11 +2,12 @@ package ethchain
...
@@ -2,11 +2,12 @@ package ethchain
import
(
import
(
"fmt"
"fmt"
"math/big"
"github.com/ethereum/eth-go/ethstate"
"github.com/ethereum/eth-go/ethstate"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethvm"
"github.com/ethereum/eth-go/ethvm"
"math/big"
)
)
/*
/*
...
@@ -94,8 +95,8 @@ func (self *StateTransition) BuyGas() error {
...
@@ -94,8 +95,8 @@ func (self *StateTransition) BuyGas() error {
var
err
error
var
err
error
sender
:=
self
.
Sender
()
sender
:=
self
.
Sender
()
if
sender
.
Amount
.
Cmp
(
self
.
tx
.
GasValue
())
<
0
{
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
.
Amount
)
return
fmt
.
Errorf
(
"Insufficient funds to pre-pay gas. Req %v, has %v"
,
self
.
tx
.
GasValue
(),
sender
.
Balance
)
}
}
coinbase
:=
self
.
Coinbase
()
coinbase
:=
self
.
Coinbase
()
...
@@ -178,8 +179,8 @@ func (self *StateTransition) TransitionState() (err error) {
...
@@ -178,8 +179,8 @@ func (self *StateTransition) TransitionState() (err error) {
return
return
}
}
if
sender
.
Amount
.
Cmp
(
self
.
value
)
<
0
{
if
sender
.
Balance
.
Cmp
(
self
.
value
)
<
0
{
return
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
self
.
value
,
sender
.
Amount
)
return
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
self
.
value
,
sender
.
Balance
)
}
}
var
snapshot
*
ethstate
.
State
var
snapshot
*
ethstate
.
State
...
@@ -240,8 +241,8 @@ func (self *StateTransition) TransitionState() (err error) {
...
@@ -240,8 +241,8 @@ func (self *StateTransition) TransitionState() (err error) {
}
}
func
(
self
*
StateTransition
)
transferValue
(
sender
,
receiver
*
ethstate
.
StateObject
)
error
{
func
(
self
*
StateTransition
)
transferValue
(
sender
,
receiver
*
ethstate
.
StateObject
)
error
{
if
sender
.
Amount
.
Cmp
(
self
.
value
)
<
0
{
if
sender
.
Balance
.
Cmp
(
self
.
value
)
<
0
{
return
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
self
.
value
,
sender
.
Amount
)
return
fmt
.
Errorf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
self
.
value
,
sender
.
Balance
)
}
}
// Subtract the amount from the senders account
// Subtract the amount from the senders account
...
...
ethchain/transaction_pool.go
View file @
1f9894c0
...
@@ -4,11 +4,12 @@ import (
...
@@ -4,11 +4,12 @@ import (
"bytes"
"bytes"
"container/list"
"container/list"
"fmt"
"fmt"
"math/big"
"sync"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethstate"
"github.com/ethereum/eth-go/ethstate"
"github.com/ethereum/eth-go/ethwire"
"github.com/ethereum/eth-go/ethwire"
"math/big"
"sync"
)
)
var
txplogger
=
ethlog
.
NewLogger
(
"TXP"
)
var
txplogger
=
ethlog
.
NewLogger
(
"TXP"
)
...
@@ -91,78 +92,6 @@ func (pool *TxPool) addTransaction(tx *Transaction) {
...
@@ -91,78 +92,6 @@ func (pool *TxPool) addTransaction(tx *Transaction) {
pool
.
Ethereum
.
Broadcast
(
ethwire
.
MsgTxTy
,
[]
interface
{}{
tx
.
RlpData
()})
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
{
func
(
pool
*
TxPool
)
ValidateTransaction
(
tx
*
Transaction
)
error
{
// Get the last block so we can retrieve the sender and receiver from
// Get the last block so we can retrieve the sender and receiver from
// the merkle trie
// the merkle trie
...
@@ -183,7 +112,7 @@ func (pool *TxPool) ValidateTransaction(tx *Transaction) error {
...
@@ -183,7 +112,7 @@ func (pool *TxPool) ValidateTransaction(tx *Transaction) error {
totAmount
:=
new
(
big
.
Int
)
.
Set
(
tx
.
Value
)
totAmount
:=
new
(
big
.
Int
)
.
Set
(
tx
.
Value
)
// Make sure there's enough in the sender's account. Having insufficient
// Make sure there's enough in the sender's account. Having insufficient
// funds won't invalidate this transaction but simple ignores it.
// 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
())
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
...
@@ -3,12 +3,13 @@ package ethpub
import
(
import
(
"encoding/json"
"encoding/json"
"fmt"
"fmt"
"strings"
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethstate"
"github.com/ethereum/eth-go/ethstate"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethutil"
"strings"
)
)
// Peer interface exposed to QML
// Peer interface exposed to QML
...
@@ -175,9 +176,9 @@ func (c *PStateObject) GetStorage(address string) string {
...
@@ -175,9 +176,9 @@ func (c *PStateObject) GetStorage(address string) string {
return
""
return
""
}
}
func
(
c
*
PStateObject
)
Valu
e
()
string
{
func
(
c
*
PStateObject
)
Balanc
e
()
string
{
if
c
.
object
!=
nil
{
if
c
.
object
!=
nil
{
return
c
.
object
.
Amount
.
String
()
return
c
.
object
.
Balance
.
String
()
}
}
return
""
return
""
...
...
ethrpc/packages.go
View file @
1f9894c0
...
@@ -3,10 +3,11 @@ package ethrpc
...
@@ -3,10 +3,11 @@ package ethrpc
import
(
import
(
"encoding/json"
"encoding/json"
"errors"
"errors"
"github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethutil"
"math/big"
"math/big"
"strings"
"strings"
"github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethutil"
)
)
type
EthereumApi
struct
{
type
EthereumApi
struct
{
...
@@ -272,7 +273,7 @@ func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *string) error {
...
@@ -272,7 +273,7 @@ func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *string) error {
return
err
return
err
}
}
state
:=
p
.
ethp
.
GetStateObject
(
args
.
Address
)
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
return
nil
}
}
...
...
ethstate/state.go
View file @
1f9894c0
package
ethstate
package
ethstate
import
(
import
(
"math/big"
"github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethutil"
"math/big"
)
)
var
statelogger
=
ethlog
.
NewLogger
(
"STATE"
)
var
statelogger
=
ethlog
.
NewLogger
(
"STATE"
)
...
@@ -33,7 +34,7 @@ func NewState(trie *ethtrie.Trie) *State {
...
@@ -33,7 +34,7 @@ func NewState(trie *ethtrie.Trie) *State {
func
(
self
*
State
)
GetBalance
(
addr
[]
byte
)
*
big
.
Int
{
func
(
self
*
State
)
GetBalance
(
addr
[]
byte
)
*
big
.
Int
{
stateObject
:=
self
.
GetStateObject
(
addr
)
stateObject
:=
self
.
GetStateObject
(
addr
)
if
stateObject
!=
nil
{
if
stateObject
!=
nil
{
return
stateObject
.
Amount
return
stateObject
.
Balance
}
}
return
ethutil
.
Big0
return
ethutil
.
Big0
...
...
ethstate/state_object.go
View file @
1f9894c0
...
@@ -2,10 +2,11 @@ package ethstate
...
@@ -2,10 +2,11 @@ package ethstate
import
(
import
(
"fmt"
"fmt"
"math/big"
"github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethcrypto"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethtrie"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethutil"
"math/big"
)
)
type
Code
[]
byte
type
Code
[]
byte
...
@@ -30,7 +31,7 @@ type StateObject struct {
...
@@ -30,7 +31,7 @@ type StateObject struct {
// Address of the object
// Address of the object
address
[]
byte
address
[]
byte
// Shared attributes
// Shared attributes
Amount
*
big
.
Int
Balance
*
big
.
Int
CodeHash
[]
byte
CodeHash
[]
byte
Nonce
uint64
Nonce
uint64
// Contract related attributes
// Contract related attributes
...
@@ -78,7 +79,7 @@ func NewStateObject(addr []byte) *StateObject {
...
@@ -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.
// This to ensure that it has 20 bytes (and not 0 bytes), thus left or right pad doesn't matter.
address
:=
ethutil
.
Address
(
addr
)
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
.
State
=
NewState
(
ethtrie
.
NewTrie
(
ethutil
.
Config
.
Db
,
""
))
object
.
storage
=
make
(
Storage
)
object
.
storage
=
make
(
Storage
)
object
.
gasPool
=
new
(
big
.
Int
)
object
.
gasPool
=
new
(
big
.
Int
)
...
@@ -86,9 +87,9 @@ func NewStateObject(addr []byte) *StateObject {
...
@@ -86,9 +87,9 @@ func NewStateObject(addr []byte) *StateObject {
return
object
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
:=
NewStateObject
(
address
)
contract
.
Amount
=
Amount
contract
.
Balance
=
balance
contract
.
State
=
NewState
(
ethtrie
.
NewTrie
(
ethutil
.
Config
.
Db
,
string
(
root
)))
contract
.
State
=
NewState
(
ethtrie
.
NewTrie
(
ethutil
.
Config
.
Db
,
string
(
root
)))
return
contract
return
contract
...
@@ -103,7 +104,7 @@ func NewStateObjectFromBytes(address, data []byte) *StateObject {
...
@@ -103,7 +104,7 @@ func NewStateObjectFromBytes(address, data []byte) *StateObject {
func
(
self
*
StateObject
)
MarkForDeletion
()
{
func
(
self
*
StateObject
)
MarkForDeletion
()
{
self
.
remove
=
true
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
{
func
(
c
*
StateObject
)
GetAddr
(
addr
[]
byte
)
*
ethutil
.
Value
{
...
@@ -190,19 +191,19 @@ func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value {
...
@@ -190,19 +191,19 @@ func (c *StateObject) GetInstr(pc *big.Int) *ethutil.Value {
}
}
func
(
c
*
StateObject
)
AddAmount
(
amount
*
big
.
Int
)
{
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
)
{
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
)
{
func
(
c
*
StateObject
)
Set
Balance
(
amount
*
big
.
Int
)
{
c
.
Amount
=
amount
c
.
Balance
=
amount
}
}
//
//
...
@@ -213,8 +214,8 @@ func (c *StateObject) SetAmount(amount *big.Int) {
...
@@ -213,8 +214,8 @@ func (c *StateObject) SetAmount(amount *big.Int) {
func
(
c
*
StateObject
)
ReturnGas
(
gas
,
price
*
big
.
Int
)
{}
func
(
c
*
StateObject
)
ReturnGas
(
gas
,
price
*
big
.
Int
)
{}
func
(
c
*
StateObject
)
ConvertGas
(
gas
,
price
*
big
.
Int
)
error
{
func
(
c
*
StateObject
)
ConvertGas
(
gas
,
price
*
big
.
Int
)
error
{
total
:=
new
(
big
.
Int
)
.
Mul
(
gas
,
price
)
total
:=
new
(
big
.
Int
)
.
Mul
(
gas
,
price
)
if
total
.
Cmp
(
c
.
Amount
)
>
0
{
if
total
.
Cmp
(
c
.
Balance
)
>
0
{
return
fmt
.
Errorf
(
"insufficient amount: %v, %v"
,
c
.
Amount
,
total
)
return
fmt
.
Errorf
(
"insufficient amount: %v, %v"
,
c
.
Balance
,
total
)
}
}
c
.
SubAmount
(
total
)
c
.
SubAmount
(
total
)
...
@@ -247,12 +248,12 @@ func (self *StateObject) RefundGas(gas, price *big.Int) {
...
@@ -247,12 +248,12 @@ func (self *StateObject) RefundGas(gas, price *big.Int) {
rGas
:=
new
(
big
.
Int
)
.
Set
(
gas
)
rGas
:=
new
(
big
.
Int
)
.
Set
(
gas
)
rGas
.
Mul
(
rGas
,
price
)
rGas
.
Mul
(
rGas
,
price
)
self
.
Amount
.
Sub
(
self
.
Amount
,
rGas
)
self
.
Balance
.
Sub
(
self
.
Balance
,
rGas
)
}
}
func
(
self
*
StateObject
)
Copy
()
*
StateObject
{
func
(
self
*
StateObject
)
Copy
()
*
StateObject
{
stateObject
:=
NewStateObject
(
self
.
Address
())
stateObject
:=
NewStateObject
(
self
.
Address
())
stateObject
.
Amount
.
Set
(
self
.
Amount
)
stateObject
.
Balance
.
Set
(
self
.
Balance
)
stateObject
.
CodeHash
=
ethutil
.
CopyBytes
(
self
.
CodeHash
)
stateObject
.
CodeHash
=
ethutil
.
CopyBytes
(
self
.
CodeHash
)
stateObject
.
Nonce
=
self
.
Nonce
stateObject
.
Nonce
=
self
.
Nonce
if
self
.
State
!=
nil
{
if
self
.
State
!=
nil
{
...
@@ -290,7 +291,7 @@ func (c *StateObject) Init() Code {
...
@@ -290,7 +291,7 @@ func (c *StateObject) Init() Code {
// Debug stuff
// Debug stuff
func
(
self
*
StateObject
)
CreateOutputForDiff
()
{
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
)
{
self
.
EachStorage
(
func
(
addr
string
,
value
*
ethutil
.
Value
)
{
fmt
.
Printf
(
"%x %x
\n
"
,
addr
,
value
.
Bytes
())
fmt
.
Printf
(
"%x %x
\n
"
,
addr
,
value
.
Bytes
())
})
})
...
@@ -309,14 +310,14 @@ func (c *StateObject) RlpEncode() []byte {
...
@@ -309,14 +310,14 @@ func (c *StateObject) RlpEncode() []byte {
root
=
""
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
)
{
func
(
c
*
StateObject
)
RlpDecode
(
data
[]
byte
)
{
decoder
:=
ethutil
.
NewValueFromBytes
(
data
)
decoder
:=
ethutil
.
NewValueFromBytes
(
data
)
c
.
Nonce
=
decoder
.
Get
(
0
)
.
Uint
()
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
.
State
=
NewState
(
ethtrie
.
NewTrie
(
ethutil
.
Config
.
Db
,
decoder
.
Get
(
2
)
.
Interface
()))
c
.
storage
=
make
(
map
[
string
]
*
ethutil
.
Value
)
c
.
storage
=
make
(
map
[
string
]
*
ethutil
.
Value
)
c
.
gasPool
=
new
(
big
.
Int
)
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) {
...
@@ -682,7 +682,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
// Create a new contract
// Create a new contract
contract
:=
self
.
env
.
State
()
.
NewStateObject
(
addr
)
contract
:=
self
.
env
.
State
()
.
NewStateObject
(
addr
)
if
contract
.
Amount
.
Cmp
(
value
)
>=
0
{
if
contract
.
Balance
.
Cmp
(
value
)
>=
0
{
closure
.
object
.
SubAmount
(
value
)
closure
.
object
.
SubAmount
(
value
)
contract
.
AddAmount
(
value
)
contract
.
AddAmount
(
value
)
...
@@ -700,7 +700,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
...
@@ -700,7 +700,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
// main script.
// main script.
contract
.
Code
,
_
,
err
=
c
.
Call
(
self
,
nil
)
contract
.
Code
,
_
,
err
=
c
.
Call
(
self
,
nil
)
}
else
{
}
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
{
if
err
!=
nil
{
...
@@ -736,8 +736,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
...
@@ -736,8 +736,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
// Get the arguments from the memory
// Get the arguments from the memory
args
:=
mem
.
Get
(
inOffset
.
Int64
(),
inSize
.
Int64
())
args
:=
mem
.
Get
(
inOffset
.
Int64
(),
inSize
.
Int64
())
if
closure
.
object
.
Amount
.
Cmp
(
value
)
<
0
{
if
closure
.
object
.
Balance
.
Cmp
(
value
)
<
0
{
vmlogger
.
Debugf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
value
,
closure
.
object
.
Amount
)
vmlogger
.
Debugf
(
"Insufficient funds to transfer value. Req %v, has %v"
,
value
,
closure
.
object
.
Balance
)
closure
.
ReturnGas
(
gas
,
nil
)
closure
.
ReturnGas
(
gas
,
nil
)
...
@@ -784,7 +784,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
...
@@ -784,7 +784,7 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
receiver
:=
self
.
env
.
State
()
.
GetOrNewStateObject
(
stack
.
Pop
()
.
Bytes
())
receiver
:=
self
.
env
.
State
()
.
GetOrNewStateObject
(
stack
.
Pop
()
.
Bytes
())
receiver
.
AddAmount
(
closure
.
object
.
Amount
)
receiver
.
AddAmount
(
closure
.
object
.
Balance
)
closure
.
object
.
MarkForDeletion
()
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