| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | package ethpub | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-05-13 14:43:29 +02:00
										 |  |  | 	"encoding/hex" | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	"github.com/ethereum/eth-go/ethchain" | 
					
						
							|  |  |  | 	"github.com/ethereum/eth-go/ethutil" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type PEthereum struct { | 
					
						
							| 
									
										
										
										
											2014-05-13 12:42:24 +02:00
										 |  |  | 	manager      ethchain.EthManager | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	stateManager *ethchain.StateManager | 
					
						
							|  |  |  | 	blockChain   *ethchain.BlockChain | 
					
						
							|  |  |  | 	txPool       *ethchain.TxPool | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-13 12:42:24 +02:00
										 |  |  | func NewPEthereum(manager ethchain.EthManager) *PEthereum { | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	return &PEthereum{ | 
					
						
							| 
									
										
										
										
											2014-05-13 12:42:24 +02:00
										 |  |  | 		manager, | 
					
						
							|  |  |  | 		manager.StateManager(), | 
					
						
							|  |  |  | 		manager.BlockChain(), | 
					
						
							|  |  |  | 		manager.TxPool(), | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (lib *PEthereum) GetBlock(hexHash string) *PBlock { | 
					
						
							|  |  |  | 	hash := ethutil.FromHex(hexHash) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	block := lib.blockChain.GetBlock(hash) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 14:15:58 +02:00
										 |  |  | 	var blockInfo *PBlock | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if block != nil { | 
					
						
							|  |  |  | 		blockInfo = &PBlock{Number: int(block.BlockInfo().Number), Hash: ethutil.Hex(block.Hash())} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		blockInfo = &PBlock{Number: -1, Hash: ""} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return blockInfo | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (lib *PEthereum) GetKey() *PKey { | 
					
						
							| 
									
										
										
										
											2014-05-14 13:54:40 +02:00
										 |  |  | 	keyPair := ethutil.GetKeyRing().Get(0) | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return NewPKey(keyPair) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (lib *PEthereum) GetStateObject(address string) *PStateObject { | 
					
						
							| 
									
										
										
										
											2014-05-20 11:19:07 +02:00
										 |  |  | 	stateObject := lib.stateManager.CurrentState().GetStateObject(ethutil.FromHex(address)) | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	if stateObject != nil { | 
					
						
							|  |  |  | 		return NewPStateObject(stateObject) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// See GetStorage for explanation on "nil" | 
					
						
							|  |  |  | 	return NewPStateObject(nil) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-13 14:43:29 +02:00
										 |  |  | func (lib *PEthereum) GetPeerCount() int { | 
					
						
							|  |  |  | 	return lib.manager.PeerCount() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (lib *PEthereum) GetIsMining() bool { | 
					
						
							|  |  |  | 	return lib.manager.IsMining() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (lib *PEthereum) GetIsListening() bool { | 
					
						
							|  |  |  | 	return lib.manager.IsListening() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (lib *PEthereum) GetCoinBase() string { | 
					
						
							|  |  |  | 	data, _ := ethutil.Config.Db.Get([]byte("KeyRing")) | 
					
						
							|  |  |  | 	keyRing := ethutil.NewValueFromBytes(data) | 
					
						
							|  |  |  | 	key := keyRing.Get(0).Bytes() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return lib.SecretToAddress(hex.EncodeToString(key)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 11:56:25 +02:00
										 |  |  | func (lib *PEthereum) GetStorage(address, storageAddress string) string { | 
					
						
							|  |  |  | 	return lib.GetStateObject(address).GetStorage(storageAddress) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-13 14:43:29 +02:00
										 |  |  | func (lib *PEthereum) GetTxCountAt(address string) int { | 
					
						
							| 
									
										
										
										
											2014-05-05 11:56:25 +02:00
										 |  |  | 	return lib.GetStateObject(address).Nonce() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (lib *PEthereum) IsContract(address string) bool { | 
					
						
							|  |  |  | 	return lib.GetStateObject(address).IsContract() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 13:09:29 +02:00
										 |  |  | func (lib *PEthereum) SecretToAddress(key string) string { | 
					
						
							| 
									
										
										
										
											2014-05-14 13:54:40 +02:00
										 |  |  | 	pair, err := ethutil.NewKeyPairFromSec(ethutil.FromHex(key)) | 
					
						
							| 
									
										
										
										
											2014-05-05 13:09:29 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return "" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ethutil.Hex(pair.Address()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-02 14:08:54 +02:00
										 |  |  | func (lib *PEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) (*PReceipt, error) { | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	return lib.createTx(key, recipient, valueStr, gasStr, gasPriceStr, dataStr, "") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-02 14:08:54 +02:00
										 |  |  | func (lib *PEthereum) Create(key, valueStr, gasStr, gasPriceStr, initStr, bodyStr string) (*PReceipt, error) { | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	return lib.createTx(key, "", valueStr, gasStr, gasPriceStr, initStr, bodyStr) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-02 14:08:54 +02:00
										 |  |  | func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, initStr, scriptStr string) (*PReceipt, error) { | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	var hash []byte | 
					
						
							|  |  |  | 	var contractCreation bool | 
					
						
							|  |  |  | 	if len(recipient) == 0 { | 
					
						
							|  |  |  | 		contractCreation = true | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		hash = ethutil.FromHex(recipient) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-14 13:54:40 +02:00
										 |  |  | 	var keyPair *ethutil.KeyPair | 
					
						
							| 
									
										
										
										
											2014-05-08 18:26:46 +02:00
										 |  |  | 	var err error | 
					
						
							|  |  |  | 	if key[0:2] == "0x" { | 
					
						
							| 
									
										
										
										
											2014-05-14 13:54:40 +02:00
										 |  |  | 		keyPair, err = ethutil.NewKeyPairFromSec([]byte(ethutil.FromHex(key[0:2]))) | 
					
						
							| 
									
										
										
										
											2014-05-08 18:26:46 +02:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2014-05-14 13:54:40 +02:00
										 |  |  | 		keyPair, err = ethutil.NewKeyPairFromSec([]byte(ethutil.FromHex(key))) | 
					
						
							| 
									
										
										
										
											2014-05-08 18:26:46 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2014-05-02 14:08:54 +02:00
										 |  |  | 		return nil, err | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	value := ethutil.Big(valueStr) | 
					
						
							|  |  |  | 	gas := ethutil.Big(gasStr) | 
					
						
							|  |  |  | 	gasPrice := ethutil.Big(gasPriceStr) | 
					
						
							|  |  |  | 	var tx *ethchain.Transaction | 
					
						
							|  |  |  | 	// Compile and assemble the given data | 
					
						
							|  |  |  | 	if contractCreation { | 
					
						
							| 
									
										
										
										
											2014-05-05 15:48:17 +02:00
										 |  |  | 		var initScript, mainScript []byte | 
					
						
							|  |  |  | 		var err error | 
					
						
							|  |  |  | 		if ethutil.IsHex(initStr) { | 
					
						
							| 
									
										
										
										
											2014-05-05 15:51:43 +02:00
										 |  |  | 			initScript = ethutil.FromHex(initStr[2:]) | 
					
						
							| 
									
										
										
										
											2014-05-05 15:48:17 +02:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2014-05-05 15:51:43 +02:00
										 |  |  | 			initScript, err = ethutil.Compile(initStr) | 
					
						
							| 
									
										
										
										
											2014-05-05 15:48:17 +02:00
										 |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return nil, err | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-05-05 15:48:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if ethutil.IsHex(scriptStr) { | 
					
						
							|  |  |  | 			mainScript = ethutil.FromHex(scriptStr[2:]) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			mainScript, err = ethutil.Compile(scriptStr) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return nil, err | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		tx = ethchain.NewContractCreationTx(value, gas, gasPrice, mainScript, initScript) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		// Just in case it was submitted as a 0x prefixed string | 
					
						
							| 
									
										
										
										
											2014-05-02 20:00:58 +02:00
										 |  |  | 		if len(initStr) > 0 && initStr[0:2] == "0x" { | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 			initStr = initStr[2:len(initStr)] | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		tx = ethchain.NewTransactionMessage(hash, value, gas, gasPrice, ethutil.FromHex(initStr)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-08 18:26:46 +02:00
										 |  |  | 	acc := lib.stateManager.TransState().GetStateObject(keyPair.Address()) | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	tx.Nonce = acc.Nonce | 
					
						
							| 
									
										
										
										
											2014-05-19 12:14:04 +02:00
										 |  |  | 	acc.Nonce += 1 | 
					
						
							| 
									
										
										
										
											2014-05-08 18:26:46 +02:00
										 |  |  | 	lib.stateManager.TransState().SetStateObject(acc) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	tx.Sign(keyPair.PrivateKey) | 
					
						
							|  |  |  | 	lib.txPool.QueueTransaction(tx) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if contractCreation { | 
					
						
							| 
									
										
										
										
											2014-05-02 14:08:54 +02:00
										 |  |  | 		ethutil.Config.Log.Infof("Contract addr %x", tx.CreationAddress()) | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		ethutil.Config.Log.Infof("Tx hash %x", tx.Hash()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-02 14:08:54 +02:00
										 |  |  | 	return NewPReciept(contractCreation, tx.CreationAddress(), tx.Hash(), keyPair.Address()), nil | 
					
						
							| 
									
										
										
										
											2014-05-02 13:55:43 +02:00
										 |  |  | } |