129 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package ethui
 | |
| 
 | |
| import (
 | |
| 	"encoding/hex"
 | |
| 	"fmt"
 | |
| 	"github.com/ethereum/eth-go/ethchain"
 | |
| 	"github.com/ethereum/eth-go/ethpub"
 | |
| 	"github.com/ethereum/eth-go/ethutil"
 | |
| 	"github.com/ethereum/go-ethereum/utils"
 | |
| 	"github.com/obscuren/secp256k1-go"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| type EthLib struct {
 | |
| 	stateManager *ethchain.StateManager
 | |
| 	blockChain   *ethchain.BlockChain
 | |
| 	txPool       *ethchain.TxPool
 | |
| 	Db           *Debugger
 | |
| }
 | |
| 
 | |
| func (lib *EthLib) ImportAndSetPrivKey(privKey string) bool {
 | |
| 	fmt.Println(privKey)
 | |
| 	mnemonic := strings.Split(privKey, " ")
 | |
| 	if len(mnemonic) == 24 {
 | |
| 		fmt.Println("Got mnemonic key, importing.")
 | |
| 		key := ethutil.MnemonicDecode(mnemonic)
 | |
| 		utils.ImportPrivateKey(key)
 | |
| 	} else if len(mnemonic) == 1 {
 | |
| 		fmt.Println("Got hex key, importing.")
 | |
| 		utils.ImportPrivateKey(privKey)
 | |
| 	} else {
 | |
| 		fmt.Println("Did not recognise format, exiting.")
 | |
| 		return false
 | |
| 	}
 | |
| 	return true
 | |
| }
 | |
| 
 | |
| func (lib *EthLib) CreateAndSetPrivKey() (string, string, string, string) {
 | |
| 	pub, prv := secp256k1.GenerateKeyPair()
 | |
| 	pair := ðutil.Key{PrivateKey: prv, PublicKey: pub}
 | |
| 	ethutil.Config.Db.Put([]byte("KeyRing"), pair.RlpEncode())
 | |
| 	mne := ethutil.MnemonicEncode(ethutil.Hex(prv))
 | |
| 	mnemonicString := strings.Join(mne, " ")
 | |
| 	return mnemonicString, fmt.Sprintf("%x", pair.Address()), fmt.Sprintf("%x", prv), fmt.Sprintf("%x", pub)
 | |
| }
 | |
| 
 | |
| func (lib *EthLib) GetKey() string {
 | |
| 	return ethutil.Hex(ethutil.Config.Db.GetKeys()[0].Address())
 | |
| }
 | |
| 
 | |
| func (lib *EthLib) GetStateObject(address string) *ethpub.PStateObject {
 | |
| 	stateObject := lib.stateManager.ProcState().GetContract(ethutil.FromHex(address))
 | |
| 	if stateObject != nil {
 | |
| 		return ethpub.NewPStateObject(stateObject)
 | |
| 	}
 | |
| 
 | |
| 	// See GetStorage for explanation on "nil"
 | |
| 	return ethpub.NewPStateObject(nil)
 | |
| }
 | |
| 
 | |
| func (lib *EthLib) Watch(addr, storageAddr string) {
 | |
| 	//	lib.stateManager.Watch(ethutil.FromHex(addr), ethutil.FromHex(storageAddr))
 | |
| }
 | |
| 
 | |
| func (lib *EthLib) CreateTx(recipient, valueStr, gasStr, gasPriceStr, dataStr string) (string, error) {
 | |
| 	return lib.Transact(recipient, valueStr, gasStr, gasPriceStr, dataStr)
 | |
| }
 | |
| 
 | |
| func (lib *EthLib) Transact(recipient, valueStr, gasStr, gasPriceStr, dataStr string) (string, error) {
 | |
| 	var hash []byte
 | |
| 	var contractCreation bool
 | |
| 	if len(recipient) == 0 {
 | |
| 		contractCreation = true
 | |
| 	} else {
 | |
| 		var err error
 | |
| 		hash, err = hex.DecodeString(recipient)
 | |
| 		if err != nil {
 | |
| 			return "", err
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	keyPair := ethutil.Config.Db.GetKeys()[0]
 | |
| 	value := ethutil.Big(valueStr)
 | |
| 	gas := ethutil.Big(gasStr)
 | |
| 	gasPrice := ethutil.Big(gasPriceStr)
 | |
| 	var tx *ethchain.Transaction
 | |
| 	// Compile and assemble the given data
 | |
| 	if contractCreation {
 | |
| 		// Compile script
 | |
| 		mainScript, initScript, err := utils.CompileScript(dataStr)
 | |
| 		if err != nil {
 | |
| 			return "", err
 | |
| 		}
 | |
| 
 | |
| 		tx = ethchain.NewContractCreationTx(value, gas, gasPrice, mainScript, initScript)
 | |
| 	} else {
 | |
| 		lines := strings.Split(dataStr, "\n")
 | |
| 		var data []byte
 | |
| 		for _, line := range lines {
 | |
| 			data = append(data, ethutil.BigToBytes(ethutil.Big(line), 256)...)
 | |
| 		}
 | |
| 
 | |
| 		tx = ethchain.NewTransactionMessage(hash, value, gas, gasPrice, data)
 | |
| 	}
 | |
| 	acc := lib.stateManager.GetAddrState(keyPair.Address())
 | |
| 	tx.Nonce = acc.Nonce
 | |
| 	tx.Sign(keyPair.PrivateKey)
 | |
| 	lib.txPool.QueueTransaction(tx)
 | |
| 
 | |
| 	if contractCreation {
 | |
| 		ethutil.Config.Log.Infof("Contract addr %x", tx.Hash()[12:])
 | |
| 	} else {
 | |
| 		ethutil.Config.Log.Infof("Tx hash %x", tx.Hash())
 | |
| 	}
 | |
| 
 | |
| 	return ethutil.Hex(tx.Hash()), nil
 | |
| }
 | |
| 
 | |
| func (lib *EthLib) GetBlock(hexHash string) *ethpub.PBlock {
 | |
| 	hash, err := hex.DecodeString(hexHash)
 | |
| 	if err != nil {
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	block := lib.blockChain.GetBlock(hash)
 | |
| 
 | |
| 	return ðpub.PBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Hex(block.Hash())}
 | |
| }
 |