Browse Source

Block header changed & console miner control

* miner control moved to `admin.miner`
* miner option to set extra data
* block extra now bytes
obscuren 10 năm trước cách đây
mục cha
commit
9c55576c7b
8 tập tin đã thay đổi với 41 bổ sung14 xóa
  1. 24 3
      cmd/geth/admin.go
  2. 1 1
      core/chain_makers.go
  3. 1 1
      core/chain_manager.go
  4. 1 1
      core/genesis.go
  5. 3 3
      core/types/block.go
  6. 4 1
      miner/miner.go
  7. 6 3
      miner/worker.go
  8. 1 1
      tests/blocktest.go

+ 24 - 3
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 {

+ 1 - 1
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)

+ 1 - 1
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)

+ 1 - 1
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

+ 3 - 3
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)

+ 4 - 1
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
+}

+ 6 - 3
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) {

+ 1 - 1
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),