Old code removed and renamed amount to balance
This commit is contained in:
		@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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) {
 | 
				
			|||||||
	} {
 | 
						} {
 | 
				
			||||||
		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)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 {
 | 
				
			|||||||
	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) {
 | 
				
			|||||||
		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) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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) {
 | 
				
			|||||||
	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 {
 | 
				
			|||||||
	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())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 {
 | 
				
			|||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *PStateObject) Value() string {
 | 
					func (c *PStateObject) Balance() string {
 | 
				
			||||||
	if c.object != nil {
 | 
						if c.object != nil {
 | 
				
			||||||
		return c.object.Amount.String()
 | 
							return c.object.Balance.String()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ""
 | 
						return ""
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 {
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	state := p.ethp.GetStateObject(args.Address)
 | 
						state := p.ethp.GetStateObject(args.Address)
 | 
				
			||||||
	*reply = NewSuccessRes(BalanceRes{Balance: state.Value(), Address: args.Address})
 | 
						*reply = NewSuccessRes(BalanceRes{Balance: state.Balance(), Address: args.Address})
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,12 @@
 | 
				
			|||||||
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 {
 | 
				
			|||||||
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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 {
 | 
				
			|||||||
	// 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 {
 | 
				
			|||||||
	// 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 {
 | 
				
			|||||||
	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 {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
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 {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *StateObject) AddAmount(amount *big.Int) {
 | 
					func (c *StateObject) AddAmount(amount *big.Int) {
 | 
				
			||||||
	c.SetAmount(new(big.Int).Add(c.Amount, amount))
 | 
						c.SetBalance(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.SetAmount(new(big.Int).Sub(c.Amount, amount))
 | 
						c.SetBalance(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) SetAmount(amount *big.Int) {
 | 
					func (c *StateObject) SetBalance(amount *big.Int) {
 | 
				
			||||||
	c.Amount = amount
 | 
						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) 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) {
 | 
				
			|||||||
	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 {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// 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 {
 | 
				
			|||||||
		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)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								ethvm/vm.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								ethvm/vm.go
									
									
									
									
									
								
							@@ -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) {
 | 
				
			|||||||
				// 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) {
 | 
				
			|||||||
			// 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) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			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()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user