diff options
author | obscuren <geffobscura@gmail.com> | 2014-05-05 21:56:05 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-05-05 21:56:05 +0800 |
commit | a77dcd10414e94fbd255931b0a539bbfefd91f56 (patch) | |
tree | 5c804987152d89c4915a433bb79fcb7b95c6364c /ethereal/ui/library.go | |
parent | 1323f60c074297c97397d20dd275124da2f5b531 (diff) | |
parent | 70221c36e381e98bf3e92913f48fb94d18da8ef5 (diff) | |
download | dexon-a77dcd10414e94fbd255931b0a539bbfefd91f56.tar.gz dexon-a77dcd10414e94fbd255931b0a539bbfefd91f56.tar.zst dexon-a77dcd10414e94fbd255931b0a539bbfefd91f56.zip |
Merge branch 'release/poc5-rc1'
Diffstat (limited to 'ethereal/ui/library.go')
-rw-r--r-- | ethereal/ui/library.go | 102 |
1 files changed, 85 insertions, 17 deletions
diff --git a/ethereal/ui/library.go b/ethereal/ui/library.go index 05fffd579..1328cd6b7 100644 --- a/ethereal/ui/library.go +++ b/ethereal/ui/library.go @@ -4,7 +4,10 @@ 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" ) @@ -12,49 +15,114 @@ type EthLib struct { stateManager *ethchain.StateManager blockChain *ethchain.BlockChain txPool *ethchain.TxPool + Db *Debugger } -func (lib *EthLib) CreateTx(receiver, a, data string) string { +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 - if len(receiver) == 0 { - hash = ethchain.ContractAddr + var contractCreation bool + if len(recipient) == 0 { + contractCreation = true } else { var err error - hash, err = hex.DecodeString(receiver) + hash, err = hex.DecodeString(recipient) if err != nil { - return err.Error() + return "", err } } - k, _ := ethutil.Config.Db.Get([]byte("KeyRing")) - keyPair := ethutil.NewKeyFromBytes(k) + 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 + } - amount := ethutil.Big(a) - code := ethchain.Compile(strings.Split(data, "\n")) - tx := ethchain.NewTransaction(hash, amount, code) - tx.Nonce = lib.stateManager.GetAddrState(keyPair.Address()).Nonce + 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 len(receiver) == 0 { + 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()) + return ethutil.Hex(tx.Hash()), nil } -func (lib *EthLib) GetBlock(hexHash string) *Block { +func (lib *EthLib) GetBlock(hexHash string) *ethpub.PBlock { hash, err := hex.DecodeString(hexHash) if err != nil { return nil } block := lib.blockChain.GetBlock(hash) - fmt.Println(block) - return &Block{Number: int(block.BlockInfo().Number), Hash: ethutil.Hex(block.Hash())} + return ðpub.PBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Hex(block.Hash())} } |