func (self *JSRE) dump(call otto.FunctionCall) otto.Value { var state *ethstate.State if len(call.ArgumentList) > 0 { var block *ethchain.Block if call.Argument(0).IsNumber() { num, _ := call.Argument(0).ToInteger() block = self.ethereum.BlockChain().GetBlockByNumber(uint64(num)) } else if call.Argument(0).IsString() { hash, _ := call.Argument(0).ToString() block = self.ethereum.BlockChain().GetBlock(ethutil.Hex2Bytes(hash)) } else { fmt.Println("invalid argument for dump. Either hex string or number") } if block == nil { fmt.Println("block not found") return otto.UndefinedValue() } state = block.State() } else { state = self.ethereum.StateManager().CurrentState() } v, _ := self.Vm.ToValue(state.Dump()) return v }
func (self *Gui) DumpState(hash, path string) { var stateDump []byte if len(hash) == 0 { stateDump = self.eth.StateManager().CurrentState().Dump() } else { var block *ethchain.Block if hash[0] == '#' { i, _ := strconv.Atoi(hash[1:]) block = self.eth.BlockChain().GetBlockByNumber(uint64(i)) } else { block = self.eth.BlockChain().GetBlock(ethutil.Hex2Bytes(hash)) } if block == nil { logger.Infof("block err: not found %s\n", hash) return } stateDump = block.State().Dump() } file, err := os.OpenFile(path[7:], os.O_CREATE|os.O_RDWR, os.ModePerm) if err != nil { logger.Infoln("dump err: ", err) return } defer file.Close() logger.Infof("dumped state (%s) to %s\n", hash, path) file.Write(stateDump) }
func (self *BlockPool) SetBlock(b *ethchain.Block) { hash := string(b.Hash()) if self.pool[string(hash)] == nil { self.pool[hash] = &block{nil, nil} } self.pool[hash].block = b }
// Creates a new QML Block from a chain block func NewJSBlock(block *ethchain.Block) *JSBlock { if block == nil { return nil } var ptxs []JSTransaction for _, tx := range block.Transactions() { ptxs = append(ptxs, *NewJSTx(tx)) } txJson, err := json.Marshal(ptxs) if err != nil { return nil } return &JSBlock{ref: block, Number: int(block.Number.Uint64()), GasUsed: block.GasUsed.String(), GasLimit: block.GasLimit.String(), Hash: ethutil.Bytes2Hex(block.Hash()), Transactions: string(txJson), Time: block.Time, Coinbase: ethutil.Bytes2Hex(block.Coinbase)} }
func (app *HtmlApplication) NewBlock(block *ethchain.Block) { b := ðpipe.JSBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())} app.webView.Call("onNewBlockCb", b) }
// Inbound handler. Inbound messages are received here and passed to the appropriate methods func (p *Peer) HandleInbound() { for atomic.LoadInt32(&p.disconnect) == 0 { // HMM? time.Sleep(500 * time.Millisecond) // Wait for a message from the peer msgs, err := ethwire.ReadMessages(p.conn) if err != nil { ethutil.Config.Log.Debugln(err) } for _, msg := range msgs { switch msg.Type { case ethwire.MsgHandshakeTy: // Version message p.handleHandshake(msg) if p.caps.IsCap(CapPeerDiscTy) { p.QueueMessage(ethwire.NewMessage(ethwire.MsgGetPeersTy, "")) } case ethwire.MsgDiscTy: p.Stop() ethutil.Config.Log.Infoln("Disconnect peer:", DiscReason(msg.Data.Get(0).Uint())) case ethwire.MsgPingTy: // Respond back with pong p.QueueMessage(ethwire.NewMessage(ethwire.MsgPongTy, "")) case ethwire.MsgPongTy: // If we received a pong back from a peer we set the // last pong so the peer handler knows this peer is still // active. p.lastPong = time.Now().Unix() case ethwire.MsgBlockTy: // Get all blocks and process them var block, lastBlock *ethchain.Block var err error for i := msg.Data.Len() - 1; i >= 0; i-- { block = ethchain.NewBlockFromRlpValue(msg.Data.Get(i)) err = p.ethereum.BlockManager.ProcessBlock(block) if err != nil { if ethutil.Config.Debug { ethutil.Config.Log.Infof("[PEER] Block %x failed\n", block.Hash()) ethutil.Config.Log.Infof("[PEER] %v\n", err) } break } else { lastBlock = block } } if err != nil { // If the parent is unknown try to catch up with this peer if ethchain.IsParentErr(err) { ethutil.Config.Log.Infoln("Attempting to catch up") p.catchingUp = false p.CatchupWithPeer() } else if ethchain.IsValidationErr(err) { // TODO } } else { // XXX Do we want to catch up if there were errors? // If we're catching up, try to catch up further. if p.catchingUp && msg.Data.Len() > 1 { if ethutil.Config.Debug && lastBlock != nil { blockInfo := lastBlock.BlockInfo() ethutil.Config.Log.Infof("Synced to block height #%d %x %x\n", blockInfo.Number, lastBlock.Hash(), blockInfo.Hash) } p.catchingUp = false p.CatchupWithPeer() } } case ethwire.MsgTxTy: // If the message was a transaction queue the transaction // in the TxPool where it will undergo validation and // processing when a new block is found for i := 0; i < msg.Data.Len(); i++ { p.ethereum.TxPool.QueueTransaction(ethchain.NewTransactionFromData(msg.Data.Get(i).Encode())) } case ethwire.MsgGetPeersTy: // Flag this peer as a 'requested of new peers' this to // prevent malicious peers being forced. p.requestedPeerList = true // Peer asked for list of connected peers p.pushPeers() case ethwire.MsgPeersTy: // Received a list of peers (probably because MsgGetPeersTy was send) // Only act on message if we actually requested for a peers list //if p.requestedPeerList { data := msg.Data // Create new list of possible peers for the ethereum to process peers := make([]string, data.Len()) // Parse each possible peer for i := 0; i < data.Len(); i++ { value := data.Get(i) peers[i] = unpackAddr(value.Get(0), value.Get(1).Uint()) } // Connect to the list of peers p.ethereum.ProcessPeerList(peers) // Mark unrequested again p.requestedPeerList = false //} case ethwire.MsgGetChainTy: var parent *ethchain.Block // Length minus one since the very last element in the array is a count l := msg.Data.Len() - 1 // Ignore empty get chains if l == 0 { break } // Amount of parents in the canonical chain //amountOfBlocks := msg.Data.Get(l).AsUint() amountOfBlocks := uint64(100) // Check each SHA block hash from the message and determine whether // the SHA is in the database for i := 0; i < l; i++ { if data := msg.Data.Get(i).Bytes(); p.ethereum.BlockManager.BlockChain().HasBlock(data) { parent = p.ethereum.BlockManager.BlockChain().GetBlock(data) break } } // If a parent is found send back a reply if parent != nil { chain := p.ethereum.BlockManager.BlockChain().GetChainFromHash(parent.Hash(), amountOfBlocks) p.QueueMessage(ethwire.NewMessage(ethwire.MsgBlockTy, chain)) } else { // If no blocks are found we send back a reply with msg not in chain // and the last hash from get chain lastHash := msg.Data.Get(l - 1) //log.Printf("Sending not in chain with hash %x\n", lastHash.AsRaw()) p.QueueMessage(ethwire.NewMessage(ethwire.MsgNotInChainTy, []interface{}{lastHash.Raw()})) } case ethwire.MsgNotInChainTy: ethutil.Config.Log.Infof("Not in chain %x\n", msg.Data) // TODO // Unofficial but fun nonetheless case ethwire.MsgTalkTy: ethutil.Config.Log.Infoln("%v says: %s\n", p.conn.RemoteAddr(), msg.Data.Str()) } } } p.Stop() }
// Events func (app *QmlApplication) NewBlock(block *ethchain.Block) { pblock := ðpub.PBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Bytes2Hex(block.Hash())} app.win.Call("onNewBlockCb", pblock) }
// Creates a new QML Block from a chain block func NewBlockFromBlock(block *ethchain.Block) *Block { info := block.BlockInfo() hash := hex.EncodeToString(block.Hash()) return &Block{Number: int(info.Number), Hash: hash} }
func main() { runtime.GOMAXPROCS(runtime.NumCPU()) utils.HandleInterrupt() // precedence: code-internal flag default < config file < environment variables < command line Init() // parsing command line // If the difftool option is selected ignore all other log output if DiffTool || Dump { LogLevel = 0 } utils.InitConfig(ConfigFile, Datadir, "ETH") ethutil.Config.Diff = DiffTool ethutil.Config.DiffType = DiffType utils.InitDataDir(Datadir) utils.InitLogging(Datadir, LogFile, LogLevel, DebugFile) db := utils.NewDatabase() keyManager := utils.NewKeyManager(KeyStore, Datadir, db) // create, import, export keys utils.KeyTasks(keyManager, KeyRing, GenAddr, SecretFile, ExportDir, NonInteractive) clientIdentity := utils.NewClientIdentity(ClientIdentifier, Version, Identifier) ethereum := utils.NewEthereum(db, clientIdentity, keyManager, UseUPnP, OutboundPort, MaxPeer) if Dump { var block *ethchain.Block if len(DumpHash) == 0 && DumpNumber == -1 { block = ethereum.BlockChain().CurrentBlock } else if len(DumpHash) > 0 { block = ethereum.BlockChain().GetBlock(ethutil.Hex2Bytes(DumpHash)) } else { block = ethereum.BlockChain().GetBlockByNumber(uint64(DumpNumber)) } if block == nil { fmt.Fprintln(os.Stderr, "block not found") // We want to output valid JSON fmt.Println("{}") os.Exit(1) } // Leave the Println. This needs clean output for piping fmt.Printf("%s\n", block.State().Dump()) os.Exit(0) } if ShowGenesis { utils.ShowGenesis(ethereum) } if StartMining { utils.StartMining(ethereum) } // better reworked as cases if StartJsConsole { InitJsConsole(ethereum) } else if len(InputFile) > 0 { ExecJsFile(ethereum, InputFile) } if StartRpc { utils.StartRpc(ethereum, RpcPort) } utils.StartEthereum(ethereum, UseSeed) // this blocks the thread ethereum.WaitForShutdown() ethlog.Flush() }