81 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package eth
 | 
						|
 | 
						|
/*
 | 
						|
import (
 | 
						|
	"crypto/ecdsa"
 | 
						|
	"errors"
 | 
						|
	"math/big"
 | 
						|
 | 
						|
	"github.com/ethereum/go-ethereum/core"
 | 
						|
	"github.com/ethereum/go-ethereum/core/types"
 | 
						|
)
 | 
						|
 | 
						|
type Account struct {
 | 
						|
	w *Wallet
 | 
						|
}
 | 
						|
 | 
						|
func (self *Account) Transact(to *Account, value, gas, price *big.Int, data []byte) error {
 | 
						|
	return self.w.transact(self, to, value, gas, price, data)
 | 
						|
}
 | 
						|
 | 
						|
func (self *Account) Address() []byte {
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (self *Account) PrivateKey() *ecdsa.PrivateKey {
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
type Wallet struct{}
 | 
						|
 | 
						|
func NewWallet() *Wallet {
 | 
						|
	return &Wallet{}
 | 
						|
}
 | 
						|
 | 
						|
func (self *Wallet) GetAccount(i int) *Account {
 | 
						|
}
 | 
						|
 | 
						|
func (self *Wallet) transact(from, to *Account, value, gas, price *big.Int, data []byte) error {
 | 
						|
	if from.PrivateKey() == nil {
 | 
						|
		return errors.New("accounts is not owned (no private key available)")
 | 
						|
	}
 | 
						|
 | 
						|
	var createsContract bool
 | 
						|
	if to == nil {
 | 
						|
		createsContract = true
 | 
						|
	}
 | 
						|
 | 
						|
	var msg *types.Transaction
 | 
						|
	if contractCreation {
 | 
						|
		msg = types.NewContractCreationTx(value, gas, price, data)
 | 
						|
	} else {
 | 
						|
		msg = types.NewTransactionMessage(to.Address(), value, gas, price, data)
 | 
						|
	}
 | 
						|
 | 
						|
	state := self.chainManager.TransState()
 | 
						|
	nonce := state.GetNonce(key.Address())
 | 
						|
 | 
						|
	msg.SetNonce(nonce)
 | 
						|
	msg.SignECDSA(from.PriateKey())
 | 
						|
 | 
						|
	// Do some pre processing for our "pre" events  and hooks
 | 
						|
	block := self.chainManager.NewBlock(from.Address())
 | 
						|
	coinbase := state.GetOrNewStateObject(from.Address())
 | 
						|
	coinbase.SetGasPool(block.GasLimit())
 | 
						|
	self.blockManager.ApplyTransactions(coinbase, state, block, types.Transactions{tx}, true)
 | 
						|
 | 
						|
	err := self.obj.TxPool().Add(tx)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	state.SetNonce(key.Address(), nonce+1)
 | 
						|
 | 
						|
	if contractCreation {
 | 
						|
		addr := core.AddressFromMessage(tx)
 | 
						|
		pipelogger.Infof("Contract addr %x\n", addr)
 | 
						|
	}
 | 
						|
 | 
						|
	return tx, nil
 | 
						|
}
 | 
						|
*/
 |