cmd/blocktest: delete package
Blocktests are now integrated in cmd/ethereum.
This commit is contained in:
		@@ -1,213 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
	This file is part of go-ethereum
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	go-ethereum is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
	it under the terms of the GNU Lesser General Public License as published by
 | 
					 | 
				
			||||||
	the Free Software Foundation, either version 3 of the License, or
 | 
					 | 
				
			||||||
	(at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	go-ethereum is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
	but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
	GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
	along with go-ethereum.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @authors
 | 
					 | 
				
			||||||
 * 	Gustav Simonsson <gustav.simonsson@gmail.com>
 | 
					 | 
				
			||||||
 * @date 2015
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package main
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bytes"
 | 
					 | 
				
			||||||
	"encoding/hex"
 | 
					 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"flag"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
	"log"
 | 
					 | 
				
			||||||
	"math/big"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"runtime"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/cmd/utils"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/core"
 | 
					 | 
				
			||||||
	types "github.com/ethereum/go-ethereum/core/types"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/ethdb"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/event"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger"
 | 
					 | 
				
			||||||
	"github.com/ethereum/go-ethereum/rlp"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type Account struct {
 | 
					 | 
				
			||||||
	Balance string
 | 
					 | 
				
			||||||
	Code    string
 | 
					 | 
				
			||||||
	Nonce   string
 | 
					 | 
				
			||||||
	Storage map[string]string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type BlockHeader struct {
 | 
					 | 
				
			||||||
	Bloom            string
 | 
					 | 
				
			||||||
	Coinbase         string
 | 
					 | 
				
			||||||
	Difficulty       string
 | 
					 | 
				
			||||||
	ExtraData        string
 | 
					 | 
				
			||||||
	GasLimit         string
 | 
					 | 
				
			||||||
	GasUsed          string
 | 
					 | 
				
			||||||
	MixHash          string
 | 
					 | 
				
			||||||
	Nonce            string
 | 
					 | 
				
			||||||
	Number           string
 | 
					 | 
				
			||||||
	ParentHash       string
 | 
					 | 
				
			||||||
	ReceiptTrie      string
 | 
					 | 
				
			||||||
	SeedHash         string
 | 
					 | 
				
			||||||
	StateRoot        string
 | 
					 | 
				
			||||||
	Timestamp        string
 | 
					 | 
				
			||||||
	TransactionsTrie string
 | 
					 | 
				
			||||||
	UncleHash        string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type Tx struct {
 | 
					 | 
				
			||||||
	Data     string
 | 
					 | 
				
			||||||
	GasLimit string
 | 
					 | 
				
			||||||
	GasPrice string
 | 
					 | 
				
			||||||
	Nonce    string
 | 
					 | 
				
			||||||
	R        string
 | 
					 | 
				
			||||||
	S        string
 | 
					 | 
				
			||||||
	To       string
 | 
					 | 
				
			||||||
	V        string
 | 
					 | 
				
			||||||
	Value    string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type Block struct {
 | 
					 | 
				
			||||||
	BlockHeader  BlockHeader
 | 
					 | 
				
			||||||
	Rlp          string
 | 
					 | 
				
			||||||
	Transactions []Tx
 | 
					 | 
				
			||||||
	UncleHeaders []string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type Test struct {
 | 
					 | 
				
			||||||
	Blocks             []Block
 | 
					 | 
				
			||||||
	GenesisBlockHeader BlockHeader
 | 
					 | 
				
			||||||
	Pre                map[string]Account
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	flag.Usage = func() {
 | 
					 | 
				
			||||||
		fmt.Fprintf(os.Stderr, "%s <testfile>\n", os.Args[0])
 | 
					 | 
				
			||||||
		flag.PrintDefaults()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	flag.Parse()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	runtime.GOMAXPROCS(runtime.NumCPU())
 | 
					 | 
				
			||||||
	logger.AddLogSystem(logger.NewStdLogSystem(os.Stderr, log.LstdFlags, logger.DebugDetailLevel))
 | 
					 | 
				
			||||||
	defer func() { logger.Flush() }()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(os.Args) < 2 {
 | 
					 | 
				
			||||||
		utils.Fatalf("Please specify a test file as the first argument.")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	blocks, err := loadBlocksFromTestFile(os.Args[1])
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		utils.Fatalf("Could not load blocks: %v", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	chain := memchain()
 | 
					 | 
				
			||||||
	chain.ResetWithGenesisBlock(blocks[0])
 | 
					 | 
				
			||||||
	if err = chain.InsertChain(types.Blocks{blocks[1]}); err != nil {
 | 
					 | 
				
			||||||
		utils.Fatalf("Error: %v", err)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		fmt.Println("PASS")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func memchain() *core.ChainManager {
 | 
					 | 
				
			||||||
	blockdb, err := ethdb.NewMemDatabase()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		utils.Fatalf("Could not create in-memory database: %v", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	statedb, err := ethdb.NewMemDatabase()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		utils.Fatalf("Could not create in-memory database: %v", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return core.NewChainManager(blockdb, statedb, new(event.TypeMux))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func loadBlocksFromTestFile(filePath string) (blocks types.Blocks, err error) {
 | 
					 | 
				
			||||||
	fileContent, err := ioutil.ReadFile(filePath)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	bt := make(map[string]Test)
 | 
					 | 
				
			||||||
	if err = json.Unmarshal(fileContent, &bt); err != nil {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// TODO: support multiple blocks; loop over all blocks
 | 
					 | 
				
			||||||
	gbh := new(types.Header)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Let's use slighlty different namings for the same things, because that's awesome.
 | 
					 | 
				
			||||||
	gbh.ParentHash, err = hex_decode(bt["SimpleTx"].GenesisBlockHeader.ParentHash)
 | 
					 | 
				
			||||||
	gbh.UncleHash, err = hex_decode(bt["SimpleTx"].GenesisBlockHeader.UncleHash)
 | 
					 | 
				
			||||||
	gbh.Coinbase, err = hex_decode(bt["SimpleTx"].GenesisBlockHeader.Coinbase)
 | 
					 | 
				
			||||||
	gbh.Root, err = hex_decode(bt["SimpleTx"].GenesisBlockHeader.StateRoot)
 | 
					 | 
				
			||||||
	gbh.TxHash, err = hex_decode(bt["SimpleTx"].GenesisBlockHeader.TransactionsTrie)
 | 
					 | 
				
			||||||
	gbh.ReceiptHash, err = hex_decode(bt["SimpleTx"].GenesisBlockHeader.ReceiptTrie)
 | 
					 | 
				
			||||||
	gbh.Bloom, err = hex_decode(bt["SimpleTx"].GenesisBlockHeader.Bloom)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	gbh.MixDigest, err = hex_decode(bt["SimpleTx"].GenesisBlockHeader.MixHash)
 | 
					 | 
				
			||||||
	//gbh.SeedHash, err = hex_decode(bt["SimpleTx"].GenesisBlockHeader.SeedHash)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	d, _ := new(big.Int).SetString(bt["SimpleTx"].GenesisBlockHeader.Difficulty, 10)
 | 
					 | 
				
			||||||
	gbh.Difficulty = d
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	n, _ := new(big.Int).SetString(bt["SimpleTx"].GenesisBlockHeader.Number, 10)
 | 
					 | 
				
			||||||
	gbh.Number = n
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	gl, _ := new(big.Int).SetString(bt["SimpleTx"].GenesisBlockHeader.GasLimit, 10)
 | 
					 | 
				
			||||||
	gbh.GasLimit = gl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	gu, _ := new(big.Int).SetString(bt["SimpleTx"].GenesisBlockHeader.GasUsed, 10)
 | 
					 | 
				
			||||||
	gbh.GasUsed = gu
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ts, _ := new(big.Int).SetString(bt["SimpleTx"].GenesisBlockHeader.Timestamp, 0)
 | 
					 | 
				
			||||||
	gbh.Time = ts.Uint64()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	extra, err := hex_decode(bt["SimpleTx"].GenesisBlockHeader.ExtraData)
 | 
					 | 
				
			||||||
	gbh.Extra = string(extra) // TODO: change ExtraData to byte array
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	nonce, _ := hex_decode(bt["SimpleTx"].GenesisBlockHeader.Nonce)
 | 
					 | 
				
			||||||
	gbh.Nonce = nonce
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	gb := types.NewBlockWithHeader(gbh)
 | 
					 | 
				
			||||||
	//gb.uncles = *new([]*types.Header)
 | 
					 | 
				
			||||||
	//gb.transactions = *new(types.Transactions)
 | 
					 | 
				
			||||||
	gb.Td = new(big.Int)
 | 
					 | 
				
			||||||
	gb.Reward = new(big.Int)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	testBlock := new(types.Block)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rlpBytes, err := hex_decode(bt["SimpleTx"].Blocks[0].Rlp)
 | 
					 | 
				
			||||||
	err = rlp.Decode(bytes.NewReader(rlpBytes), &testBlock)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	blocks = types.Blocks{
 | 
					 | 
				
			||||||
		gb,
 | 
					 | 
				
			||||||
		testBlock,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func hex_decode(s string) (res []byte, err error) {
 | 
					 | 
				
			||||||
	return hex.DecodeString(strings.TrimPrefix(s, "0x"))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user