소스 검색

Add loading of block test privkey if present

Gustav Simonsson 10 년 전
부모
커밋
34c94d5fcd
4개의 변경된 파일35개의 추가작업 그리고 9개의 파일을 삭제
  1. 1 1
      cmd/geth/blocktest.go
  2. 13 0
      crypto/crypto.go
  3. 1 1
      tests/block_test.go
  4. 20 7
      tests/block_test_util.go

+ 1 - 1
cmd/geth/blocktest.go

@@ -104,7 +104,7 @@ func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, er
 	ethereum.ResetWithGenesisBlock(test.Genesis)
 
 	// import pre accounts
-	statedb, err := test.InsertPreState(ethereum.StateDb())
+	statedb, err := test.InsertPreState(ethereum)
 	if err != nil {
 		return ethereum, fmt.Errorf("InsertPreState: %v", err)
 	}

+ 13 - 0
crypto/crypto.go

@@ -179,6 +179,19 @@ func Decrypt(prv *ecdsa.PrivateKey, ct []byte) ([]byte, error) {
 	return key.Decrypt(rand.Reader, ct, nil, nil)
 }
 
+// Used only by block tests.
+func ImportBlockTestKey(privKeyBytes []byte) error {
+	ks := NewKeyStorePassphrase(common.DefaultDataDir() + "/keys")
+	ecKey := ToECDSA(privKeyBytes)
+	key := &Key{
+		Id:         uuid.NewRandom(),
+		Address:    PubkeyToAddress(ecKey.PublicKey),
+		PrivateKey: ecKey,
+	}
+	err := ks.StoreKey(key, "")
+	return err
+}
+
 // creates a Key and stores that in the given KeyStore by decrypting a presale key JSON
 func ImportPreSaleKey(keyStore KeyStore2, keyJSON []byte, password string) (*Key, error) {
 	key, err := decryptPreSaleKey(keyJSON, password)

+ 1 - 1
tests/block_test.go

@@ -87,7 +87,7 @@ func runBlockTest(name string, test *BlockTest, t *testing.T) {
 	ethereum.ResetWithGenesisBlock(test.Genesis)
 
 	// import pre accounts
-	statedb, err := test.InsertPreState(ethereum.StateDb())
+	statedb, err := test.InsertPreState(ethereum)
 	if err != nil {
 		t.Fatalf("InsertPreState: %v", err)
 	}

+ 20 - 7
tests/block_test_util.go

@@ -10,11 +10,14 @@ import (
 	"runtime"
 	"strconv"
 	"strings"
+	"time"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core"
 	"github.com/ethereum/go-ethereum/core/state"
 	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/crypto"
+	"github.com/ethereum/go-ethereum/eth"
 	"github.com/ethereum/go-ethereum/rlp"
 )
 
@@ -41,10 +44,11 @@ type btBlock struct {
 }
 
 type btAccount struct {
-	Balance string
-	Code    string
-	Nonce   string
-	Storage map[string]string
+	Balance    string
+	Code       string
+	Nonce      string
+	Storage    map[string]string
+	PrivateKey string
 }
 
 type btHeader struct {
@@ -97,15 +101,24 @@ func LoadBlockTests(file string) (map[string]*BlockTest, error) {
 
 // InsertPreState populates the given database with the genesis
 // accounts defined by the test.
-func (t *BlockTest) InsertPreState(db common.Database) (*state.StateDB, error) {
+func (t *BlockTest) InsertPreState(ethereum *eth.Ethereum) (*state.StateDB, error) {
+	db := ethereum.StateDb()
 	statedb := state.New(common.Hash{}, db)
 	for addrString, acct := range t.preAccounts {
-		// XXX: is is worth it checking for errors here?
-		//addr, _ := hex.DecodeString(addrString)
+		addr, _ := hex.DecodeString(addrString)
 		code, _ := hex.DecodeString(strings.TrimPrefix(acct.Code, "0x"))
 		balance, _ := new(big.Int).SetString(acct.Balance, 0)
 		nonce, _ := strconv.ParseUint(acct.Nonce, 16, 64)
 
+		if acct.PrivateKey != "" {
+			privkey, err := hex.DecodeString(strings.TrimPrefix(acct.PrivateKey, "0x"))
+			err = crypto.ImportBlockTestKey(privkey)
+			err = ethereum.AccountManager().TimedUnlock(addr, "", 999999*time.Second)
+			if err != nil {
+				return nil, err
+			}
+		}
+
 		obj := statedb.CreateAccount(common.HexToAddress(addrString))
 		obj.SetCode(code)
 		obj.SetBalance(balance)