Ejemplo n.º 1
0
func TestHexdataPtrAddress(t *testing.T) {
	in := common.Address{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
	v := newHexData(&in)
	if bytes.Compare(in.Bytes(), v.data) != 0 {
		t.Errorf("Got % x expected % x", in, v.data)
	}
}
Ejemplo n.º 2
0
func (self *XEth) doSign(from common.Address, hash common.Hash, didUnlock bool) ([]byte, error) {
	sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from}, hash.Bytes())
	if err == accounts.ErrLocked {
		if didUnlock {
			return nil, fmt.Errorf("signer account still locked after successful unlock")
		}
		if !self.frontend.UnlockAccount(from.Bytes()) {
			return nil, fmt.Errorf("could not unlock signer account")
		}
		// retry signing, the account should now be unlocked.
		return self.doSign(from, hash, true)
	} else if err != nil {
		return nil, err
	}
	return sig, nil
}
Ejemplo n.º 3
0
func (self *XEth) sign(tx *types.Transaction, from common.Address, didUnlock bool) error {
	sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, tx.Hash().Bytes())
	if err == accounts.ErrLocked {
		if didUnlock {
			return fmt.Errorf("sender account still locked after successful unlock")
		}
		if !self.frontend.UnlockAccount(from.Bytes()) {
			return fmt.Errorf("could not unlock sender account")
		}
		// retry signing, the account should now be unlocked.
		return self.sign(tx, from, true)
	} else if err != nil {
		return err
	}
	tx.SetSignatureValues(sig)
	return nil
}
Ejemplo n.º 4
0
// Transfer initiates a value transfer from an origin account to a destination
// account.
func (eapis *EtherAPIs) Transfer(from, to common.Address, amount *big.Int) (common.Hash, error) {
	// Make sure we actually own the origin account and have a valid destination
	accman := eapis.ethereum.AccountManager()
	if !accman.HasAccount(from) {
		return common.Hash{}, fmt.Errorf("unknown account: 0x%x", from.Bytes())
	}
	if to == (common.Address{}) {
		return common.Hash{}, fmt.Errorf("missing destination account")
	}
	// Serialize transaction creations to avoid nonce clashes
	eapis.txlock.Lock()
	defer eapis.txlock.Unlock()

	// Assemble and create the new transaction
	var (
		txpool   = eapis.ethereum.TxPool()
		nonce    = txpool.State().GetNonce(from)
		gasLimit = params.TxGas
		gasPrice = eapis.ethereum.GpoMinGasPrice
	)
	tx := types.NewTransaction(nonce, to, amount, gasLimit, gasPrice, nil)

	// Sign the transaction and inject into the local pool for propagation
	signature, err := accman.Sign(accounts.Account{Address: from}, tx.SigHash().Bytes())
	if err != nil {
		return common.Hash{}, err
	}
	signed, err := tx.WithSignature(signature)
	if err != nil {
		return common.Hash{}, err
	}
	txpool.SetLocal(signed)
	if err := txpool.Add(signed); err != nil {
		return common.Hash{}, err
	}
	return signed.Hash(), nil
}