diff --git a/cmd/geth/admin.go b/cmd/geth/admin.go index 1515cd6ac..5f1cb8c96 100644 --- a/cmd/geth/admin.go +++ b/cmd/geth/admin.go @@ -26,8 +26,6 @@ func (js *jsre) adminBindings() { admin := t.Object() admin.Set("suggestPeer", js.suggestPeer) admin.Set("startRPC", js.startRPC) - admin.Set("startMining", js.startMining) - admin.Set("stopMining", js.stopMining) admin.Set("nodeInfo", js.nodeInfo) admin.Set("peers", js.peers) admin.Set("newAccount", js.newAccount) @@ -37,7 +35,30 @@ func (js *jsre) adminBindings() { admin.Set("dumpBlock", js.dumpBlock) admin.Set("verbosity", js.verbosity) admin.Set("backtrace", js.backtrace) - admin.Set("hashrate", js.hashrate) + + admin.Set("miner", struct{}{}) + t, _ = admin.Get("miner") + miner := t.Object() + miner.Set("start", js.startMining) + miner.Set("stop", js.stopMining) + miner.Set("hashrate", js.hashrate) + miner.Set("setExtra", js.setExtra) +} + +func (js *jsre) setExtra(call otto.FunctionCall) otto.Value { + extra, err := call.Argument(0).ToString() + if err != nil { + fmt.Println(err) + return otto.UndefinedValue() + } + + if len(extra) > 1024 { + fmt.Println("error: cannot exceed 1024 bytes") + return otto.UndefinedValue() + } + + js.ethereum.Miner().SetExtra([]byte(extra)) + return otto.UndefinedValue() } func (js *jsre) hashrate(otto.FunctionCall) otto.Value { diff --git a/core/chain_makers.go b/core/chain_makers.go index 6597cc315..bbf1b1439 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -55,7 +55,7 @@ func NewCanonical(n int, db common.Database) (*BlockProcessor, error) { // block time is fixed at 10 seconds func newBlockFromParent(addr common.Address, parent *types.Block) *types.Block { - block := types.NewBlock(parent.Hash(), addr, parent.Root(), common.BigPow(2, 32), 0, "") + block := types.NewBlock(parent.Hash(), addr, parent.Root(), common.BigPow(2, 32), 0, nil) block.SetUncles(nil) block.SetTransactions(nil) block.SetReceipts(nil) diff --git a/core/chain_manager.go b/core/chain_manager.go index 0c2eb0fe1..c2e241e90 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -228,7 +228,7 @@ func (bc *ChainManager) NewBlock(coinbase common.Address) *types.Block { root, common.BigPow(2, 32), 0, - "") + nil) block.SetUncles(nil) block.SetTransactions(nil) block.SetReceipts(nil) diff --git a/core/genesis.go b/core/genesis.go index 13656c40c..8ef1e140f 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -20,7 +20,7 @@ var ZeroHash160 = make([]byte, 20) var ZeroHash512 = make([]byte, 64) func GenesisBlock(db common.Database) *types.Block { - genesis := types.NewBlock(common.Hash{}, common.Address{}, common.Hash{}, params.GenesisDifficulty, 42, "") + genesis := types.NewBlock(common.Hash{}, common.Address{}, common.Hash{}, params.GenesisDifficulty, 42, nil) genesis.Header().Number = common.Big0 genesis.Header().GasLimit = params.GenesisGasLimit genesis.Header().GasUsed = common.Big0 diff --git a/core/types/block.go b/core/types/block.go index d5cd8a21e..116acbf79 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -39,7 +39,7 @@ type Header struct { // Creation time Time uint64 // Extra data - Extra string + Extra []byte // Mix digest for quick checking to prevent DOS MixDigest common.Hash // Nonce @@ -121,7 +121,7 @@ type storageblock struct { TD *big.Int } -func NewBlock(parentHash common.Hash, coinbase common.Address, root common.Hash, difficulty *big.Int, nonce uint64, extra string) *Block { +func NewBlock(parentHash common.Hash, coinbase common.Address, root common.Hash, difficulty *big.Int, nonce uint64, extra []byte) *Block { header := &Header{ Root: root, ParentHash: parentHash, @@ -371,7 +371,7 @@ func (self *Header) String() string { GasLimit: %v GasUsed: %v Time: %v - Extra: %v + Extra: %s MixDigest: %x Nonce: %x`, self.ParentHash, self.UncleHash, self.Coinbase, self.Root, self.TxHash, self.ReceiptHash, self.Bloom, self.Difficulty, self.Number, self.GasLimit, self.GasUsed, self.Time, self.Extra, self.MixDigest, self.Nonce) diff --git a/miner/miner.go b/miner/miner.go index 581de9674..23e48db40 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -13,7 +13,6 @@ type Miner struct { worker *worker MinAcceptedGasPrice *big.Int - Extra string mining bool eth core.Backend @@ -58,3 +57,7 @@ func (self *Miner) Stop() { func (self *Miner) HashRate() int64 { return self.worker.HashRate() } + +func (self *Miner) SetExtra(extra []byte) { + self.worker.extra = extra +} diff --git a/miner/worker.go b/miner/worker.go index 17afa25de..da10cf7cd 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -69,10 +69,12 @@ type worker struct { pow pow.PoW atWork int64 - eth core.Backend - chain *core.ChainManager - proc *core.BlockProcessor + eth core.Backend + chain *core.ChainManager + proc *core.BlockProcessor + coinbase common.Address + extra []byte current *environment @@ -213,6 +215,7 @@ func (self *worker) commitNewWork() { if block.Time() == self.chain.CurrentBlock().Time() { block.Header().Time++ } + block.Header().Extra = self.extra self.current = env(block, self.eth) for _, ancestor := range self.chain.GetAncestors(block, 7) { diff --git a/tests/blocktest.go b/tests/blocktest.go index 1c4f1c2f2..6b8ee9d4a 100644 --- a/tests/blocktest.go +++ b/tests/blocktest.go @@ -186,7 +186,7 @@ func mustConvertHeader(in btHeader) *types.Header { Coinbase: mustConvertAddress(in.Coinbase), UncleHash: mustConvertHash(in.UncleHash), ParentHash: mustConvertHash(in.ParentHash), - Extra: string(mustConvertBytes(in.ExtraData)), + Extra: mustConvertBytes(in.ExtraData), GasUsed: mustConvertBigInt10(in.GasUsed), GasLimit: mustConvertBigInt10(in.GasLimit), Difficulty: mustConvertBigInt10(in.Difficulty),