Merge branch 'develop' into feature/rpc
This commit is contained in:
		
						commit
						231ad9b562
					
				| @ -16,8 +16,8 @@ function createTransaction() { | |||||||
| 	var amount = document.querySelector("#amount").value; | 	var amount = document.querySelector("#amount").value; | ||||||
| 
 | 
 | ||||||
| 	var data = (("0x"+addr).pad(32) + amount.pad(32)).unbin() | 	var data = (("0x"+addr).pad(32) + amount.pad(32)).unbin() | ||||||
| 	eth.transact(mAddr, jefcoinAddr, 0, "10000000", "250", data, function(tx) { | 	eth.transact(mAddr, jefcoinAddr, 0, "10000000", "250", data, function(receipt) { | ||||||
| 		debug("received tx hash:", tx) | 		debug("received tx hash:", receipt) | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,8 +3,8 @@ package ethui | |||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"github.com/ethereum/eth-go/ethchain" | 	"github.com/ethereum/eth-go/ethchain" | ||||||
|  | 	"github.com/ethereum/eth-go/ethpub" | ||||||
| 	"github.com/ethereum/eth-go/ethutil" | 	"github.com/ethereum/eth-go/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/utils" |  | ||||||
| 	"github.com/go-qml/qml" | 	"github.com/go-qml/qml" | ||||||
| 	"math/big" | 	"math/big" | ||||||
| ) | ) | ||||||
| @ -22,7 +22,7 @@ type AppContainer interface { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type ExtApplication struct { | type ExtApplication struct { | ||||||
| 	*utils.PEthereum | 	*ethpub.PEthereum | ||||||
| 
 | 
 | ||||||
| 	blockChan  chan ethutil.React | 	blockChan  chan ethutil.React | ||||||
| 	changeChan chan ethutil.React | 	changeChan chan ethutil.React | ||||||
| @ -35,7 +35,7 @@ type ExtApplication struct { | |||||||
| 
 | 
 | ||||||
| func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { | func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { | ||||||
| 	app := &ExtApplication{ | 	app := &ExtApplication{ | ||||||
| 		utils.NewPEthereum(lib.eth), | 		ethpub.NewPEthereum(lib.eth), | ||||||
| 		make(chan ethutil.React, 1), | 		make(chan ethutil.React, 1), | ||||||
| 		make(chan ethutil.React, 1), | 		make(chan ethutil.React, 1), | ||||||
| 		make(chan bool), | 		make(chan bool), | ||||||
|  | |||||||
| @ -6,8 +6,8 @@ import ( | |||||||
| 	"github.com/ethereum/eth-go" | 	"github.com/ethereum/eth-go" | ||||||
| 	"github.com/ethereum/eth-go/ethchain" | 	"github.com/ethereum/eth-go/ethchain" | ||||||
| 	"github.com/ethereum/eth-go/ethdb" | 	"github.com/ethereum/eth-go/ethdb" | ||||||
|  | 	"github.com/ethereum/eth-go/ethpub" | ||||||
| 	"github.com/ethereum/eth-go/ethutil" | 	"github.com/ethereum/eth-go/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/utils" |  | ||||||
| 	"github.com/go-qml/qml" | 	"github.com/go-qml/qml" | ||||||
| 	"math/big" | 	"math/big" | ||||||
| 	"strings" | 	"strings" | ||||||
| @ -57,9 +57,9 @@ func (ui *Gui) Start(assetPath string) { | |||||||
| 
 | 
 | ||||||
| 	// Register ethereum functions
 | 	// Register ethereum functions
 | ||||||
| 	qml.RegisterTypes("Ethereum", 1, 0, []qml.TypeSpec{{ | 	qml.RegisterTypes("Ethereum", 1, 0, []qml.TypeSpec{{ | ||||||
| 		Init: func(p *utils.PBlock, obj qml.Object) { p.Number = 0; p.Hash = "" }, | 		Init: func(p *ethpub.PBlock, obj qml.Object) { p.Number = 0; p.Hash = "" }, | ||||||
| 	}, { | 	}, { | ||||||
| 		Init: func(p *utils.PTx, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" }, | 		Init: func(p *ethpub.PTx, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" }, | ||||||
| 	}}) | 	}}) | ||||||
| 
 | 
 | ||||||
| 	ethutil.Config.SetClientString(fmt.Sprintf("/Ethereal v%s", "0.2")) | 	ethutil.Config.SetClientString(fmt.Sprintf("/Ethereal v%s", "0.2")) | ||||||
| @ -130,13 +130,13 @@ func (ui *Gui) readPreviousTransactions() { | |||||||
| 	for it.Next() { | 	for it.Next() { | ||||||
| 		tx := ethchain.NewTransactionFromBytes(it.Value()) | 		tx := ethchain.NewTransactionFromBytes(it.Value()) | ||||||
| 
 | 
 | ||||||
| 		ui.win.Root().Call("addTx", utils.NewPTx(tx)) | 		ui.win.Root().Call("addTx", ethpub.NewPTx(tx)) | ||||||
| 	} | 	} | ||||||
| 	it.Release() | 	it.Release() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ui *Gui) ProcessBlock(block *ethchain.Block) { | func (ui *Gui) ProcessBlock(block *ethchain.Block) { | ||||||
| 	ui.win.Root().Call("addBlock", utils.NewPBlock(block)) | 	ui.win.Root().Call("addBlock", ethpub.NewPBlock(block)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Simple go routine function that updates the list of peers in the GUI
 | // Simple go routine function that updates the list of peers in the GUI
 | ||||||
| @ -157,13 +157,13 @@ func (ui *Gui) update() { | |||||||
| 
 | 
 | ||||||
| 			if txMsg.Type == ethchain.TxPre { | 			if txMsg.Type == ethchain.TxPre { | ||||||
| 				if bytes.Compare(tx.Sender(), ui.addr) == 0 && addrState.Nonce <= tx.Nonce { | 				if bytes.Compare(tx.Sender(), ui.addr) == 0 && addrState.Nonce <= tx.Nonce { | ||||||
| 					ui.win.Root().Call("addTx", utils.NewPTx(tx)) | 					ui.win.Root().Call("addTx", ethpub.NewPTx(tx)) | ||||||
| 					ui.txDb.Put(tx.Hash(), tx.RlpEncode()) | 					ui.txDb.Put(tx.Hash(), tx.RlpEncode()) | ||||||
| 
 | 
 | ||||||
| 					addrState.Nonce += 1 | 					addrState.Nonce += 1 | ||||||
| 					unconfirmedFunds.Sub(unconfirmedFunds, tx.Value) | 					unconfirmedFunds.Sub(unconfirmedFunds, tx.Value) | ||||||
| 				} else if bytes.Compare(tx.Recipient, ui.addr) == 0 { | 				} else if bytes.Compare(tx.Recipient, ui.addr) == 0 { | ||||||
| 					ui.win.Root().Call("addTx", utils.NewPTx(tx)) | 					ui.win.Root().Call("addTx", ethpub.NewPTx(tx)) | ||||||
| 					ui.txDb.Put(tx.Hash(), tx.RlpEncode()) | 					ui.txDb.Put(tx.Hash(), tx.RlpEncode()) | ||||||
| 
 | 
 | ||||||
| 					unconfirmedFunds.Add(unconfirmedFunds, tx.Value) | 					unconfirmedFunds.Add(unconfirmedFunds, tx.Value) | ||||||
|  | |||||||
| @ -3,8 +3,8 @@ package ethui | |||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"github.com/ethereum/eth-go/ethchain" | 	"github.com/ethereum/eth-go/ethchain" | ||||||
|  | 	"github.com/ethereum/eth-go/ethpub" | ||||||
| 	"github.com/ethereum/eth-go/ethutil" | 	"github.com/ethereum/eth-go/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/utils" |  | ||||||
| 	"github.com/go-qml/qml" | 	"github.com/go-qml/qml" | ||||||
| 	"math/big" | 	"math/big" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| @ -57,12 +57,12 @@ func (app *HtmlApplication) Window() *qml.Window { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (app *HtmlApplication) NewBlock(block *ethchain.Block) { | func (app *HtmlApplication) NewBlock(block *ethchain.Block) { | ||||||
| 	b := &utils.PBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Hex(block.Hash())} | 	b := ðpub.PBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Hex(block.Hash())} | ||||||
| 	app.webView.Call("onNewBlockCb", b) | 	app.webView.Call("onNewBlockCb", b) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (app *HtmlApplication) ObjectChanged(stateObject *ethchain.StateObject) { | func (app *HtmlApplication) ObjectChanged(stateObject *ethchain.StateObject) { | ||||||
| 	app.webView.Call("onObjectChangeCb", utils.NewPStateObject(stateObject)) | 	app.webView.Call("onObjectChangeCb", ethpub.NewPStateObject(stateObject)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (app *HtmlApplication) StorageChanged(stateObject *ethchain.StateObject, addr []byte, value *big.Int) { | func (app *HtmlApplication) StorageChanged(stateObject *ethchain.StateObject, addr []byte, value *big.Int) { | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ import ( | |||||||
| 	"encoding/hex" | 	"encoding/hex" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"github.com/ethereum/eth-go/ethchain" | 	"github.com/ethereum/eth-go/ethchain" | ||||||
|  | 	"github.com/ethereum/eth-go/ethpub" | ||||||
| 	"github.com/ethereum/eth-go/ethutil" | 	"github.com/ethereum/eth-go/ethutil" | ||||||
| 	"github.com/ethereum/go-ethereum/utils" | 	"github.com/ethereum/go-ethereum/utils" | ||||||
| 	"github.com/obscuren/secp256k1-go" | 	"github.com/obscuren/secp256k1-go" | ||||||
| @ -47,14 +48,14 @@ func (lib *EthLib) GetKey() string { | |||||||
| 	return ethutil.Hex(ethutil.Config.Db.GetKeys()[0].Address()) | 	return ethutil.Hex(ethutil.Config.Db.GetKeys()[0].Address()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (lib *EthLib) GetStateObject(address string) *utils.PStateObject { | func (lib *EthLib) GetStateObject(address string) *ethpub.PStateObject { | ||||||
| 	stateObject := lib.stateManager.ProcState().GetContract(ethutil.FromHex(address)) | 	stateObject := lib.stateManager.ProcState().GetContract(ethutil.FromHex(address)) | ||||||
| 	if stateObject != nil { | 	if stateObject != nil { | ||||||
| 		return utils.NewPStateObject(stateObject) | 		return ethpub.NewPStateObject(stateObject) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// See GetStorage for explanation on "nil"
 | 	// See GetStorage for explanation on "nil"
 | ||||||
| 	return utils.NewPStateObject(nil) | 	return ethpub.NewPStateObject(nil) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (lib *EthLib) Watch(addr, storageAddr string) { | func (lib *EthLib) Watch(addr, storageAddr string) { | ||||||
| @ -115,7 +116,7 @@ func (lib *EthLib) Transact(recipient, valueStr, gasStr, gasPriceStr, dataStr st | |||||||
| 	return ethutil.Hex(tx.Hash()), nil | 	return ethutil.Hex(tx.Hash()), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (lib *EthLib) GetBlock(hexHash string) *utils.PBlock { | func (lib *EthLib) GetBlock(hexHash string) *ethpub.PBlock { | ||||||
| 	hash, err := hex.DecodeString(hexHash) | 	hash, err := hex.DecodeString(hexHash) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil | 		return nil | ||||||
| @ -123,5 +124,5 @@ func (lib *EthLib) GetBlock(hexHash string) *utils.PBlock { | |||||||
| 
 | 
 | ||||||
| 	block := lib.blockChain.GetBlock(hash) | 	block := lib.blockChain.GetBlock(hash) | ||||||
| 
 | 
 | ||||||
| 	return &utils.PBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Hex(block.Hash())} | 	return ðpub.PBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Hex(block.Hash())} | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,110 +0,0 @@ | |||||||
| package utils |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"github.com/ethereum/eth-go" |  | ||||||
| 	"github.com/ethereum/eth-go/ethchain" |  | ||||||
| 	"github.com/ethereum/eth-go/ethutil" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type PEthereum struct { |  | ||||||
| 	stateManager *ethchain.StateManager |  | ||||||
| 	blockChain   *ethchain.BlockChain |  | ||||||
| 	txPool       *ethchain.TxPool |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewPEthereum(eth *eth.Ethereum) *PEthereum { |  | ||||||
| 	return &PEthereum{ |  | ||||||
| 		eth.StateManager(), |  | ||||||
| 		eth.BlockChain(), |  | ||||||
| 		eth.TxPool(), |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (lib *PEthereum) GetBlock(hexHash string) *PBlock { |  | ||||||
| 	hash := ethutil.FromHex(hexHash) |  | ||||||
| 
 |  | ||||||
| 	block := lib.blockChain.GetBlock(hash) |  | ||||||
| 
 |  | ||||||
| 	return &PBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Hex(block.Hash())} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (lib *PEthereum) GetKey() *PKey { |  | ||||||
| 	keyPair, err := ethchain.NewKeyPairFromSec(ethutil.Config.Db.GetKeys()[0].PrivateKey) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return NewPKey(keyPair) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (lib *PEthereum) GetStateObject(address string) *PStateObject { |  | ||||||
| 	stateObject := lib.stateManager.ProcState().GetContract(ethutil.FromHex(address)) |  | ||||||
| 	if stateObject != nil { |  | ||||||
| 		return NewPStateObject(stateObject) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// See GetStorage for explanation on "nil"
 |  | ||||||
| 	return NewPStateObject(nil) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (lib *PEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) (string, error) { |  | ||||||
| 	return lib.createTx(key, recipient, valueStr, gasStr, gasPriceStr, dataStr, "") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (lib *PEthereum) Create(key, valueStr, gasStr, gasPriceStr, initStr, bodyStr string) (string, error) { |  | ||||||
| 	return lib.createTx(key, "", valueStr, gasStr, gasPriceStr, initStr, bodyStr) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, initStr, scriptStr string) (string, error) { |  | ||||||
| 	var hash []byte |  | ||||||
| 	var contractCreation bool |  | ||||||
| 	if len(recipient) == 0 { |  | ||||||
| 		contractCreation = true |  | ||||||
| 	} else { |  | ||||||
| 		hash = ethutil.FromHex(recipient) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	keyPair, err := ethchain.NewKeyPairFromSec([]byte(ethutil.FromHex(key))) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return "", err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	value := ethutil.Big(valueStr) |  | ||||||
| 	gas := ethutil.Big(gasStr) |  | ||||||
| 	gasPrice := ethutil.Big(gasPriceStr) |  | ||||||
| 	var tx *ethchain.Transaction |  | ||||||
| 	// Compile and assemble the given data
 |  | ||||||
| 	if contractCreation { |  | ||||||
| 		initScript, err := Compile(initStr) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return "", err |  | ||||||
| 		} |  | ||||||
| 		mainScript, err := Compile(scriptStr) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return "", err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		tx = ethchain.NewContractCreationTx(value, gas, gasPrice, mainScript, initScript) |  | ||||||
| 	} else { |  | ||||||
| 		// Just in case it was submitted as a 0x prefixed string
 |  | ||||||
| 		if initStr[0:2] == "0x" { |  | ||||||
| 			initStr = initStr[2:len(initStr)] |  | ||||||
| 		} |  | ||||||
| 		fmt.Println("DATA:", initStr) |  | ||||||
| 		tx = ethchain.NewTransactionMessage(hash, value, gas, gasPrice, ethutil.FromHex(initStr)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	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 |  | ||||||
| } |  | ||||||
| @ -1,91 +0,0 @@ | |||||||
| package utils |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"encoding/hex" |  | ||||||
| 	"github.com/ethereum/eth-go/ethchain" |  | ||||||
| 	"github.com/ethereum/eth-go/ethutil" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // Block interface exposed to QML
 |  | ||||||
| type PBlock struct { |  | ||||||
| 	Number int |  | ||||||
| 	Hash   string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Creates a new QML Block from a chain block
 |  | ||||||
| func NewPBlock(block *ethchain.Block) *PBlock { |  | ||||||
| 	info := block.BlockInfo() |  | ||||||
| 	hash := hex.EncodeToString(block.Hash()) |  | ||||||
| 
 |  | ||||||
| 	return &PBlock{Number: int(info.Number), Hash: hash} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type PTx struct { |  | ||||||
| 	Value, Hash, Address string |  | ||||||
| 	Contract             bool |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewPTx(tx *ethchain.Transaction) *PTx { |  | ||||||
| 	hash := hex.EncodeToString(tx.Hash()) |  | ||||||
| 	sender := hex.EncodeToString(tx.Recipient) |  | ||||||
| 	isContract := len(tx.Data) > 0 |  | ||||||
| 
 |  | ||||||
| 	return &PTx{Hash: hash, Value: ethutil.CurrencyToString(tx.Value), Address: sender, Contract: isContract} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type PKey struct { |  | ||||||
| 	Address    string |  | ||||||
| 	PrivateKey string |  | ||||||
| 	PublicKey  string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewPKey(key *ethchain.KeyPair) *PKey { |  | ||||||
| 	return &PKey{ethutil.Hex(key.Address()), ethutil.Hex(key.PrivateKey), ethutil.Hex(key.PublicKey)} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* |  | ||||||
| type PKeyRing struct { |  | ||||||
| 	Keys []interface{} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewPKeyRing(keys []interface{}) *PKeyRing { |  | ||||||
| 	return &PKeyRing{Keys: keys} |  | ||||||
| } |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| type PStateObject struct { |  | ||||||
| 	object *ethchain.StateObject |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewPStateObject(object *ethchain.StateObject) *PStateObject { |  | ||||||
| 	return &PStateObject{object: object} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *PStateObject) GetStorage(address string) string { |  | ||||||
| 	// Because somehow, even if you return nil to QML it
 |  | ||||||
| 	// still has some magical object so we can't rely on
 |  | ||||||
| 	// undefined or null at the QML side
 |  | ||||||
| 	if c.object != nil { |  | ||||||
| 		val := c.object.GetMem(ethutil.Big("0x" + address)) |  | ||||||
| 
 |  | ||||||
| 		return val.BigInt().String() |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *PStateObject) Value() string { |  | ||||||
| 	if c.object != nil { |  | ||||||
| 		return c.object.Amount.String() |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (c *PStateObject) Address() string { |  | ||||||
| 	if c.object != nil { |  | ||||||
| 		return ethutil.Hex(c.object.Address()) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return "" |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user