updated to types
This commit is contained in:
parent
709eff4ea7
commit
8240550187
|
@ -6,6 +6,7 @@ import (
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/chain/types"
|
"github.com/ethereum/go-ethereum/chain/types"
|
||||||
"github.com/ethereum/go-ethereum/ethutil"
|
"github.com/ethereum/go-ethereum/ethutil"
|
||||||
|
"github.com/ethereum/go-ethereum/event"
|
||||||
"github.com/ethereum/go-ethereum/logger"
|
"github.com/ethereum/go-ethereum/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -45,6 +46,7 @@ func CalcDifficulty(block, parent *types.Block) *big.Int {
|
||||||
type ChainManager struct {
|
type ChainManager struct {
|
||||||
//eth EthManager
|
//eth EthManager
|
||||||
processor types.BlockProcessor
|
processor types.BlockProcessor
|
||||||
|
eventMux *event.TypeMux
|
||||||
genesisBlock *types.Block
|
genesisBlock *types.Block
|
||||||
// Last known total difficulty
|
// Last known total difficulty
|
||||||
TD *big.Int
|
TD *big.Int
|
||||||
|
@ -55,10 +57,10 @@ type ChainManager struct {
|
||||||
LastBlockHash []byte
|
LastBlockHash []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewChainManager() *ChainManager {
|
func NewChainManager(mux *event.TypeMux) *ChainManager {
|
||||||
bc := &ChainManager{}
|
bc := &ChainManager{}
|
||||||
bc.genesisBlock = types.NewBlockFromBytes(ethutil.Encode(Genesis))
|
bc.genesisBlock = types.NewBlockFromBytes(ethutil.Encode(Genesis))
|
||||||
//bc.eth = ethereum
|
bc.eventMux = mux
|
||||||
|
|
||||||
bc.setLastBlock()
|
bc.setLastBlock()
|
||||||
|
|
||||||
|
@ -250,9 +252,9 @@ func (bc *ChainManager) Stop() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *ChainManager) InsertChain(chain Blocks) error {
|
func (self *ChainManager) InsertChain(chain types.Blocks) error {
|
||||||
for _, block := range chain {
|
for _, block := range chain {
|
||||||
td, messages, err := self.Ethereum.BlockManager().Process(block)
|
td, messages, err := self.processor.Process(block)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if IsKnownBlockErr(err) {
|
if IsKnownBlockErr(err) {
|
||||||
continue
|
continue
|
||||||
|
@ -266,8 +268,8 @@ func (self *ChainManager) InsertChain(chain Blocks) error {
|
||||||
|
|
||||||
self.add(block)
|
self.add(block)
|
||||||
self.SetTotalDifficulty(td)
|
self.SetTotalDifficulty(td)
|
||||||
self.Ethereum.EventMux().Post(NewBlockEvent{block})
|
self.eventMux.Post(NewBlockEvent{block})
|
||||||
self.Ethereum.EventMux().Post(messages)
|
self.eventMux.Post(messages)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -110,7 +110,8 @@ func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error {
|
||||||
return fmt.Errorf("Invalid recipient. len = %d", len(tx.Recipient))
|
return fmt.Errorf("Invalid recipient. len = %d", len(tx.Recipient))
|
||||||
}
|
}
|
||||||
|
|
||||||
if tx.v > 28 || tx.v < 27 {
|
v, _, _ := tx.Curve()
|
||||||
|
if v > 28 || v < 27 {
|
||||||
return fmt.Errorf("tx.v != (28 || 27)")
|
return fmt.Errorf("tx.v != (28 || 27)")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,7 +143,7 @@ func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error {
|
||||||
|
|
||||||
func (self *TxPool) Add(tx *types.Transaction) error {
|
func (self *TxPool) Add(tx *types.Transaction) error {
|
||||||
hash := tx.Hash()
|
hash := tx.Hash()
|
||||||
foundTx := FindTx(self.pool, func(tx *Transaction, e *list.Element) bool {
|
foundTx := FindTx(self.pool, func(tx *types.Transaction, e *list.Element) bool {
|
||||||
return bytes.Compare(tx.Hash(), hash) == 0
|
return bytes.Compare(tx.Hash(), hash) == 0
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -168,42 +169,6 @@ func (self *TxPool) Add(tx *types.Transaction) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pool *TxPool) queueHandler() {
|
|
||||||
out:
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case tx := <-pool.queueChan:
|
|
||||||
hash := tx.Hash()
|
|
||||||
foundTx := FindTx(pool.pool, func(tx *types.Transaction, e *list.Element) bool {
|
|
||||||
return bytes.Compare(tx.Hash(), hash) == 0
|
|
||||||
})
|
|
||||||
|
|
||||||
if foundTx != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate the transaction
|
|
||||||
err := pool.ValidateTransaction(tx)
|
|
||||||
if err != nil {
|
|
||||||
txplogger.Debugln("Validating Tx failed", err)
|
|
||||||
} else {
|
|
||||||
// Call blocking version.
|
|
||||||
pool.addTransaction(tx)
|
|
||||||
|
|
||||||
tmp := make([]byte, 4)
|
|
||||||
copy(tmp, tx.Recipient)
|
|
||||||
|
|
||||||
txplogger.Debugf("(t) %x => %x (%v) %x\n", tx.Sender()[:4], tmp, tx.Value, tx.Hash())
|
|
||||||
|
|
||||||
// Notify the subscribers
|
|
||||||
pool.Ethereum.EventMux().Post(TxPreEvent{tx})
|
|
||||||
}
|
|
||||||
case <-pool.quit:
|
|
||||||
break out
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pool *TxPool) CurrentTransactions() []*types.Transaction {
|
func (pool *TxPool) CurrentTransactions() []*types.Transaction {
|
||||||
pool.mutex.Lock()
|
pool.mutex.Lock()
|
||||||
defer pool.mutex.Unlock()
|
defer pool.mutex.Unlock()
|
||||||
|
@ -261,12 +226,10 @@ func (pool *TxPool) Flush() []*types.Transaction {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pool *TxPool) Start() {
|
func (pool *TxPool) Start() {
|
||||||
go pool.queueHandler()
|
//go pool.queueHandler()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pool *TxPool) Stop() {
|
func (pool *TxPool) Stop() {
|
||||||
close(pool.quit)
|
|
||||||
|
|
||||||
pool.Flush()
|
pool.Flush()
|
||||||
|
|
||||||
txplogger.Infoln("Stopped")
|
txplogger.Infoln("Stopped")
|
||||||
|
|
|
@ -2,9 +2,10 @@ package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math/big"
|
"math/big"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/state"
|
"github.com/ethereum/go-ethereum/state"
|
||||||
)
|
)
|
||||||
|
|
||||||
type BlockProcessor interface {
|
type BlockProcessor interface {
|
||||||
ProcessWithParent(*Block, *Block) (*big.Int, state.Messages, error)
|
Process(*Block) (*big.Int, state.Messages, error)
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,6 +82,14 @@ func (tx *Transaction) CreationAddress(state *state.State) []byte {
|
||||||
return crypto.Sha3(ethutil.NewValue([]interface{}{tx.Sender(), tx.Nonce}).Encode())[12:]
|
return crypto.Sha3(ethutil.NewValue([]interface{}{tx.Sender(), tx.Nonce}).Encode())[12:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tx *Transaction) Curve() (v byte, r []byte, s []byte) {
|
||||||
|
v = tx.v
|
||||||
|
r = ethutil.LeftPadBytes(tx.r, 32)
|
||||||
|
s = ethutil.LeftPadBytes(tx.s, 32)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (tx *Transaction) Signature(key []byte) []byte {
|
func (tx *Transaction) Signature(key []byte) []byte {
|
||||||
hash := tx.Hash()
|
hash := tx.Hash()
|
||||||
|
|
||||||
|
@ -93,12 +101,10 @@ func (tx *Transaction) Signature(key []byte) []byte {
|
||||||
func (tx *Transaction) PublicKey() []byte {
|
func (tx *Transaction) PublicKey() []byte {
|
||||||
hash := tx.Hash()
|
hash := tx.Hash()
|
||||||
|
|
||||||
// TODO
|
v, r, s := tx.Curve()
|
||||||
r := ethutil.LeftPadBytes(tx.r, 32)
|
|
||||||
s := ethutil.LeftPadBytes(tx.s, 32)
|
|
||||||
|
|
||||||
sig := append(r, s...)
|
sig := append(r, s...)
|
||||||
sig = append(sig, tx.v-27)
|
sig = append(sig, v-27)
|
||||||
|
|
||||||
pubkey := crypto.Ecrecover(append(hash, sig...))
|
pubkey := crypto.Ecrecover(append(hash, sig...))
|
||||||
//pubkey, _ := secp256k1.RecoverPubkey(hash, sig)
|
//pubkey, _ := secp256k1.RecoverPubkey(hash, sig)
|
||||||
|
|
|
@ -129,7 +129,7 @@ func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *cr
|
||||||
|
|
||||||
ethereum.blockPool = NewBlockPool(ethereum)
|
ethereum.blockPool = NewBlockPool(ethereum)
|
||||||
ethereum.txPool = chain.NewTxPool(ethereum)
|
ethereum.txPool = chain.NewTxPool(ethereum)
|
||||||
ethereum.blockChain = chain.NewChainManager()
|
ethereum.blockChain = chain.NewChainManager(ethereum.EventMux())
|
||||||
ethereum.blockManager = chain.NewBlockManager(ethereum)
|
ethereum.blockManager = chain.NewBlockManager(ethereum)
|
||||||
ethereum.blockChain.SetProcessor(ethereum.blockManager)
|
ethereum.blockChain.SetProcessor(ethereum.blockManager)
|
||||||
|
|
||||||
|
|
|
@ -215,7 +215,7 @@ func (self *JSXEth) Transact(key, toStr, valueStr, gasStr, gasPriceStr, codeStr
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
if chain.IsContractAddr(to) {
|
if types.IsContractAddr(to) {
|
||||||
return ethutil.Bytes2Hex(tx.CreationAddress(nil)), nil
|
return ethutil.Bytes2Hex(tx.CreationAddress(nil)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
xeth/pipe.go
10
xeth/pipe.go
|
@ -93,7 +93,7 @@ func (self *XEth) Exists(addr []byte) bool {
|
||||||
return self.World().Get(addr) != nil
|
return self.World().Get(addr) != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *XEth) TransactString(key *crypto.KeyPair, rec string, value, gas, price *ethutil.Value, data []byte) (*chain.Transaction, error) {
|
func (self *XEth) TransactString(key *crypto.KeyPair, rec string, value, gas, price *ethutil.Value, data []byte) (*types.Transaction, error) {
|
||||||
// Check if an address is stored by this address
|
// Check if an address is stored by this address
|
||||||
var hash []byte
|
var hash []byte
|
||||||
addr := self.World().Config().Get("NameReg").StorageString(rec).Bytes()
|
addr := self.World().Config().Get("NameReg").StorageString(rec).Bytes()
|
||||||
|
@ -108,10 +108,10 @@ func (self *XEth) TransactString(key *crypto.KeyPair, rec string, value, gas, pr
|
||||||
return self.Transact(key, hash, value, gas, price, data)
|
return self.Transact(key, hash, value, gas, price, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *XEth) Transact(key *crypto.KeyPair, to []byte, value, gas, price *ethutil.Value, data []byte) (*chain.Transaction, error) {
|
func (self *XEth) Transact(key *crypto.KeyPair, to []byte, value, gas, price *ethutil.Value, data []byte) (*types.Transaction, error) {
|
||||||
var hash []byte
|
var hash []byte
|
||||||
var contractCreation bool
|
var contractCreation bool
|
||||||
if chain.IsContractAddr(to) {
|
if types.IsContractAddr(to) {
|
||||||
contractCreation = true
|
contractCreation = true
|
||||||
} else {
|
} else {
|
||||||
// Check if an address is stored by this address
|
// Check if an address is stored by this address
|
||||||
|
@ -125,9 +125,9 @@ func (self *XEth) Transact(key *crypto.KeyPair, to []byte, value, gas, price *et
|
||||||
|
|
||||||
var tx *types.Transaction
|
var tx *types.Transaction
|
||||||
if contractCreation {
|
if contractCreation {
|
||||||
tx = chain.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), data)
|
tx = types.NewContractCreationTx(value.BigInt(), gas.BigInt(), price.BigInt(), data)
|
||||||
} else {
|
} else {
|
||||||
tx = chain.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data)
|
tx = types.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data)
|
||||||
}
|
}
|
||||||
|
|
||||||
state := self.blockManager.TransState()
|
state := self.blockManager.TransState()
|
||||||
|
|
Loading…
Reference in New Issue