mirror of https://github.com/ethereum/go-ethereum
commit
231ad9b562
@ -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