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 data = (("0x"+addr).pad(32) + amount.pad(32)).unbin() | ||||
| 	eth.transact(mAddr, jefcoinAddr, 0, "10000000", "250", data, function(tx) { | ||||
| 		debug("received tx hash:", tx) | ||||
| 	eth.transact(mAddr, jefcoinAddr, 0, "10000000", "250", data, function(receipt) { | ||||
| 		debug("received tx hash:", receipt) | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -3,8 +3,8 @@ package ethui | ||||
| import ( | ||||
| 	"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/go-qml/qml" | ||||
| 	"math/big" | ||||
| ) | ||||
| @ -22,7 +22,7 @@ type AppContainer interface { | ||||
| } | ||||
| 
 | ||||
| type ExtApplication struct { | ||||
| 	*utils.PEthereum | ||||
| 	*ethpub.PEthereum | ||||
| 
 | ||||
| 	blockChan  chan ethutil.React | ||||
| 	changeChan chan ethutil.React | ||||
| @ -35,7 +35,7 @@ type ExtApplication struct { | ||||
| 
 | ||||
| func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { | ||||
| 	app := &ExtApplication{ | ||||
| 		utils.NewPEthereum(lib.eth), | ||||
| 		ethpub.NewPEthereum(lib.eth), | ||||
| 		make(chan ethutil.React, 1), | ||||
| 		make(chan ethutil.React, 1), | ||||
| 		make(chan bool), | ||||
|  | ||||
| @ -6,8 +6,8 @@ import ( | ||||
| 	"github.com/ethereum/eth-go" | ||||
| 	"github.com/ethereum/eth-go/ethchain" | ||||
| 	"github.com/ethereum/eth-go/ethdb" | ||||
| 	"github.com/ethereum/eth-go/ethpub" | ||||
| 	"github.com/ethereum/eth-go/ethutil" | ||||
| 	"github.com/ethereum/go-ethereum/utils" | ||||
| 	"github.com/go-qml/qml" | ||||
| 	"math/big" | ||||
| 	"strings" | ||||
| @ -57,9 +57,9 @@ func (ui *Gui) Start(assetPath string) { | ||||
| 
 | ||||
| 	// Register ethereum functions
 | ||||
| 	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")) | ||||
| @ -130,13 +130,13 @@ func (ui *Gui) readPreviousTransactions() { | ||||
| 	for it.Next() { | ||||
| 		tx := ethchain.NewTransactionFromBytes(it.Value()) | ||||
| 
 | ||||
| 		ui.win.Root().Call("addTx", utils.NewPTx(tx)) | ||||
| 		ui.win.Root().Call("addTx", ethpub.NewPTx(tx)) | ||||
| 	} | ||||
| 	it.Release() | ||||
| } | ||||
| 
 | ||||
| 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
 | ||||
| @ -157,13 +157,13 @@ func (ui *Gui) update() { | ||||
| 
 | ||||
| 			if txMsg.Type == ethchain.TxPre { | ||||
| 				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()) | ||||
| 
 | ||||
| 					addrState.Nonce += 1 | ||||
| 					unconfirmedFunds.Sub(unconfirmedFunds, tx.Value) | ||||
| 				} 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()) | ||||
| 
 | ||||
| 					unconfirmedFunds.Add(unconfirmedFunds, tx.Value) | ||||
|  | ||||
| @ -3,8 +3,8 @@ package ethui | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"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/go-qml/qml" | ||||
| 	"math/big" | ||||
| 	"path/filepath" | ||||
| @ -57,12 +57,12 @@ func (app *HtmlApplication) Window() *qml.Window { | ||||
| } | ||||
| 
 | ||||
| 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) | ||||
| } | ||||
| 
 | ||||
| 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) { | ||||
|  | ||||
| @ -4,6 +4,7 @@ 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" | ||||
| @ -47,14 +48,14 @@ func (lib *EthLib) GetKey() string { | ||||
| 	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)) | ||||
| 	if stateObject != nil { | ||||
| 		return utils.NewPStateObject(stateObject) | ||||
| 		return ethpub.NewPStateObject(stateObject) | ||||
| 	} | ||||
| 
 | ||||
| 	// See GetStorage for explanation on "nil"
 | ||||
| 	return utils.NewPStateObject(nil) | ||||
| 	return ethpub.NewPStateObject(nil) | ||||
| } | ||||
| 
 | ||||
| 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 | ||||
| } | ||||
| 
 | ||||
| func (lib *EthLib) GetBlock(hexHash string) *utils.PBlock { | ||||
| func (lib *EthLib) GetBlock(hexHash string) *ethpub.PBlock { | ||||
| 	hash, err := hex.DecodeString(hexHash) | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| @ -123,5 +124,5 @@ func (lib *EthLib) GetBlock(hexHash string) *utils.PBlock { | ||||
| 
 | ||||
| 	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