Commit 6dde0d18 authored by vipwzw's avatar vipwzw Committed by vipwzw

update 0412

parent d8258991
......@@ -223,15 +223,30 @@ func (acc *DB) ExecAddress(name string) string {
return address.ExecAddress(name)
}
// ExecDepositFrozen 执行增发coins
// ExecDepositFrozen 执行增发coins到具体的地址,并冻结
func (acc *DB) ExecDepositFrozen(addr, execaddr string, amount int64) (*types.Receipt, error) {
if addr == execaddr {
return nil, types.ErrSendSameToRecv
}
//issue coins to exec addr
receipt1, err := acc.ExecIssueCoins(execaddr, amount)
if err != nil {
return nil, err
}
receipt2, err := acc.execDepositFrozen(addr, execaddr, amount)
if err != nil {
return nil, err
}
return acc.mergeReceipt(receipt1, receipt2), nil
}
// ExecIssueCoins 增发coins到具体的挖矿合约
func (acc *DB) ExecIssueCoins(execaddr string, amount int64) (*types.Receipt, error) {
//这个函数只有挖矿的合约才能调用
allow := false
for _, exec := range types.GetMinerExecs() {
if acc.ExecAddress(exec) == execaddr {
if acc.ExecAddress(types.ExecName(exec)) == execaddr {
allow = true
break
}
......@@ -239,15 +254,11 @@ func (acc *DB) ExecDepositFrozen(addr, execaddr string, amount int64) (*types.Re
if !allow {
return nil, types.ErrNotAllowDeposit
}
receipt1, err := acc.depositBalance(execaddr, amount)
if err != nil {
return nil, err
}
receipt2, err := acc.execDepositFrozen(addr, execaddr, amount)
receipt, err := acc.depositBalance(execaddr, amount)
if err != nil {
return nil, err
}
return acc.mergeReceipt(receipt1, receipt2), nil
return receipt, nil
}
func (acc *DB) execDepositFrozen(addr, execaddr string, amount int64) (*types.Receipt, error) {
......
......@@ -174,3 +174,24 @@ func TestExecDepositFrozen(t *testing.T) {
accCoin.LoadExecAccount(addr1, execaddress).Frozen)
require.Equal(t, int64(20*1e8+25*1e8), accCoin.LoadExecAccount(addr1, execaddress).Frozen)
}
func TestExecIssueCoins(t *testing.T) {
q := initEnv()
blockchainProcess(q)
storeProcess(q)
accCoin, _ := GenerAccDb()
execaddress := address.ExecAddress("token")
_, err := accCoin.ExecIssueCoins(execaddress, 25*1e8)
require.Equal(t, types.ErrNotAllowDeposit, err)
require.Zero(t, accCoin.LoadAccount(execaddress).Balance)
execaddress = address.ExecAddress("user.p.para.ticket")
_, err = accCoin.ExecIssueCoins(execaddress, 25*1e8)
require.Equal(t, types.ErrNotAllowDeposit, err)
execaddress = address.ExecAddress("ticket")
_, err = accCoin.ExecIssueCoins(execaddress, 25*1e8)
require.NoError(t, err)
t.Logf("ExecIssueCoins [%d]",
accCoin.LoadAccount(execaddress).Balance)
require.Equal(t, int64(25*1e8), accCoin.LoadAccount(execaddress).Balance)
}
......@@ -188,10 +188,18 @@ func (e *executor) execCheckTx(tx *types.Transaction, index int) error {
if !exec.IsFree() && types.GInt("MinFee") > 0 {
from := tx.From()
accFrom := e.coinsAccount.LoadAccount(from)
//余额少于手续费时直接返回错误
if accFrom.GetBalance() < tx.GetTxFee() {
elog.Error("execCheckTx", "ispara", types.IsPara(), "exec", string(tx.Execer), "Balance", accFrom.GetBalance(), "TxFee", tx.GetTxFee())
return types.ErrNoBalance
}
if accFrom.GetBalance() < types.GInt("MinBalanceTransfer") {
elog.Error("execCheckTx", "ispara", types.IsPara(), "exec", string(tx.Execer), "nonce", tx.Nonce)
elog.Error("execCheckTx", "ispara", types.IsPara(), "exec", string(tx.Execer), "nonce", tx.Nonce, "Balance", accFrom.GetBalance())
return types.ErrBalanceLessThanTenTimesFee
}
}
return exec.CheckTx(tx, index)
}
......
......@@ -5,14 +5,15 @@
package executor
import (
"encoding/hex"
"fmt"
"testing"
"time"
"encoding/hex"
"github.com/33cn/chain33/client/api"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/queue"
"github.com/33cn/chain33/store"
_ "github.com/33cn/chain33/system"
drivers "github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
......@@ -219,3 +220,37 @@ func TestExecutorErrAPIEnv(t *testing.T) {
fmt.Println(err)
assert.Equal(t, true, api.IsAPIEnvError(err))
}
func TestCheckTx(t *testing.T) {
prev := types.GInt("MinFee")
types.SetMinFee(100000)
defer types.SetMinFee(prev)
q := queue.New("channel")
cfg, sub := types.InitCfg("../cmd/chain33/chain33.test.toml")
store := store.New(cfg.Store, sub.Store)
store.SetQueueClient(q.Client())
defer store.Close()
addr, priv := util.Genaddress()
tx := util.CreateCoinsTx(priv, addr, types.Coin)
tx.Execer = []byte("user.xxx")
tx.To = address.ExecAddress("user.xxx")
tx.Fee = 2 * types.Coin
tx.Sign(types.SECP256K1, priv)
var txs []*types.Transaction
txs = append(txs, tx)
ctx := &executorCtx{
stateHash: nil,
height: 0,
blocktime: time.Now().Unix(),
difficulty: 1,
mainHash: nil,
parentHash: nil,
}
execute := newExecutor(ctx, &Executor{}, nil, txs, nil)
err := execute.execCheckTx(tx, 0)
assert.Equal(t, err, types.ErrNoBalance)
}
......@@ -6,6 +6,7 @@ package p2p
import (
"fmt"
"math/rand"
"net"
"sync"
"time"
......@@ -53,11 +54,21 @@ type listener struct {
// NewListener produce a listener object
func NewListener(protocol string, node *Node) Listener {
log.Debug("NewListener", "localPort", node.listenPort)
Retry:
log.Info("NewListener", "localPort", node.listenPort)
l, err := net.Listen(protocol, fmt.Sprintf(":%v", node.listenPort))
if err != nil {
log.Crit("Failed to listen", "Error", err.Error())
return nil
log.Error("Failed to listen", "Error", err.Error())
for {
randPort := rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(65535)
if int(randPort) == node.listenPort || randPort < 2048 {
continue
}
node.listenPort = int(randPort)
break
}
log.Info("Flush Listen Port", "RandPort", node.listenPort)
goto Retry
}
dl := &listener{
......
......@@ -13,6 +13,7 @@ import (
"github.com/33cn/chain33/queue"
"github.com/33cn/chain33/types"
//"github.com/33cn/chain33/util/testnode"
"github.com/stretchr/testify/assert"
"golang.org/x/net/context"
......@@ -129,6 +130,7 @@ func TestNetInfo(t *testing.T) {
p2pModule.node.nodeInfo.IsNatDone()
p2pModule.node.nodeInfo.SetNatDone()
p2pModule.node.nodeInfo.Get()
p2pModule.node.nodeInfo.Set(p2pModule.node.nodeInfo)
}
//测试Peer
......@@ -269,6 +271,19 @@ func TestGrpcStreamConns(t *testing.T) {
assert.Nil(t, err)
_, err = resp.Recv()
assert.Equal(t, true, strings.Contains(err.Error(), "no authorized"))
ping, err := P2pComm.NewPingData(p2pModule.node.nodeInfo)
assert.Nil(t, err)
_, err = cli.ServerStreamSend(context.Background(), ping)
assert.Nil(t, err)
_, err = cli.ServerStreamRead(context.Background())
assert.Nil(t, err)
var emptyBlock types.P2PBlock
_, err = cli.BroadCastBlock(context.Background(), &emptyBlock)
assert.Equal(t, true, strings.Contains(err.Error(), "no authorized"))
conn.Close()
}
......@@ -367,6 +382,17 @@ func TestNetAddress(t *testing.T) {
}
func TestP2pListen(t *testing.T) {
var node Node
node.listenPort = 3333
listen1 := NewListener("tcp", &node)
assert.Equal(t, true, listen1 != nil)
listen2 := NewListener("tcp", &node)
assert.Equal(t, true, listen2 != nil)
listen1.Close()
listen2.Close()
}
func TestP2pClose(t *testing.T) {
p2pModule.Wait()
p2pModule.Close()
......
......@@ -81,9 +81,14 @@ func (c *Coins) IsFriend(myexec, writekey []byte, othertx *types.Transaction) bo
return false
}
//step2 判定 othertx 的 执行器名称(只允许主链,并且是挖矿的行为)
if string(othertx.Execer) == "ticket" && othertx.ActionName() == "miner" {
if othertx.ActionName() == "miner" {
for _, exec := range types.GetMinerExecs() {
if types.ExecName(exec) == string(othertx.Execer) {
return true
}
}
}
return false
}
......
......@@ -193,9 +193,6 @@ func TestDriverBase(t *testing.T) {
data := types.Encode(&types.LocalDBSet{KV: rollbackkvs})
assert.Equal(t, string(newkvs[1].Value), string(types.Encode(&types.ReceiptLog{Ty: types.TyLogRollback, Log: data})))
_, err = demo.DelRollbackKV(tx, []byte(execer))
assert.Equal(t, err, types.ErrNotFound)
kvdb.Set(newkvs[1].Key, newkvs[1].Value)
newkvs, err = demo.DelRollbackKV(tx, []byte(execer))
assert.Nil(t, err)
......
......@@ -150,18 +150,27 @@ func (c *KVCreator) KVList() []*types.KeyValue {
//AddRollbackKV 添加回滚数据到 KV
func (c *KVCreator) AddRollbackKV() {
v := types.Encode(c.rollbackLog())
rbLog := c.rollbackLog()
if rbLog != nil {
v := types.Encode(rbLog)
c.kvs = append(c.kvs, &types.KeyValue{Key: c.rollbackkey, Value: v})
}
}
//DelRollbackKV 删除rollback kv
func (c *KVCreator) DelRollbackKV() {
if len(c.kvs) > 0 {
c.kvs = append(c.kvs, &types.KeyValue{Key: c.rollbackkey})
}
}
//GetRollbackKVList 获取 rollback 到 Key and Vaue
func (c *KVCreator) GetRollbackKVList() ([]*types.KeyValue, error) {
data, err := c.kvdb.Get(c.rollbackkey)
if err == types.ErrNotFound {
return nil, nil
}
if err != nil {
return nil, err
}
......@@ -183,6 +192,9 @@ func (c *KVCreator) GetRollbackKVList() ([]*types.KeyValue, error) {
//rollbackLog rollback log
func (c *KVCreator) rollbackLog() *types.ReceiptLog {
if len(c.rollbackkvs) == 0 {
return nil
}
data := types.Encode(&types.LocalDBSet{KV: c.rollbackkvs})
return &types.ReceiptLog{Ty: types.TyLogRollback, Log: data}
}
......
......@@ -80,6 +80,16 @@ func TestKVCreator(t *testing.T) {
creator.AddKVListOnly([]*types.KeyValue{{Key: []byte("k"), Value: []byte("v")}})
creator.DelRollbackKV()
creator.AddToLogs(nil)
creator = NewKVCreator(kvdb, []byte("prefix-"), []byte("emptyrollback"))
creator.AddListNoPrefix(nil)
creator.AddRollbackKV()
assert.Zero(t, len(creator.kvs))
kvs, err = creator.GetRollbackKVList()
assert.Zero(t, len(kvs))
assert.Nil(t, err)
creator.DelRollbackKV()
assert.Zero(t, len(creator.kvs))
}
func TestHeightIndexStr(t *testing.T) {
......
......@@ -540,6 +540,15 @@ func (tx *Transaction) IsExpire(height, blocktime int64) bool {
return group.IsExpire(height, blocktime)
}
//GetTxFee 获取交易的费用,区分单笔交易和交易组
func (tx *Transaction) GetTxFee() int64 {
group, _ := tx.GetTxGroup()
if group == nil {
return tx.Fee
}
return group.Txs[0].Fee
}
//From 交易from地址
func (tx *Transaction) From() string {
return address.PubKeyToAddr(tx.GetSignature().GetPubkey())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment