Commit a4a6b8fa authored by 张振华's avatar 张振华

Merge branch 'master' into guess

parents 1123e1d5 dc3ab81f
......@@ -46,7 +46,7 @@ go_test:
tags:
- 33cn
script:
- make docker-compose-down DAPP=all
- make docker-compose-down dapp=all
- make test
only:
- master
......@@ -90,8 +90,8 @@ deploy_relay:
- 33cn
script:
- make build_ci
- make docker-compose PROJ=relay DAPP=relay
- make docker-compose-down PROJ=relay DAPP=relay
- make docker-compose proj=relay dapp=relay
- make docker-compose-down proj=relay dapp=relay
only:
- master
......@@ -101,8 +101,8 @@ deploy_paracross:
- 33cn
script:
- make build_ci
- make docker-compose PROJ=paracross DAPP=paracross
- make docker-compose-down PROJ=paracross DAPP=paracross
- make docker-compose proj=paracross dapp=paracross
- make docker-compose-down proj=paracross dapp=paracross
only:
- master
......@@ -139,8 +139,8 @@ fork_test_privacy:
script:
- if [ -n "${onceEveryday}" ]; then
- make build_ci
- make fork-test PROJ=privacy DAPP=privacy
- make docker-compose-down PROJ=privacy DAPP=privacy
- make fork-test proj=privacy dapp=privacy
- make docker-compose-down proj=privacy dapp=privacy
- fi
only:
- master
......@@ -153,8 +153,8 @@ fork_test_paracross:
script:
- if [ -n "${onceEveryday}" ]; then
- make build_ci
- make fork-test PROJ=paracross DAPP=paracross
- make docker-compose-down PROJ=paracross DAPP=paracross
- make fork-test proj=paracross dapp=paracross
- make docker-compose-down proj=paracross dapp=paracross
- fi
only:
- master
......@@ -168,8 +168,8 @@ fork_test_all:
script:
- if [ -n "${onceEveryday}" ]; then
- make build_ci
- make fork-test PROJ=fork DAPP=all
- make docker-compose-down PROJ=fork DAPP=all
- make fork-test proj=fork dapp=all
- make docker-compose-down proj=fork dapp=all
- fi
only:
- master
......@@ -183,8 +183,8 @@ deploy_test_all:
script:
- if [ -n "${onceEveryday}" ]; then
- make build_ci
- make docker-compose PROJ=deploy DAPP=all
- make docker-compose-down PROJ=deploy DAPP=all
- make docker-compose proj=deploy dapp=all
- make docker-compose-down proj=deploy dapp=all
- fi
only:
- master
......
......@@ -62,4 +62,4 @@ matrix:
- sudo mv docker-compose /usr/local/bin
before_script: make build_ci
script:
- make docker-compose DAPP=${DAPP} && make docker-compose-down DAPP=${DAPP} && make clean
- make docker-compose dapp=${DAPP} && make docker-compose-down dapp=${DAPP} && make clean
......@@ -17,8 +17,7 @@ PKG_LIST_INEFFASSIGN= `go list -f {{.Dir}} ./... | grep -v "vendor"`
BUILD_FLAGS = -ldflags "-X github.com/33cn/chain33/common/version.GitCommit=`git rev-parse --short=8 HEAD`"
MKPATH=$(abspath $(lastword $(MAKEFILE_LIST)))
MKDIR=$(dir $(MKPATH))
DAPP := ""
PROJ := "build"
proj := "build"
.PHONY: default dep all build release cli linter race test fmt vet bench msan coverage coverhtml docker docker-compose protobuf clean help autotest
default: build depends
......@@ -123,16 +122,16 @@ docker-compose: ## build docker-compose for chain33 run
@cd build && if ! [ -d ci ]; then \
make -C ../ ; \
fi; \
cp chain33* Dockerfile docker-compose* ci/ && cd ci/ && ./docker-compose-pre.sh run $(PROJ) $(DAPP) && cd ../..
cp chain33* Dockerfile docker-compose* ci/ && cd ci/ && ./docker-compose-pre.sh run $(proj) $(dapp) && cd ../..
docker-compose-down: ## build docker-compose for chain33 run
@cd build && if [ -d ci ]; then \
cp chain33* Dockerfile docker-compose* ci/ && cd ci/ && ./docker-compose-pre.sh down $(PROJ) $(DAPP) && cd .. ; \
cp chain33* Dockerfile docker-compose* ci/ && cd ci/ && ./docker-compose-pre.sh down $(proj) $(dapp) && cd .. ; \
fi; \
cd ..
fork-test: ## build fork-test for chain33 run
@cd build && cp chain33* Dockerfile system-fork-test.sh docker-compose* ci/ && cd ci/ && ./docker-compose-pre.sh forktest $(PROJ) $(DAPP) && cd ../..
@cd build && cp chain33* Dockerfile system-fork-test.sh docker-compose* ci/ && cd ci/ && ./docker-compose-pre.sh forktest $(proj) $(dapp) && cd ../..
clean: ## Remove previous build
......
......@@ -68,24 +68,37 @@ type client struct {
wg sync.WaitGroup
}
type subConfig struct {
WriteBlockSeconds int64 `json:"writeBlockSeconds,omitempty"`
ParaRemoteGrpcClient string `json:"paraRemoteGrpcClient,omitempty"`
StartHeight int64 `json:"startHeight,omitempty"`
EmptyBlockInterval int64 `json:"emptyBlockInterval,omitempty"`
AuthAccount string `json:"authAccount,omitempty"`
WaitBlocks4CommitMsg int32 `json:"waitBlocks4CommitMsg,omitempty"`
SearchHashMatchedBlockDepth int32 `json:"searchHashMatchedBlockDepth,omitempty"`
}
// New function to init paracross env
func New(cfg *types.Consensus, sub []byte) queue.Module {
c := drivers.NewBaseClient(cfg)
if cfg.ParaRemoteGrpcClient != "" {
grpcSite = cfg.ParaRemoteGrpcClient
var subcfg subConfig
if sub != nil {
types.MustDecode(sub, &subcfg)
}
if cfg.StartHeight > 0 {
startHeight = cfg.StartHeight
if subcfg.ParaRemoteGrpcClient != "" {
grpcSite = subcfg.ParaRemoteGrpcClient
}
if cfg.WriteBlockSeconds > 0 {
blockSec = cfg.WriteBlockSeconds
if subcfg.StartHeight > 0 {
startHeight = subcfg.StartHeight
}
if cfg.EmptyBlockInterval > 0 {
emptyBlockInterval = cfg.EmptyBlockInterval
if subcfg.WriteBlockSeconds > 0 {
blockSec = subcfg.WriteBlockSeconds
}
if cfg.SearchHashMatchedBlockDepth > 0 {
searchHashMatchDepth = cfg.SearchHashMatchedBlockDepth
if subcfg.EmptyBlockInterval > 0 {
emptyBlockInterval = subcfg.EmptyBlockInterval
}
if subcfg.SearchHashMatchedBlockDepth > 0 {
searchHashMatchDepth = subcfg.SearchHashMatchedBlockDepth
}
pk, err := hex.DecodeString(minerPrivateKey)
......@@ -117,25 +130,22 @@ func New(cfg *types.Consensus, sub []byte) queue.Module {
conn: conn,
grpcClient: grpcClient,
paraClient: paraCli,
authAccount: cfg.AuthAccount,
authAccount: subcfg.AuthAccount,
privateKey: priKey,
isCaughtUp: false,
}
if cfg.WaitBlocks4CommitMsg < 2 {
if subcfg.WaitBlocks4CommitMsg < 2 {
panic("config WaitBlocks4CommitMsg should not less 2")
}
para.commitMsgClient = &commitMsgClient{
paraClient: para,
waitMainBlocks: cfg.WaitBlocks4CommitMsg,
waitMainBlocks: subcfg.WaitBlocks4CommitMsg,
commitMsgNotify: make(chan int64, 1),
delMsgNotify: make(chan int64, 1),
mainBlockAdd: make(chan *types.BlockDetail, 1),
quit: make(chan struct{}),
}
c.SetChild(para)
return para
}
......@@ -178,6 +188,7 @@ func (client *client) InitBlock() {
newblock.Height = 0
newblock.BlockTime = genesisBlockTime
newblock.ParentHash = zeroHash[:]
newblock.MainHash = zeroHash[:]
tx := client.CreateGenesisTx()
newblock.Txs = tx
newblock.TxHash = merkle.CalcMerkleRoot(newblock.Txs)
......@@ -661,16 +672,13 @@ func (client *client) addMinerTx(preStateHash []byte, block *types.Block, main *
MainBlockHash: main.Seq.Hash,
MainBlockHeight: main.Detail.Block.Height,
}
tx, err := paracross.CreateRawMinerTx(status)
if err != nil {
return err
}
tx.Sign(types.SECP256K1, client.privateKey)
block.Txs = append([]*types.Transaction{tx}, block.Txs...)
return nil
}
func (client *client) createBlock(lastBlock *types.Block, txs []*types.Transaction, seq int64, mainBlock *types.BlockSeq) error {
......@@ -683,7 +691,8 @@ func (client *client) createBlock(lastBlock *types.Block, txs []*types.Transacti
newblock.Difficulty = types.GetP(0).PowLimitBits
newblock.TxHash = merkle.CalcMerkleRoot(newblock.Txs)
newblock.BlockTime = mainBlock.Detail.Block.BlockTime
newblock.MainHash = mainBlock.Detail.Block.Hash()
newblock.MainHeight = mainBlock.Detail.Block.Height
err := client.addMinerTx(lastBlock.StateHash, &newblock, mainBlock)
if err != nil {
return err
......
......@@ -60,7 +60,10 @@ func (s *suiteParaCommitMsg) initEnv(cfg *types.Config, sub *types.ConfigSubModu
q := queue.New("channel")
s.q = q
//api, _ = client.New(q.Client(), nil)
var subcfg subConfig
if sub != nil {
types.MustDecode(sub.Consensus["para"], &subcfg)
}
s.block = blockchain.New(cfg.BlockChain)
s.block.SetQueueClient(q.Client())
......@@ -83,9 +86,9 @@ func (s *suiteParaCommitMsg) initEnv(cfg *types.Config, sub *types.ConfigSubModu
ret := &types.Reply{IsOk: true, Msg: data}
s.grpcCli.On("QueryChain", mock.Anything, mock.Anything).Return(ret, nil).Maybe()
s.grpcCli.On("SendTransaction", mock.Anything, mock.Anything).Return(reply, nil).Maybe()
s.grpcCli.On("GetLastHeader", mock.Anything, mock.Anything).Return(&types.Header{Height: cfg.Consensus.StartHeight + minBlockNum}, nil).Maybe()
s.grpcCli.On("GetLastHeader", mock.Anything, mock.Anything).Return(&types.Header{Height: subcfg.StartHeight + minBlockNum}, nil).Maybe()
s.grpcCli.On("GetBlockHash", mock.Anything, mock.Anything).Return(&types.ReplyHash{Hash: []byte("1")}, nil).Maybe()
s.grpcCli.On("GetSequenceByHash", mock.Anything, mock.Anything).Return(&types.Int64{Data: cfg.Consensus.StartHeight}, nil).Maybe()
s.grpcCli.On("GetSequenceByHash", mock.Anything, mock.Anything).Return(&types.Int64{Data: subcfg.StartHeight}, nil).Maybe()
s.para.grpcClient = s.grpcCli
s.para.SetQueueClient(q.Client())
......
......@@ -46,7 +46,10 @@ func (s *suiteParaClient) initEnv(cfg *types.Config, sub *types.ConfigSubModule)
q := queue.New("channel")
s.q = q
//api, _ = client.New(q.Client(), nil)
var subcfg subConfig
if sub != nil {
types.MustDecode(sub.Consensus["para"], &subcfg)
}
s.block = blockchain.New(cfg.BlockChain)
s.block.SetQueueClient(q.Client())
......@@ -58,7 +61,7 @@ func (s *suiteParaClient) initEnv(cfg *types.Config, sub *types.ConfigSubModule)
//cfg.Consensus.StartHeight = 0
//add block by UT below
cfg.Consensus.EmptyBlockInterval = 100
subcfg.EmptyBlockInterval = 100
s.para = New(cfg.Consensus, sub.Consensus["para"]).(*client)
s.grpcCli = &typesmocks.Chain33Client{}
......@@ -72,7 +75,7 @@ func (s *suiteParaClient) initEnv(cfg *types.Config, sub *types.ConfigSubModule)
ret := &types.Reply{IsOk: true, Msg: data}
s.grpcCli.On("QueryChain", mock.Anything, mock.Anything).Return(ret, nil).Maybe()
s.grpcCli.On("SendTransaction", mock.Anything, mock.Anything).Return(reply, nil).Maybe()
s.grpcCli.On("GetLastHeader", mock.Anything, mock.Anything).Return(&types.Header{Height: cfg.Consensus.StartHeight + minBlockNum}, nil).Maybe()
s.grpcCli.On("GetLastHeader", mock.Anything, mock.Anything).Return(&types.Header{Height: subcfg.StartHeight + minBlockNum}, nil).Maybe()
s.grpcCli.On("GetBlockHash", mock.Anything, mock.Anything).Return(&types.ReplyHash{Hash: []byte("1")}, nil).Maybe()
s.para.grpcClient = s.grpcCli
s.para.SetQueueClient(q.Client())
......
......@@ -46,7 +46,6 @@ func NewRaftCluster(cfg *types.Consensus, sub []byte) queue.Module {
if sub != nil {
types.MustDecode(sub, &subcfg)
}
if subcfg.Genesis != "" {
genesis = subcfg.Genesis
}
......
......@@ -12,7 +12,6 @@ import (
"os"
"path/filepath"
"testing"
"time"
"github.com/33cn/chain33/account"
......
......@@ -413,12 +413,16 @@ kvcreator.prototype.receipt = function() {
function GetExecName() {
var exec = execname()
if (exec.err) {
return ""
}
throwerr(exec.err)
return exec.value
}
function GetRandnum() {
var n = randnum()
throwerr(n.err)
return n.value
}
function ExecAddress(name) {
var addr = execaddress(name)
if (addr.err) {
......@@ -521,6 +525,7 @@ function Init(context) {
this.context = context
this.kvc.add("action", "init")
this.kvc.add("context", this.context)
this.kvc.add("randnum", GetRandnum())
return this.kvc.receipt()
}
......
......@@ -7,6 +7,7 @@ function Init(context) {
this.context = context
this.kvc.add("action", "init")
this.kvc.add("context", this.context)
this.kvc.add("randnum", GetRandnum())
return this.kvc.receipt()
}
......
......@@ -6,6 +6,7 @@ import (
"sync"
"sync/atomic"
"github.com/33cn/chain33/client/api"
"github.com/33cn/chain33/common"
drivers "github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
......@@ -114,6 +115,9 @@ func (u *js) callVM(prefix string, payload *jsproto.Call, tx *types.Transaction,
vm.Set("args", payload.Args)
callfunc := "callcode(context, f, args, loglist)"
jsvalue, err := vm.Run(callfunc)
if u.GetExecutorAPI().IsErr() {
return nil, api.ErrAPIEnv
}
if err != nil {
return nil, err
}
......@@ -229,6 +233,22 @@ func (u *js) execnameFunc(vm *otto.Otto, name string) {
})
}
func (u *js) randnumFunc(vm *otto.Otto, name string) {
vm.Set("randnum", func(call otto.FunctionCall) otto.Value {
hash := u.GetLastHash()
param := &types.ReqRandHash{
ExecName: "ticket",
BlockNum: 5,
Hash: hash,
}
randhash, err := u.GetExecutorAPI().GetRandNum(param)
if err != nil {
return errReturn(vm, err)
}
return okReturn(vm, common.ToHex(randhash))
})
}
func (u *js) listdbFunc(vm *otto.Otto, name string) {
//List(prefix, key []byte, count, direction int32) ([][]byte, error)
_, plocal := calcAllPrefix(name)
......@@ -281,6 +301,7 @@ func (u *js) createVM(name string, tx *types.Transaction, index int) (*otto.Otto
u.localdbFunc(vm, name)
u.listdbFunc(vm, name)
u.execnameFunc(vm, name)
u.randnumFunc(vm, name)
u.registerAccountFunc(vm)
u.registerTableFunc(vm, name)
return vm, nil
......
......@@ -9,6 +9,7 @@ import (
"testing"
"time"
"github.com/33cn/chain33/client/mocks"
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/util"
......@@ -16,6 +17,7 @@ import (
"github.com/33cn/plugin/plugin/dapp/js/types/jsproto"
"github.com/robertkrimen/otto"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
func init() {
......@@ -25,6 +27,9 @@ func init() {
func initExec(ldb db.DB, kvdb db.KVDB, code string, t assert.TestingT) *js {
e := newjs().(*js)
e.SetEnv(1, time.Now().Unix(), 1)
mockapi := &mocks.QueueProtocolAPI{}
mockapi.On("Query", "ticket", "RandNumHash", mock.Anything).Return(&types.ReplyHash{Hash: []byte("hello")}, nil)
e.SetAPI(mockapi)
e.SetLocalDB(kvdb)
e.SetStateDB(kvdb)
c, tx := createCodeTx("test", code)
......@@ -187,8 +192,9 @@ func TestCacheMemUsage(t *testing.T) {
e := initExec(ldb, kvdb, jscode, t)
vm, err := e.createVM("test", nil, 0)
assert.Nil(t, err)
vms := make([]*otto.Otto, 1024)
for i := 0; i < 1024; i++ {
n := 64
vms := make([]*otto.Otto, n)
for i := 0; i < n; i++ {
vms[i] = vm.Copy()
}
printMemUsage()
......
......@@ -25,7 +25,9 @@ func init() {
}
func TestJsVM(t *testing.T) {
mocker := testnode.New("--free--", nil)
cfg, sub := testnode.GetDefaultConfig()
cfg.Consensus.Name = "ticket"
mocker := testnode.NewWithConfig(cfg, sub, nil)
defer mocker.Close()
mocker.Listen()
//开始部署合约, 测试阶段任何人都可以部署合约
......
......@@ -410,12 +410,16 @@ kvcreator.prototype.receipt = function() {
function GetExecName() {
var exec = execname()
if (exec.err) {
return ""
}
throwerr(exec.err)
return exec.value
}
function GetRandnum() {
var n = randnum()
throwerr(n.err)
return n.value
}
function ExecAddress(name) {
var addr = execaddress(name)
if (addr.err) {
......
......@@ -4,6 +4,7 @@ function Init(context) {
this.context = context
this.kvc.add("action", "init")
this.kvc.add("context", this.context)
this.kvc.add("randnum", GetRandnum())
return this.kvc.receipt()
}
......
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package executor
import (
"context"
"time"
"github.com/33cn/chain33/types"
)
const retryNum = 10
// GetMainHeightByTxHash get Block height
func (action *Action) GetMainHeightByTxHash(txHash []byte) int64 {
for i := 0; i < retryNum; i++ {
req := &types.ReqHash{Hash: txHash}
txDetail, err := action.grpcClient.QueryTransaction(context.Background(), req)
if err != nil {
time.Sleep(time.Second)
} else {
return txDetail.GetHeight()
}
}
return -1
}
// GetMainBlockHashByHeight get Hash
func (action *Action) GetMainBlockHashByHeight(height int64) ([]byte, error) {
for i := 0; i < retryNum; i++ {
req := &types.ReqInt{Height: height}
replyHash, err := action.grpcClient.GetBlockHash(context.Background(), req)
if err != nil {
time.Sleep(time.Second)
} else {
return replyHash.Hash, nil
}
}
return nil, types.ErrBlockNotFound
}
......@@ -5,17 +5,14 @@
package executor
import (
"context"
"strconv"
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/client"
"github.com/33cn/chain33/common"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
pty "github.com/33cn/plugin/plugin/dapp/lottery/types"
"google.golang.org/grpc"
)
const (
......@@ -53,9 +50,7 @@ const (
const (
luckyNumMol = 100000
decimal = 100000000 //1e8
//randMolNum = 5
grpcRecSize int = 5 * 30 * 1024 * 1024
blockNum = 5
blockNum = 5
)
const (
......@@ -123,9 +118,6 @@ type Action struct {
height int64
execaddr string
difficulty uint64
api client.QueueProtocolAPI
conn *grpc.ClientConn
grpcClient types.Chain33Client
index int
lottery *Lottery
}
......@@ -134,19 +126,11 @@ type Action struct {
func NewLotteryAction(l *Lottery, tx *types.Transaction, index int) *Action {
hash := tx.Hash()
fromaddr := tx.From()
msgRecvOp := grpc.WithMaxMsgSize(grpcRecSize)
paraRemoteGrpcClient := types.Conf("config.consensus").GStr("ParaRemoteGrpcClient")
conn, err := grpc.Dial(paraRemoteGrpcClient, grpc.WithInsecure(), msgRecvOp)
if err != nil {
panic(err)
}
grpcClient := types.NewChain33Client(conn)
return &Action{l.GetCoinsAccount(), l.GetStateDB(), hash, fromaddr, l.GetBlockTime(),
l.GetHeight(), dapp.ExecAddress(string(tx.Execer)), l.GetDifficulty(), l.GetAPI(), conn, grpcClient, index, l}
return &Action{
coinsAccount: l.GetCoinsAccount(), db: l.GetStateDB(),
txhash: hash, fromaddr: fromaddr, blocktime: l.GetBlockTime(),
height: l.GetHeight(), execaddr: dapp.ExecAddress(string(tx.Execer)),
difficulty: l.GetDifficulty(), index: index, lottery: l}
}
// GetLottCommonRecipt generate logs for lottery common action
......@@ -275,12 +259,7 @@ func (action *Action) LotteryCreate(create *pty.LotteryCreate) (*types.Receipt,
lott.BuyAmount = 0
llog.Debug("LotteryCreate", "OpRewardRatio", lott.OpRewardRatio, "DevRewardRatio", lott.DevRewardRatio)
if types.IsPara() {
mainHeight := action.GetMainHeightByTxHash(action.txhash)
if mainHeight < 0 {
llog.Error("LotteryCreate", "mainHeight", mainHeight)
return nil, pty.ErrLotteryStatus
}
lott.CreateOnMain = mainHeight
lott.CreateOnMain = action.lottery.GetMainHeight()
}
llog.Debug("LotteryCreate created", "lotteryID", lotteryID)
......@@ -330,22 +309,13 @@ func (action *Action) LotteryBuy(buy *pty.LotteryBuy) (*types.Receipt, error) {
lott.Status = pty.LotteryPurchase
lott.Round++
if types.IsPara() {
mainHeight := action.GetMainHeightByTxHash(action.txhash)
if mainHeight < 0 {
llog.Error("LotteryBuy", "mainHeight", mainHeight)
return nil, pty.ErrLotteryStatus
}
lott.LastTransToPurStateOnMain = mainHeight
lott.LastTransToPurStateOnMain = action.lottery.GetMainHeight()
}
}
if lott.Status == pty.LotteryPurchase {
if types.IsPara() {
mainHeight := action.GetMainHeightByTxHash(action.txhash)
if mainHeight < 0 {
llog.Error("LotteryBuy", "mainHeight", mainHeight)
return nil, pty.ErrLotteryStatus
}
mainHeight := action.lottery.GetMainHeight()
if mainHeight-lott.LastTransToPurStateOnMain > lott.GetPurBlockNum() {
llog.Error("LotteryBuy", "action.height", action.height, "mainHeight", mainHeight, "LastTransToPurStateOnMain", lott.LastTransToPurStateOnMain)
return nil, pty.ErrLotteryStatus
......@@ -451,11 +421,7 @@ func (action *Action) LotteryDraw(draw *pty.LotteryDraw) (*types.Receipt, error)
}
if types.IsPara() {
mainHeight := action.GetMainHeightByTxHash(action.txhash)
if mainHeight < 0 {
llog.Error("LotteryBuy", "mainHeight", mainHeight)
return nil, pty.ErrLotteryStatus
}
mainHeight := action.lottery.GetMainHeight()
if mainHeight-lott.GetLastTransToPurStateOnMain() < lott.GetDrawBlockNum() {
llog.Error("LotteryDraw", "action.height", action.height, "mainHeight", mainHeight, "GetLastTransToPurStateOnMain", lott.GetLastTransToPurState())
return nil, pty.ErrLotteryStatus
......@@ -566,10 +532,8 @@ func (action *Action) LotteryClose(draw *pty.LotteryClose) (*types.Receipt, erro
}
//random used for verification in solo
func (action *Action) findLuckyNum(isSolo bool, lott *LotteryDB) int64 {
func (action *Action) findLuckyNum(isSolo bool, lott *LotteryDB) (int64, error) {
var num int64
var msg types.Message
var hash []byte
if isSolo {
//used for internal verification
num = 12345
......@@ -577,51 +541,23 @@ func (action *Action) findLuckyNum(isSolo bool, lott *LotteryDB) int64 {
//发消息给randnum模块
//在主链上,当前高度查询不到,如果要保证区块个数,高度传入action.height-1
llog.Debug("findLuckyNum on randnum module")
if !types.IsPara() {
blockHash, err := action.api.GetBlockHash(&types.ReqInt{Height: action.height - 1})
if err != nil {
return -1
}
req := &types.ReqRandHash{ExecName: "ticket", Hash: blockHash.Hash, BlockNum: blockNum}
msg, err = action.api.Query("ticket", "RandNumHash", req)
if err != nil {
return -1
}
reply := msg.(*types.ReplyHash)
hash = reply.Hash
} else {
txs := action.lottery.GetTxs()
if len(txs) < action.index+1 {
llog.Error("findLuckyNum", "len(txs)", len(txs), "index", action.index)
return -1
}
msg, err := action.api.Query("paracross", "GetMainBlockHash", txs[0])
if err != nil {
return -1
}
queryReply := msg.(*types.ReplyHash)
mainBlockHash := queryReply.Hash
req := &types.ReqRandHash{ExecName: "ticket", Hash: mainBlockHash, BlockNum: blockNum}
reply, err := action.grpcClient.QueryRandNum(context.Background(), req)
if err != nil {
return -1
}
hash = reply.Hash
param := &types.ReqRandHash{
ExecName: "ticket",
BlockNum: blockNum,
Hash: action.lottery.GetLastHash(),
}
hash, err := action.lottery.GetExecutorAPI().GetRandNum(param)
if err != nil {
return -1, err
}
baseNum, err := strconv.ParseUint(common.ToHex(hash[0:4]), 0, 64)
llog.Debug("findLuckyNum", "baseNum", baseNum)
if err != nil {
llog.Error("findLuckyNum", "err", err)
return -1
return -1, err
}
num = int64(baseNum) % luckyNumMol
}
return num
return num, nil
}
func checkFundAmount(luckynum int64, guessnum int64, way int64) (int64, int64) {
......@@ -639,9 +575,9 @@ func checkFundAmount(luckynum int64, guessnum int64, way int64) (int64, int64) {
}
func (action *Action) checkDraw(lott *LotteryDB) (*types.Receipt, *pty.LotteryUpdateBuyInfo, *pty.LotteryGainInfos, error) {
luckynum := action.findLuckyNum(false, lott)
luckynum, err := action.findLuckyNum(false, lott)
if luckynum < 0 || luckynum >= luckyNumMol {
return nil, nil, nil, pty.ErrLotteryErrLuckyNum
return nil, nil, nil, err
}
llog.Debug("checkDraw", "luckynum", luckynum)
......@@ -755,14 +691,8 @@ func (action *Action) checkDraw(lott *LotteryDB) (*types.Receipt, *pty.LotteryUp
action.recordMissing(lott)
if types.IsPara() {
mainHeight := action.GetMainHeightByTxHash(action.txhash)
if mainHeight < 0 {
llog.Error("LotteryDraw", "mainHeight", mainHeight)
return nil, nil, nil, pty.ErrLotteryStatus
}
lott.LastTransToDrawStateOnMain = mainHeight
lott.LastTransToDrawStateOnMain = action.lottery.GetMainHeight()
}
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, &updateInfo, &gainInfos, nil
}
func (action *Action) recordMissing(lott *LotteryDB) {
......
......@@ -71,17 +71,6 @@ maxTxNumPerAccount=10000
name="para"
genesisBlockTime=1514533394
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
ParaRemoteGrpcClient = "localhost:8802"
#主链指定高度的区块开始同步
startHeight=20
#打包时间间隔,单位秒
writeBlockSeconds=2
#主链每隔几个没有相关交易的区块,平行链上打包空区块
emptyBlockInterval=4
#验证账户,验证节点需要配置自己的账户,并且钱包导入对应种子,非验证节点留空
authAccount="1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4"
#等待平行链共识消息在主链上链并成功的块数,超出会重发共识消息,最小是2
waitBlocks4CommitMsg=2
[mver.consensus]
fundKeyAddr = "1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5"
......@@ -98,6 +87,19 @@ maxTxNumber = 1600 #160
targetTimespan = 2304
targetTimePerBlock = 16
[consensus.sub.para]
ParaRemoteGrpcClient = "localhost:8802"
#主链指定高度的区块开始同步
startHeight=20
#打包时间间隔,单位秒
writeBlockSeconds=2
#主链每隔几个没有相关交易的区块,平行链上打包空区块
emptyBlockInterval=4
#验证账户,验证节点需要配置自己的账户,并且钱包导入对应种子,非验证节点留空
authAccount="1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4"
#等待平行链共识消息在主链上链并成功的块数,超出会重发共识消息,最小是2
waitBlocks4CommitMsg=2
[store]
name="mavl"
driver="memdb"
......
......@@ -72,19 +72,6 @@ maxTxNumPerAccount=10000
name="para"
genesisBlockTime=1514533394
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
ParaRemoteGrpcClient="localhost:8802"
#主链指定高度的区块开始同步
startHeight=345850
#打包时间间隔,单位秒
writeBlockSeconds=2
#主链每隔几个没有相关交易的区块,平行链上打包空区块
emptyBlockInterval=50
#验证账户,验证节点需要配置自己的账户,并且钱包导入对应种子,非验证节点留空
authAccount=""
#等待平行链共识消息在主链上链并成功的块数,超出会重发共识消息,最小是2
waitBlocks4CommitMsg=2
searchHashMatchedBlockDepth=100
[mver.consensus]
fundKeyAddr = "1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5"
......@@ -101,6 +88,20 @@ maxTxNumber = 1600 #160
targetTimespan = 2304
targetTimePerBlock = 16
[consensus.sub.para]
ParaRemoteGrpcClient="localhost:8802"
#主链指定高度的区块开始同步
startHeight=345850
#打包时间间隔,单位秒
writeBlockSeconds=2
#主链每隔几个没有相关交易的区块,平行链上打包空区块
emptyBlockInterval=50
#验证账户,验证节点需要配置自己的账户,并且钱包导入对应种子,非验证节点留空
authAccount=""
#等待平行链共识消息在主链上链并成功的块数,超出会重发共识消息,最小是2
waitBlocks4CommitMsg=2
searchHashMatchedBlockDepth=100
[store]
name="mavl"
driver="leveldb"
......
......@@ -96,8 +96,7 @@ function para_transfer() {
txhash=$(para_configkey "${PARA_CLI}" "token-blacklist" "BTY")
echo "txhash=$txhash"
block_wait "${PARA_CLI}" 1
$PARA_CLI tx query -s "${txhash}"
query_tx "${PARA_CLI}" "${txhash}"
}
......@@ -114,14 +113,34 @@ function para_configkey() {
echo "${send}"
}
function query_tx() {
block_wait "${1}" 3
local times=100
while true; do
ret=$(${1} tx query -s "${2}" | jq -r ".tx.hash")
echo "query hash is ${2}, return ${ret} "
if [ "${ret}" != "${2}" ]; then
block_wait "${1}" 2
times=$((times - 1))
if [ $times -le 0 ]; then
echo "query tx=$2 failed"
exit 1
fi
else
echo "query tx=$2 success"
break
fi
done
}
function token_create() {
echo "=========== # para token test ============="
echo "=========== # 1.token precreate ============="
hash=$(${1} send token precreate -f 0.001 -i test -n guodunjifen -a 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -p 0 -s GD -t 10000 -k 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4)
echo "${hash}"
block_wait "${1}" 3
query_tx "${1}" "${hash}"
${1} tx query -s "${hash}"
${1} token get_precreated
owner=$(${1} token get_precreated | jq -r ".owner")
if [ "${owner}" != "1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4" ]; then
......@@ -137,9 +156,8 @@ function token_create() {
echo "=========== # 2.token finish ============="
hash=$(${1} send token finish -f 0.001 -a 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -s GD -k 0xc34b5d9d44ac7b754806f761d3d4d2c4fe5214f6b074c19f069c4f5c2a29c8cc)
echo "${hash}"
block_wait "${1}" 3
query_tx "${1}" "${hash}"
${1} tx query -s "${hash}"
${1} token get_finish_created
owner=$(${1} token get_finish_created | jq -r ".owner")
if [ "${owner}" != "1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4" ]; then
......@@ -163,9 +181,8 @@ function token_transfer() {
echo "=========== # 2.token transfer ============="
hash=$(${1} send token transfer -a 11 -s GD -t 1GGF8toZd96wCnfJngTwXZnWCBdWHYYvjw -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
echo "${hash}"
block_wait "${1}" 3
query_tx "${1}" "${hash}"
${1} tx query -s "${hash}"
${1} token token_balance -a 1GGF8toZd96wCnfJngTwXZnWCBdWHYYvjw -e token -s GD
balance=$(${1} token token_balance -a 1GGF8toZd96wCnfJngTwXZnWCBdWHYYvjw -e token -s GD | jq -r '.[]|.balance')
if [ "${balance}" != "11.0000" ]; then
......@@ -176,11 +193,10 @@ function token_transfer() {
echo "=========== # 3.token send exec ============="
hash=$(${1} send token send_exec -a 11 -s GD -e paracross -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
echo "${hash}"
block_wait "${1}" 3
query_tx "${1}" "${hash}"
# $ ./build/chain33-cli exec addr -e user.p.para.paracross
# 19WJJv96nKAU4sHFWqGmsqfjxd37jazqii
${1} tx query -s "${hash}"
${1} token token_balance -a 19WJJv96nKAU4sHFWqGmsqfjxd37jazqii -e token -s GD
balance=$(${1} token token_balance -a 19WJJv96nKAU4sHFWqGmsqfjxd37jazqii -e token -s GD | jq -r '.[]|.balance')
if [ "${balance}" != "11.0000" ]; then
......@@ -191,9 +207,8 @@ function token_transfer() {
echo "=========== # 4.token withdraw ============="
hash=$(${1} send token withdraw -a 11 -s GD -e paracross -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
echo "${hash}"
block_wait "${1}" 3
query_tx "${1}" "${hash}"
${1} tx query -s "${hash}"
${1} token token_balance -a 19WJJv96nKAU4sHFWqGmsqfjxd37jazqii -e token -s GD
balance=$(${1} token token_balance -a 19WJJv96nKAU4sHFWqGmsqfjxd37jazqii -e token -s GD | jq -r '.[]|.balance')
if [ "${balance}" != "0.0000" ]; then
......@@ -213,10 +228,10 @@ function para_cross_transfer_withdraw() {
sleep 15
${CLI} send para asset_withdraw --title user.p.para. -a 0.7 -n test -t 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01
times=100
local times=100
while true; do
acc=$(${CLI} account balance -e paracross -a 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv | jq -r ".balance")
echo "account balance is ${acc}, except 9.3 "
echo "account balance is ${acc}, expect 9.3 "
if [ "${acc}" != "9.3000" ]; then
block_wait "${CLI}" 2
times=$((times - 1))
......
......@@ -189,7 +189,7 @@ func CreateRawMinerTx(status *ParacrossNodeStatus) (*types.Transaction, error) {
// CreateRawTransferTx create paracross asset transfer tx with transfer and withdraw
func (p ParacrossType) CreateRawTransferTx(action string, param json.RawMessage) (*types.Transaction, error) {
tlog.Error("ParacrossType CreateTx failed", "action", action, "msg", string(param))
tlog.Info("ParacrossType CreateTx", "action", action, "msg", string(param))
tx, err := p.ExecTypeBase.CreateTx(action, param)
if err != nil {
tlog.Error("ParacrossType CreateTx failed", "err", err, "action", action, "msg", string(param))
......
......@@ -101,12 +101,7 @@ func (p ParacrossType) CreateTx(action string, message json.RawMessage) (*types.
} else if action == "ParacrossTransfer" || action == "Transfer" ||
action == "ParacrossWithdraw" || action == "Withdraw" ||
action == "ParacrossTransferToExec" || action == "TransferToExec" {
var param types.CreateTx
err := json.Unmarshal(message, &param)
if err != nil {
glog.Error("CreateTx", "Error", err)
return nil, types.ErrInvalidParam
}
return p.CreateRawTransferTx(action, message)
}
......
......@@ -19,7 +19,7 @@ const (
// GetRandNum for ticket executor
func (ticket *Ticket) GetRandNum(blockHash []byte, blockNum int64) (types.Message, error) {
tlog.Debug("GetRandNum", "blockHash", blockHash, "blockNum", blockNum)
tlog.Debug("GetRandNum", "blockHash", common.ToHex(blockHash), "blockNum", blockNum)
if blockNum < minBlockNum {
blockNum = minBlockNum
......@@ -35,6 +35,11 @@ func (ticket *Ticket) GetRandNum(blockHash []byte, blockNum int64) (types.Messag
if err != nil {
return nil, err
}
//如果是genesis block 那么直接返回一个固定值,防止测试的时候出错
if txActions == nil && err == nil {
modify := common.Sha256([]byte("hello"))
return &types.ReplyHash{Hash: modify}, nil
}
var modifies []byte
var bits uint32
var ticketIds string
......@@ -59,7 +64,7 @@ func (ticket *Ticket) getTxActions(blockHash []byte, blockNum int64) ([]*tickett
var txActions []*tickettypes.TicketAction
var reqHashes types.ReqHashes
currHash := blockHash
tlog.Debug("getTxActions", "blockHash", blockHash, "blockNum", blockNum)
tlog.Debug("getTxActions", "blockHash", common.ToHex(blockHash), "blockNum", blockNum)
//根据blockHash,查询block,循环blockNum
for blockNum > 0 {
......@@ -69,22 +74,26 @@ func (ticket *Ticket) getTxActions(blockHash []byte, blockNum int64) ([]*tickett
if err != nil {
return txActions, err
}
if tempBlock.Head.Height <= 0 {
return nil, nil
}
reqHashes.Hashes = append(reqHashes.Hashes, currHash)
currHash = tempBlock.Head.ParentHash
if tempBlock.Head.Height < 0 && blockNum > 1 {
return txActions, types.ErrBlockNotFound
}
if tempBlock.Head.Height <= 1 {
break
}
blockNum--
}
blockDetails, err := ticket.GetAPI().GetBlockByHashes(&reqHashes)
if err != nil {
tlog.Error("getTxActions", "blockHash", blockHash, "blockNum", blockNum, "err", err)
return txActions, err
}
for _, block := range blockDetails.Items {
tlog.Debug("getTxActions", "blockHeight", block.Block.Height, "blockhash", block.Block.Hash())
tlog.Debug("getTxActions", "blockHeight", block.Block.Height, "blockhash", common.ToHex(block.Block.Hash()))
ticketAction, err := ticket.getMinerTx(block.Block)
if err != nil {
return txActions, err
......@@ -92,7 +101,6 @@ func (ticket *Ticket) getTxActions(blockHash []byte, blockNum int64) ([]*tickett
txActions = append(txActions, ticketAction)
}
return txActions, nil
}
func (ticket *Ticket) getMinerTx(current *types.Block) (*tickettypes.TicketAction, error) {
......
......@@ -43,7 +43,10 @@ func execBlock(client queue.Client, prevStateRoot []byte, block *types.Block, er
block.TxHash = merkle.CalcMerkleRootCache(cacheTxs)
block.Txs = types.CacheToTxs(cacheTxs)
//println("1")
receipts := util.ExecTx(client, prevStateRoot, block)
receipts, err := util.ExecTx(client, prevStateRoot, block)
if err != nil {
return nil, nil, err
}
var maplist = make(map[string]*types.KeyValue)
var kvset []*types.KeyValue
var deltxlist = make(map[int]bool)
......@@ -94,7 +97,10 @@ func execBlock(client queue.Client, prevStateRoot []byte, block *types.Block, er
var detail types.BlockDetail
calcHash = util.ExecKVMemSet(client, prevStateRoot, block.Height, kvset, sync)
calcHash, err = util.ExecKVMemSet(client, prevStateRoot, block.Height, kvset, sync)
if err != nil {
return nil, nil, err
}
//println("2")
if errReturn && !bytes.Equal(block.StateHash, calcHash) {
util.ExecKVSetRollback(client, calcHash)
......
......@@ -230,7 +230,7 @@ func (chain *BlockChain) getLastHeader(msg queue.Message) {
func (chain *BlockChain) addBlockDetail(msg queue.Message) {
blockDetail := msg.Data.(*types.BlockDetail)
Height := blockDetail.Block.Height
chainlog.Info("EventAddBlockDetail", "height", blockDetail.Block.Height, "hash", common.HashHex(blockDetail.Block.Hash()))
chainlog.Info("EventAddBlockDetail", "height", blockDetail.Block.Height, "parent", common.ToHex(blockDetail.Block.ParentHash))
//首先判断共识过来的block的parenthash是否是当前bestchain链的tip区块,如果不是就直接返回错误给共识模块
blockDetail, err := chain.ProcAddBlockMsg(true, blockDetail, "self")
if err != nil {
......
#!/usr/bin/env bash
withdraw=$(../chain33-cli bty withdraw -e "ticket" -n "安全支出费用: $1" -a "$1")
send=$(../chain33-cli bty transfer -a "$1" -n "安全支出费用: $1" -t 1MY4pMgjpS2vWiaSDZasRhN47pcwEire32)
echo "cli wallet sign -d $withdraw -a 1JmFaA6unrCFYEWPGRi7uuXY1KthTJxJEP >d:/a.txt"
echo "cli wallet sign -d $send -a 1JmFaA6unrCFYEWPGRi7uuXY1KthTJxJEP >>d:/a.txt"
//这个包提供了平行链和主链的统一的访问接口
package api
import (
"context"
"errors"
"sync/atomic"
"github.com/33cn/chain33/client"
"github.com/33cn/chain33/queue"
"github.com/33cn/chain33/types"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
)
/*
平行链可以访问的有两条链:
1. 通过 client.QueueProtocolAPI 事件访问 平行链本身
2. 通过 grpc 接口访问主链
通过 client.QueueProtocolAPI 和 grpc 都可能会产生 网络错误,或者超时的问题
这个时候,区块做异常处理的时候需要做一些特殊处理
接口函数:
1. GetBlockByHash
2. GetLastBlockHash
3. GetRandNum
*/
//ErrAPIEnv api的执行环境出问题,区块执行的时候,遇到这一个的错误需要retry
var ErrAPIEnv = errors.New("ErrAPIEnv")
//ExecutorAPI 提供给执行器使用的接口
//因为合约是主链和平行链通用的,所以,主链和平行链都可以调用这套接口
type ExecutorAPI interface {
GetBlockByHashes(param *types.ReqHashes) (*types.BlockDetails, error)
GetRandNum(param *types.ReqRandHash) ([]byte, error)
QueryTx(param *types.ReqHash) (*types.TransactionDetail, error)
IsErr() bool
}
type mainChainAPI struct {
api client.QueueProtocolAPI
errflag int32
}
//New 新建接口
func New(api client.QueueProtocolAPI, grpcaddr string) ExecutorAPI {
if types.IsPara() {
return newParaChainAPI(api, grpcaddr)
}
return &mainChainAPI{api: api}
}
func (api *mainChainAPI) QueryTx(param *types.ReqHash) (*types.TransactionDetail, error) {
data, err := api.api.QueryTx(param)
return data, seterr(err, &api.errflag)
}
func (api *mainChainAPI) IsErr() bool {
return atomic.LoadInt32(&api.errflag) == 1
}
func (api *mainChainAPI) GetRandNum(param *types.ReqRandHash) ([]byte, error) {
msg, err := api.api.Query(param.ExecName, "RandNumHash", param)
if err != nil {
return nil, seterr(err, &api.errflag)
}
reply, ok := msg.(*types.ReplyHash)
if !ok {
return nil, types.ErrTypeAsset
}
return reply.Hash, nil
}
func (api *mainChainAPI) GetBlockByHashes(param *types.ReqHashes) (*types.BlockDetails, error) {
data, err := api.api.GetBlockByHashes(param)
return data, seterr(err, &api.errflag)
}
type paraChainAPI struct {
api client.QueueProtocolAPI
grpcClient types.Chain33Client
errflag int32
}
func newParaChainAPI(api client.QueueProtocolAPI, grpcaddr string) ExecutorAPI {
paraRemoteGrpcClient := types.Conf("config.consensus.sub.para").GStr("ParaRemoteGrpcClient")
if grpcaddr != "" {
paraRemoteGrpcClient = grpcaddr
}
if paraRemoteGrpcClient == "" {
paraRemoteGrpcClient = "127.0.0.1:8002"
}
conn, err := grpc.Dial(paraRemoteGrpcClient, grpc.WithInsecure())
if err != nil {
panic(err)
}
grpcClient := types.NewChain33Client(conn)
return &paraChainAPI{api: api, grpcClient: grpcClient}
}
func (api *paraChainAPI) IsErr() bool {
return atomic.LoadInt32(&api.errflag) == 1
}
func (api *paraChainAPI) QueryTx(param *types.ReqHash) (*types.TransactionDetail, error) {
data, err := api.grpcClient.QueryTransaction(context.Background(), param)
return data, seterr(err, &api.errflag)
}
func (api *paraChainAPI) GetRandNum(param *types.ReqRandHash) ([]byte, error) {
reply, err := api.grpcClient.QueryRandNum(context.Background(), param)
if err != nil {
return nil, seterr(err, &api.errflag)
}
return reply.Hash, nil
}
func (api *paraChainAPI) GetBlockByHashes(param *types.ReqHashes) (*types.BlockDetails, error) {
data, err := api.grpcClient.GetBlockByHashes(context.Background(), param)
return data, seterr(err, &api.errflag)
}
func seterr(err error, flag *int32) error {
if IsGrpcError(err) || IsQueueError(err) {
atomic.StoreInt32(flag, 1)
}
return err
}
//IsGrpcError 判断系统api 错误,还是 rpc 本身的错误
func IsGrpcError(err error) bool {
if err == nil {
return false
}
if err == ErrAPIEnv {
return true
}
if grpc.Code(err) == codes.Unknown {
return false
}
return true
}
//IsQueueError 是否是队列错误
func IsQueueError(err error) bool {
if err == nil {
return false
}
if err == ErrAPIEnv {
return true
}
if err == queue.ErrQueueTimeout ||
err == queue.ErrQueueChannelFull ||
err == queue.ErrIsQueueClosed {
return true
}
return false
}
package api
import (
"errors"
"testing"
"time"
"github.com/33cn/chain33/client/mocks"
"github.com/33cn/chain33/queue"
qmocks "github.com/33cn/chain33/queue/mocks"
"github.com/33cn/chain33/rpc"
"github.com/33cn/chain33/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
func TestAPI(t *testing.T) {
api := new(mocks.QueueProtocolAPI)
eapi := New(api, "")
param := &types.ReqHashes{
Hashes: [][]byte{[]byte("hello")},
}
api.On("GetBlockByHashes", mock.Anything).Return(&types.BlockDetails{}, nil)
detail, err := eapi.GetBlockByHashes(param)
assert.Nil(t, err)
assert.Equal(t, detail, &types.BlockDetails{})
param2 := &types.ReqRandHash{
ExecName: "ticket",
BlockNum: 5,
Hash: []byte("hello"),
}
api.On("Query", "ticket", "RandNumHash", mock.Anything).Return(&types.ReplyHash{Hash: []byte("hello")}, nil)
randhash, err := eapi.GetRandNum(param2)
assert.Nil(t, err)
assert.Equal(t, randhash, []byte("hello"))
assert.Equal(t, false, eapi.IsErr())
api.On("QueryTx", mock.Anything).Return(&types.TransactionDetail{Height: 1}, nil)
param3 := &types.ReqHash{Hash: []byte("hash")}
txdetail, err := eapi.QueryTx(param3)
assert.Nil(t, err)
assert.Equal(t, int64(1), txdetail.Height)
types.SetTitleOnlyForTest("user.p.wzw.")
//testnode setup
rpcCfg := new(types.RPC)
rpcCfg.GrpcBindAddr = "127.0.0.1:8003"
rpcCfg.JrpcBindAddr = "127.0.0.1:8004"
rpcCfg.MainnetJrpcAddr = rpcCfg.JrpcBindAddr
rpcCfg.Whitelist = []string{"127.0.0.1", "0.0.0.0"}
rpcCfg.JrpcFuncWhitelist = []string{"*"}
rpcCfg.GrpcFuncWhitelist = []string{"*"}
rpc.InitCfg(rpcCfg)
server := rpc.NewGRpcServer(&qmocks.Client{}, api)
assert.NotNil(t, server)
go server.Listen()
time.Sleep(time.Second)
eapi = New(api, "")
_, err = eapi.GetBlockByHashes(param)
assert.Equal(t, true, IsGrpcError(err))
assert.Equal(t, false, IsGrpcError(nil))
assert.Equal(t, false, IsGrpcError(errors.New("xxxx")))
assert.Equal(t, true, eapi.IsErr())
eapi = New(api, "127.0.0.1:8003")
detail, err = eapi.GetBlockByHashes(param)
assert.Equal(t, err, nil)
assert.Equal(t, detail, &types.BlockDetails{})
randhash, err = eapi.GetRandNum(param2)
assert.Nil(t, err)
assert.Equal(t, randhash, []byte("hello"))
assert.Equal(t, false, eapi.IsErr())
param3 = &types.ReqHash{Hash: []byte("hash")}
txdetail, err = eapi.QueryTx(param3)
assert.Nil(t, err)
assert.Equal(t, int64(1), txdetail.Height)
//queue err
assert.Equal(t, false, IsQueueError(nil))
assert.Equal(t, false, IsQueueError(errors.New("xxxx")))
assert.Equal(t, true, IsQueueError(queue.ErrQueueTimeout))
assert.Equal(t, true, IsQueueError(queue.ErrIsQueueClosed))
assert.Equal(t, false, IsQueueError(errors.New("ErrIsQueueClosed")))
}
......@@ -78,7 +78,10 @@ func main() {
log.Info("execblock", "block height", *height)
prevState := blocks.Items[0].Block.StateHash
block := blocks.Items[1].Block
receipt := util.ExecTx(q.Client(), prevState, block)
receipt, err := util.ExecTx(q.Client(), prevState, block)
if err != nil {
panic(err)
}
for i, r := range receipt.GetReceipts() {
println("=======================")
println("tx index ", i)
......
......@@ -9,6 +9,7 @@ import (
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/client"
"github.com/33cn/chain33/client/api"
"github.com/33cn/chain33/common/address"
dbm "github.com/33cn/chain33/common/db"
drivers "github.com/33cn/chain33/system/dapp"
......@@ -21,29 +22,40 @@ type executor struct {
stateDB dbm.KV
localDB dbm.KVDB
coinsAccount *account.DB
ctx *executorCtx
height int64
blocktime int64
// 增加区块的难度值,后面的执行器逻辑需要这些属性
difficulty uint64
txs []*types.Transaction
api client.QueueProtocolAPI
execapi api.ExecutorAPI
receipts []*types.ReceiptData
}
func newExecutor(stateHash []byte, exec *Executor, height, blocktime int64, difficulty uint64,
txs []*types.Transaction, receipts []*types.ReceiptData) *executor {
type executorCtx struct {
stateHash []byte
height int64
blocktime int64
difficulty uint64
parentHash []byte
mainHash []byte
mainHeight int64
}
func newExecutor(ctx *executorCtx, exec *Executor, txs []*types.Transaction, receipts []*types.ReceiptData) *executor {
client := exec.client
enableMVCC := exec.pluginEnable["mvcc"]
opt := &StateDBOption{EnableMVCC: enableMVCC, Height: height}
opt := &StateDBOption{EnableMVCC: enableMVCC, Height: ctx.height}
localdb := NewLocalDB(client)
e := &executor{
stateDB: NewStateDB(client, stateHash, localdb, opt),
stateDB: NewStateDB(client, ctx.stateHash, localdb, opt),
localDB: localdb,
coinsAccount: account.NewCoinsAccount(),
height: height,
blocktime: blocktime,
difficulty: difficulty,
height: ctx.height,
blocktime: ctx.blocktime,
difficulty: ctx.difficulty,
ctx: ctx,
txs: txs,
receipts: receipts,
}
......@@ -136,7 +148,9 @@ func (e *executor) setEnv(exec drivers.Driver) {
exec.SetStateDB(e.stateDB)
exec.SetLocalDB(e.localDB)
exec.SetEnv(e.height, e.blocktime, e.difficulty)
exec.SetBlockInfo(e.ctx.parentHash, e.ctx.mainHash, e.ctx.mainHeight)
exec.SetAPI(e.api)
e.execapi = exec.GetExecutorAPI()
exec.SetTxs(e.txs)
exec.SetReceipt(e.receipts)
}
......
......@@ -11,6 +11,7 @@ import (
"sync"
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/client/api"
clog "github.com/33cn/chain33/common/log"
log "github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/pluginmgr"
......@@ -156,7 +157,16 @@ func (exec *Executor) procExecQuery(msg queue.Message) {
func (exec *Executor) procExecCheckTx(msg queue.Message) {
datas := msg.GetData().(*types.ExecTxList)
execute := newExecutor(datas.StateHash, exec, datas.Height, datas.BlockTime, datas.Difficulty, datas.Txs, nil)
ctx := &executorCtx{
stateHash: datas.StateHash,
height: datas.Height,
blocktime: datas.BlockTime,
difficulty: datas.Difficulty,
mainHash: datas.MainHash,
mainHeight: datas.MainHeight,
parentHash: datas.ParentHash,
}
execute := newExecutor(ctx, exec, datas.Txs, nil)
execute.enableMVCC()
execute.api = exec.qclient
//返回一个列表表示成功还是失败
......@@ -179,7 +189,16 @@ func (exec *Executor) procExecCheckTx(msg queue.Message) {
func (exec *Executor) procExecTxList(msg queue.Message) {
datas := msg.GetData().(*types.ExecTxList)
execute := newExecutor(datas.StateHash, exec, datas.Height, datas.BlockTime, datas.Difficulty, datas.Txs, nil)
ctx := &executorCtx{
stateHash: datas.StateHash,
height: datas.Height,
blocktime: datas.BlockTime,
difficulty: datas.Difficulty,
mainHash: datas.MainHash,
mainHeight: datas.MainHeight,
parentHash: datas.ParentHash,
}
execute := newExecutor(ctx, exec, datas.Txs, nil)
execute.enableMVCC()
execute.api = exec.qclient
var receipts []*types.Receipt
......@@ -193,6 +212,10 @@ func (exec *Executor) procExecTxList(msg queue.Message) {
}
if tx.GroupCount == 0 {
receipt, err := execute.execTx(tx, index)
if api.IsGrpcError(err) || api.IsQueueError(err) {
msg.Reply(exec.client.NewMessage("", types.EventReceipts, err))
return
}
if err != nil {
receipts = append(receipts, types.NewErrReceipt(err))
continue
......@@ -217,6 +240,10 @@ func (exec *Executor) procExecTxList(msg queue.Message) {
panic("len(receiptlist) must be equal tx.GroupCount")
}
if err != nil {
if api.IsGrpcError(err) || api.IsQueueError(err) {
msg.Reply(exec.client.NewMessage("", types.EventReceipts, err))
return
}
for n := 0; n < int(tx.GroupCount); n++ {
receipts = append(receipts, types.NewErrReceipt(err))
}
......@@ -232,7 +259,16 @@ func (exec *Executor) procExecTxList(msg queue.Message) {
func (exec *Executor) procExecAddBlock(msg queue.Message) {
datas := msg.GetData().(*types.BlockDetail)
b := datas.Block
execute := newExecutor(b.StateHash, exec, b.Height, b.BlockTime, uint64(b.Difficulty), b.Txs, datas.Receipts)
ctx := &executorCtx{
stateHash: b.StateHash,
height: b.Height,
blocktime: b.BlockTime,
difficulty: uint64(b.Difficulty),
mainHash: b.MainHash,
mainHeight: b.MainHeight,
parentHash: b.ParentHash,
}
execute := newExecutor(ctx, exec, b.Txs, datas.Receipts)
execute.enableMVCC()
execute.api = exec.qclient
var kvset types.LocalDBSet
......@@ -284,7 +320,16 @@ func (exec *Executor) procExecAddBlock(msg queue.Message) {
func (exec *Executor) procExecDelBlock(msg queue.Message) {
datas := msg.GetData().(*types.BlockDetail)
b := datas.Block
execute := newExecutor(b.StateHash, exec, b.Height, b.BlockTime, uint64(b.Difficulty), b.Txs, nil)
ctx := &executorCtx{
stateHash: b.StateHash,
height: b.Height,
blocktime: b.BlockTime,
difficulty: uint64(b.Difficulty),
mainHash: b.MainHash,
mainHeight: b.MainHeight,
parentHash: b.ParentHash,
}
execute := newExecutor(ctx, exec, b.Txs, nil)
execute.enableMVCC()
execute.api = exec.qclient
var kvset types.LocalDBSet
......
......@@ -49,7 +49,15 @@ func TestExecutorGetTxGroup(t *testing.T) {
txgroup.SignN(1, types.SECP256K1, priv2)
txgroup.SignN(2, types.SECP256K1, priv3)
txs = txgroup.GetTxs()
execute := newExecutor(nil, exec, 1, time.Now().Unix(), 1, txs, nil)
ctx := &executorCtx{
stateHash: nil,
height: 1,
blocktime: time.Now().Unix(),
difficulty: 1,
mainHash: nil,
parentHash: nil,
}
execute := newExecutor(ctx, exec, txs, nil)
e := execute.loadDriver(txs[0], 0)
execute.setEnv(e)
txs2 := e.GetTxs()
......@@ -64,7 +72,7 @@ func TestExecutorGetTxGroup(t *testing.T) {
//err tx group list
txs[0].Header = nil
execute = newExecutor(nil, exec, 1, time.Now().Unix(), 1, txs, nil)
execute = newExecutor(ctx, exec, txs, nil)
e = execute.loadDriver(txs[0], 0)
execute.setEnv(e)
_, err = e.GetTxGroup(len(txs) - 1)
......
......@@ -76,7 +76,7 @@ func (client *client) Send(msg Message, waitReply bool) (err error) {
timeout = time.Minute
}
err = client.SendTimeout(msg, waitReply, timeout)
if err == types.ErrTimeout {
if err == ErrQueueTimeout {
panic(err)
}
return err
......@@ -85,7 +85,7 @@ func (client *client) Send(msg Message, waitReply bool) (err error) {
// SendTimeout 超时发送, msg 消息 ,waitReply 是否等待回应, timeout 超时时间
func (client *client) SendTimeout(msg Message, waitReply bool, timeout time.Duration) (err error) {
if client.isClose() {
return types.ErrIsClosed
return ErrIsQueueClosed
}
if !waitReply {
msg.chReply = nil
......@@ -115,9 +115,9 @@ func (client *client) WaitTimeout(msg Message, timeout time.Duration) (Message,
case msg = <-msg.chReply:
return msg, msg.Err()
case <-client.done:
return Message{}, errors.New("client is closed")
return Message{}, ErrIsQueueClosed
case <-t.C:
return Message{}, types.ErrTimeout
return Message{}, ErrQueueTimeout
}
}
......@@ -128,7 +128,7 @@ func (client *client) Wait(msg Message) (Message, error) {
timeout = 5 * time.Minute
}
msg, err := client.WaitTimeout(msg, timeout)
if err == types.ErrTimeout {
if err == ErrQueueTimeout {
panic(err)
}
return msg, err
......
......@@ -6,6 +6,7 @@
package queue
import (
"errors"
"fmt"
"os"
"os/signal"
......@@ -32,6 +33,13 @@ const (
defaultLowChanBuffer = 40960
)
//消息队列的错误
var (
ErrIsQueueClosed = errors.New("ErrIsQueueClosed")
ErrQueueTimeout = errors.New("ErrQueueTimeout")
ErrQueueChannelFull = errors.New("ErrQueueChannelFull")
)
// DisableLog disable log
func DisableLog() {
qlog.SetHandler(log.DiscardHandler())
......@@ -162,7 +170,7 @@ func (q *queue) send(msg Message, timeout time.Duration) (err error) {
return nil
default:
qlog.Debug("send chainfull", "msg", msg, "topic", msg.Topic, "sub", sub)
return types.ErrChannelFull
return ErrQueueChannelFull
}
}
t := time.NewTimer(timeout)
......@@ -171,7 +179,7 @@ func (q *queue) send(msg Message, timeout time.Duration) (err error) {
case sub.high <- msg:
case <-t.C:
qlog.Debug("send timeout", "msg", msg, "topic", msg.Topic, "sub", sub)
return types.ErrTimeout
return ErrQueueTimeout
}
if msg.Topic != "store" {
qlog.Debug("send ok", "msg", msg, "topic", msg.Topic, "sub", sub)
......@@ -192,8 +200,8 @@ func (q *queue) sendAsyn(msg Message) error {
qlog.Debug("send asyn ok", "msg", msg)
return nil
default:
qlog.Error("send asyn err", "msg", msg, "err", types.ErrChannelFull)
return types.ErrChannelFull
qlog.Error("send asyn err", "msg", msg, "err", ErrQueueChannelFull)
return ErrQueueChannelFull
}
}
......@@ -216,7 +224,7 @@ func (q *queue) sendLowTimeout(msg Message, timeout time.Duration) error {
return nil
case <-t.C:
qlog.Error("send asyn timeout", "msg", msg)
return types.ErrTimeout
return ErrQueueTimeout
}
}
......
......@@ -43,14 +43,14 @@ func TestTimeout(t *testing.T) {
//再发送一个交易返回chain full
err := client.SendTimeout(msg, true, 0)
if err != types.ErrChannelFull {
if err != ErrQueueChannelFull {
t.Error(err)
return
}
//发送一个交易返回返回timeout
err = client.SendTimeout(msg, true, time.Millisecond)
if err != types.ErrTimeout {
if err != ErrQueueTimeout {
t.Error(err)
return
}
......
......@@ -5,7 +5,6 @@
package commands
import (
"encoding/json"
"fmt"
"math"
"os"
......@@ -133,15 +132,10 @@ func CreateAssetSendToExec(cmd *cobra.Command, args []string, fromExec string) {
ExecName: exec,
}
data, err := json.Marshal(&payload)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
params := &rpcTypes.CreateTxIn{
Execer: types.ExecName(fromExec),
ActionName: "TransferToExec",
Payload: data,
Payload: types.MustPBToJSON(payload),
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
......@@ -171,15 +165,10 @@ func CreateAssetWithdraw(cmd *cobra.Command, args []string, fromExec string) {
Cointoken: symbol,
ExecName: exec,
}
data, err := json.Marshal(&payload)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
params := &rpcTypes.CreateTxIn{
Execer: types.ExecName(fromExec),
ActionName: "Withdraw",
Payload: data,
Payload: types.MustPBToJSON(payload),
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
......@@ -200,15 +189,10 @@ func CreateAssetTransfer(cmd *cobra.Command, args []string, fromExec string) {
Note: []byte(note),
Cointoken: symbol,
}
data, err := json.Marshal(&payload)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
params := &rpcTypes.CreateTxIn{
Execer: types.ExecName(fromExec),
ActionName: "Transfer",
Payload: data,
Payload: types.MustPBToJSON(payload),
}
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
......
......@@ -15,6 +15,7 @@ import (
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/client"
"github.com/33cn/chain33/client/api"
"github.com/33cn/chain33/common/address"
dbm "github.com/33cn/chain33/common/db"
log "github.com/33cn/chain33/common/log/log15"
......@@ -41,6 +42,7 @@ type Driver interface {
GetDriverName() string
//执行器的别名(一个驱动(code),允许创建多个执行器,类似evm一份代码可以创建多个合约)
GetName() string
GetExecutorAPI() api.ExecutorAPI
//设置执行器的真实名称
SetName(string)
SetCurrentExecName(string)
......@@ -48,6 +50,7 @@ type Driver interface {
IsFriend(myexec []byte, writekey []byte, othertx *types.Transaction) bool
GetActionName(tx *types.Transaction) string
SetEnv(height, blocktime int64, difficulty uint64)
SetBlockInfo([]byte, []byte, int64)
CheckTx(tx *types.Transaction, index int) error
Exec(tx *types.Transaction, index int) (*types.Receipt, error)
ExecLocal(tx *types.Transaction, receipt *types.ReceiptData, index int) (*types.LocalDBSet, error)
......@@ -69,21 +72,24 @@ type Driver interface {
// DriverBase defines driverbase type
type DriverBase struct {
statedb dbm.KV
localdb dbm.KVDB
coinsaccount *account.DB
height int64
blocktime int64
name string
curname string
child Driver
childValue reflect.Value
isFree bool
difficulty uint64
api client.QueueProtocolAPI
txs []*types.Transaction
receipts []*types.ReceiptData
ety types.ExecutorType
statedb dbm.KV
localdb dbm.KVDB
coinsaccount *account.DB
height int64
blocktime int64
parentHash, mainHash []byte
mainHeight int64
name string
curname string
child Driver
childValue reflect.Value
isFree bool
difficulty uint64
api client.QueueProtocolAPI
execapi api.ExecutorAPI
txs []*types.Transaction
receipts []*types.ReceiptData
ety types.ExecutorType
}
// GetPayloadValue define get payload func
......@@ -99,6 +105,19 @@ func (d *DriverBase) GetExecutorType() types.ExecutorType {
return d.ety
}
//GetLastHash 获取最后区块的hash,主链和平行链不同
func (d *DriverBase) GetLastHash() []byte {
if types.IsPara() {
return d.mainHash
}
return d.parentHash
}
//GetParentHash 获取上一个区块的hash
func (d *DriverBase) GetParentHash() []byte {
return d.parentHash
}
// GetFuncMap defines get execfuncmap func
func (d *DriverBase) GetFuncMap() map[string]reflect.Method {
if d.ety == nil {
......@@ -108,8 +127,9 @@ func (d *DriverBase) GetFuncMap() map[string]reflect.Method {
}
// SetAPI set queue protocol api
func (d *DriverBase) SetAPI(api client.QueueProtocolAPI) {
d.api = api
func (d *DriverBase) SetAPI(queueapi client.QueueProtocolAPI) {
d.api = queueapi
d.execapi = api.New(queueapi, "")
}
// GetAPI return queue protocol api
......@@ -117,6 +137,11 @@ func (d *DriverBase) GetAPI() client.QueueProtocolAPI {
return d.api
}
// GetExecutorAPI return executor api
func (d *DriverBase) GetExecutorAPI() api.ExecutorAPI {
return d.execapi
}
// SetEnv set env
func (d *DriverBase) SetEnv(height, blocktime int64, difficulty uint64) {
d.height = height
......@@ -124,6 +149,13 @@ func (d *DriverBase) SetEnv(height, blocktime int64, difficulty uint64) {
d.difficulty = difficulty
}
//SetBlockInfo 设置区块的信息
func (d *DriverBase) SetBlockInfo(parentHash, mainHash []byte, mainHeight int64) {
d.parentHash = parentHash
d.mainHash = mainHash
d.mainHeight = mainHeight
}
// SetIsFree set isfree
func (d *DriverBase) SetIsFree(isFree bool) {
d.isFree = isFree
......@@ -366,6 +398,14 @@ func (d *DriverBase) GetHeight() int64 {
return d.height
}
// GetMainHeight return height
func (d *DriverBase) GetMainHeight() int64 {
if types.IsPara() {
return d.mainHeight
}
return d.height
}
// GetBlockTime return block time
func (d *DriverBase) GetBlockTime() int64 {
return d.blocktime
......
......@@ -2,8 +2,11 @@ package dapp
import (
"testing"
"time"
"github.com/33cn/chain33/client/mocks"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/util"
"github.com/stretchr/testify/assert"
)
......@@ -35,9 +38,12 @@ func (none *noneApp) GetDriverName() string {
return "none"
}
func TestReigister(t *testing.T) {
func init() {
Register("none", newnoneApp, 0)
Register("demo", newdemoApp, 1)
}
func TestReigister(t *testing.T) {
_, err := LoadDriver("demo", 0)
assert.Equal(t, err, types.ErrUnknowDriver)
_, err = LoadDriver("demo", 1)
......@@ -65,6 +71,48 @@ func TestReigister(t *testing.T) {
assert.Equal(t, "none", driver.GetDriverName())
}
func TestDriverAPI(t *testing.T) {
tx := &types.Transaction{Execer: []byte("demo")}
demo := LoadDriverAllow(tx, 0, 1).(*demoApp)
dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb)
demo.SetEnv(1, time.Now().Unix(), 1)
demo.SetBlockInfo([]byte("parentHash"), []byte("mainHash"), 1)
demo.SetLocalDB(kvdb)
demo.SetStateDB(kvdb)
demo.SetAPI(&mocks.QueueProtocolAPI{})
assert.NotNil(t, demo.GetAPI())
assert.NotNil(t, demo.GetExecutorAPI())
types.SetTitleOnlyForTest("chain33")
assert.Equal(t, "parentHash", string(demo.GetParentHash()))
assert.Equal(t, "parentHash", string(demo.GetLastHash()))
types.SetTitleOnlyForTest("user.p.wzw.")
assert.Equal(t, "parentHash", string(demo.GetParentHash()))
assert.Equal(t, "mainHash", string(demo.GetLastHash()))
assert.Equal(t, int64(1), demo.GetMainHeight())
assert.Equal(t, true, IsDriverAddress(ExecAddress("none"), 0))
assert.Equal(t, false, IsDriverAddress(ExecAddress("demo"), 0))
assert.Equal(t, true, IsDriverAddress(ExecAddress("demo"), 1))
}
func TestExecAddress(t *testing.T) {
assert.Equal(t, "16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp", ExecAddress("ticket"))
}
func TestAllow(t *testing.T) {
tx := &types.Transaction{Execer: []byte("demo")}
demo := LoadDriverAllow(tx, 0, 1).(*demoApp)
assert.Equal(t, true, demo.AllowIsSame([]byte("demo")))
types.SetTitleOnlyForTest("user.p.wzw.")
assert.Equal(t, true, demo.AllowIsSame([]byte("user.p.wzw.demo")))
assert.Equal(t, false, demo.AllowIsSame([]byte("user.p.wzw2.demo")))
assert.Equal(t, false, demo.AllowIsUserDot1([]byte("user.p.wzw.demo")))
assert.Equal(t, true, demo.AllowIsUserDot1([]byte("user.demo")))
assert.Equal(t, true, demo.AllowIsUserDot1([]byte("user.p.wzw.user.demo")))
assert.Equal(t, true, demo.AllowIsUserDot2([]byte("user.p.wzw.user.demo.xxxx")))
assert.Equal(t, true, demo.AllowIsUserDot2([]byte("user.demo.xxxx")))
assert.Equal(t, nil, demo.Allow(tx, 0))
tx = &types.Transaction{Execer: []byte("demo2")}
assert.Equal(t, types.ErrNotAllow, demo.Allow(tx, 0))
assert.Equal(t, false, demo.IsFriend(nil, nil, nil))
}
......@@ -7,23 +7,12 @@ package dapp
//store package store the world - state data
import (
"github.com/33cn/chain33/common/address"
clog "github.com/33cn/chain33/common/log"
log "github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/types"
)
var elog = log.New("module", "execs")
// SetLogLevel set log level
func SetLogLevel(level string) {
clog.SetLogLevel(level)
}
// DisableLog disable log
func DisableLog() {
elog.SetHandler(log.DiscardHandler())
}
// DriverCreate defines a drivercreate function
type DriverCreate func() Driver
......
......@@ -143,6 +143,7 @@ func (m *Header) GetSignature() *Signature {
}
// 参考Header解释
// mainHash 平行链上使用的字段,代表这个区块的主链hash
type Block struct {
Version int64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
ParentHash []byte `protobuf:"bytes,2,opt,name=parentHash,proto3" json:"parentHash,omitempty"`
......@@ -151,6 +152,8 @@ type Block struct {
Height int64 `protobuf:"varint,5,opt,name=height,proto3" json:"height,omitempty"`
BlockTime int64 `protobuf:"varint,6,opt,name=blockTime,proto3" json:"blockTime,omitempty"`
Difficulty uint32 `protobuf:"varint,11,opt,name=difficulty,proto3" json:"difficulty,omitempty"`
MainHash []byte `protobuf:"bytes,12,opt,name=mainHash,proto3" json:"mainHash,omitempty"`
MainHeight int64 `protobuf:"varint,13,opt,name=mainHeight,proto3" json:"mainHeight,omitempty"`
Signature *Signature `protobuf:"bytes,8,opt,name=signature,proto3" json:"signature,omitempty"`
Txs []*Transaction `protobuf:"bytes,7,rep,name=txs,proto3" json:"txs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
......@@ -232,6 +235,20 @@ func (m *Block) GetDifficulty() uint32 {
return 0
}
func (m *Block) GetMainHash() []byte {
if m != nil {
return m.MainHash
}
return nil
}
func (m *Block) GetMainHeight() int64 {
if m != nil {
return m.MainHeight
}
return 0
}
func (m *Block) GetSignature() *Signature {
if m != nil {
return m.Signature
......@@ -1540,74 +1557,76 @@ func init() {
func init() { proto.RegisterFile("blockchain.proto", fileDescriptor_e9ac6287ce250c9a) }
var fileDescriptor_e9ac6287ce250c9a = []byte{
// 1097 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x5f, 0x6f, 0xe3, 0x44,
0x10, 0x97, 0xf3, 0xaf, 0xc9, 0x24, 0x0d, 0xbd, 0x55, 0x40, 0x51, 0x05, 0x5c, 0x6e, 0x39, 0x1d,
0x51, 0x39, 0xa5, 0x52, 0x8b, 0x8e, 0x7b, 0x00, 0x09, 0x9a, 0x22, 0xb5, 0xd7, 0xe3, 0x28, 0xdb,
0x5e, 0x1f, 0x78, 0xdb, 0xda, 0xdb, 0xda, 0x6a, 0xfc, 0xa7, 0xde, 0x75, 0x88, 0xf9, 0x0e, 0x7c,
0x0a, 0xde, 0x10, 0x1f, 0x12, 0xed, 0xec, 0x3a, 0xb6, 0x43, 0x8b, 0x84, 0xc4, 0x0b, 0x6f, 0x3b,
0xff, 0x67, 0x7e, 0xe3, 0x99, 0x31, 0xec, 0x5c, 0x2f, 0x62, 0xf7, 0xce, 0xf5, 0x79, 0x10, 0xcd,
0x92, 0x34, 0x56, 0x31, 0x69, 0xab, 0x3c, 0x11, 0x72, 0xf7, 0x89, 0x4a, 0x79, 0x24, 0xb9, 0xab,
0x82, 0xd8, 0x4a, 0x76, 0x07, 0x6e, 0x1c, 0x86, 0x05, 0x45, 0xff, 0x6c, 0x40, 0xe7, 0x44, 0x70,
0x4f, 0xa4, 0x64, 0x0c, 0x5b, 0x4b, 0x91, 0xca, 0x20, 0x8e, 0xc6, 0xce, 0xc4, 0x99, 0x36, 0x59,
0x41, 0x92, 0x4f, 0x01, 0x12, 0x9e, 0x8a, 0x48, 0x9d, 0x70, 0xe9, 0x8f, 0x1b, 0x13, 0x67, 0x3a,
0x60, 0x15, 0x0e, 0xf9, 0x08, 0x3a, 0x6a, 0x85, 0xb2, 0x26, 0xca, 0x2c, 0x45, 0x3e, 0x86, 0x9e,
0x54, 0x5c, 0x09, 0x14, 0xb5, 0x50, 0x54, 0x32, 0xb4, 0x95, 0x2f, 0x82, 0x5b, 0x5f, 0x8d, 0xdb,
0x18, 0xce, 0x52, 0xda, 0x0a, 0xcb, 0xb9, 0x0c, 0x42, 0x31, 0xee, 0xa0, 0xa8, 0x64, 0xe8, 0x2c,
0xd5, 0x6a, 0x1e, 0x67, 0x91, 0x1a, 0xf7, 0x4c, 0x96, 0x96, 0x24, 0x04, 0x5a, 0xbe, 0x0e, 0x04,
0x18, 0x08, 0xdf, 0x3a, 0x73, 0x2f, 0xb8, 0xb9, 0x09, 0xdc, 0x6c, 0xa1, 0xf2, 0x71, 0x7f, 0xe2,
0x4c, 0xb7, 0x59, 0x85, 0x43, 0x66, 0xd0, 0x93, 0xc1, 0x6d, 0xc4, 0x55, 0x96, 0x8a, 0x71, 0x77,
0xe2, 0x4c, 0xfb, 0x07, 0x3b, 0x33, 0x84, 0x6e, 0x76, 0x51, 0xf0, 0x59, 0xa9, 0x42, 0x7f, 0x6f,
0x40, 0xfb, 0x48, 0xe7, 0xf2, 0x3f, 0x41, 0xeb, 0x3f, 0xae, 0x9f, 0x3c, 0x87, 0xa6, 0x5a, 0xc9,
0xf1, 0xd6, 0xa4, 0x39, 0xed, 0x1f, 0x10, 0xab, 0x79, 0x59, 0x7e, 0x63, 0x4c, 0x8b, 0xe9, 0x4b,
0xe8, 0x20, 0x48, 0x92, 0x50, 0x68, 0x07, 0x4a, 0x84, 0x72, 0xec, 0xa0, 0xc5, 0xc0, 0x5a, 0xa0,
0x94, 0x19, 0x11, 0x7d, 0x03, 0x80, 0xf4, 0x85, 0xb8, 0x9f, 0x1f, 0xe9, 0x2e, 0x46, 0x3c, 0x14,
0x08, 0x6a, 0x8f, 0xe1, 0x9b, 0xec, 0x40, 0xf3, 0x3d, 0x7b, 0x8b, 0x50, 0xf6, 0x98, 0x7e, 0x6a,
0x34, 0x44, 0xe4, 0xc6, 0x9e, 0x40, 0x0c, 0x7b, 0xcc, 0x52, 0xf4, 0x15, 0xf4, 0x4b, 0x5f, 0x92,
0x7c, 0x5e, 0x0f, 0xff, 0xa4, 0x1a, 0x1e, 0x55, 0x8a, 0x1c, 0x12, 0xe8, 0x16, 0x4c, 0x1d, 0x2d,
0xca, 0x42, 0xdb, 0x55, 0xfd, 0x24, 0x2f, 0xa0, 0x29, 0xc5, 0x3d, 0xc6, 0xef, 0x1f, 0x8c, 0x36,
0x9c, 0x64, 0x22, 0x72, 0x05, 0xd3, 0x0a, 0x64, 0x0f, 0x3a, 0x9e, 0x50, 0x3c, 0x58, 0x60, 0x56,
0x25, 0x40, 0xa8, 0x7a, 0x8c, 0x12, 0x66, 0x35, 0xe8, 0xb7, 0x36, 0xe2, 0x79, 0xe0, 0xe9, 0x88,
0x49, 0xe0, 0xd9, 0x92, 0xf5, 0x53, 0xe3, 0x86, 0x4d, 0xb4, 0x31, 0x37, 0x70, 0x43, 0x11, 0x7d,
0x0d, 0x83, 0x8a, 0x63, 0x49, 0xa6, 0xf5, 0x62, 0x1f, 0x0a, 0x6e, 0xab, 0x9d, 0xc1, 0x96, 0x99,
0x79, 0x49, 0x3e, 0xab, 0x1b, 0x6d, 0x5b, 0x23, 0x23, 0x2e, 0xf4, 0x4f, 0x00, 0xac, 0xfe, 0xc3,
0xd9, 0x4e, 0x61, 0xcb, 0x37, 0x72, 0x9b, 0xef, 0xb0, 0xe6, 0x46, 0xb2, 0x42, 0x4c, 0x7d, 0xd8,
0xc6, 0x7c, 0x7e, 0x5c, 0x8a, 0x74, 0x19, 0x88, 0x5f, 0xc8, 0x33, 0x68, 0x69, 0x19, 0x7a, 0xfb,
0x5b, 0x78, 0x14, 0x55, 0x27, 0xbe, 0x51, 0x9f, 0xf8, 0x5d, 0xe8, 0x9a, 0xd9, 0x11, 0x72, 0xdc,
0x9c, 0x34, 0xa7, 0x03, 0xb6, 0xa6, 0xe9, 0x1f, 0x8e, 0xfd, 0x14, 0x4c, 0xe9, 0x25, 0xa2, 0xce,
0xa3, 0x88, 0x92, 0x19, 0x74, 0x53, 0xe1, 0x8a, 0x20, 0x51, 0xba, 0x90, 0x2a, 0x88, 0xcc, 0xb0,
0x8f, 0xb9, 0xe2, 0x6c, 0xad, 0x43, 0x9e, 0x42, 0xe3, 0xec, 0x0a, 0x23, 0xf7, 0x0f, 0x3e, 0xb0,
0x9a, 0x67, 0x22, 0xbf, 0xe2, 0x8b, 0x4c, 0xb0, 0xc6, 0xd9, 0x15, 0x79, 0x01, 0xc3, 0x24, 0x15,
0xcb, 0x0b, 0xc5, 0x55, 0x26, 0x2b, 0x73, 0xbd, 0xc1, 0xa5, 0xaf, 0xa0, 0xcb, 0x0a, 0xa7, 0x7b,
0x95, 0x24, 0x4c, 0x53, 0x86, 0xf5, 0x24, 0xca, 0x04, 0xe8, 0x1b, 0xe8, 0x9d, 0xa7, 0xc1, 0x92,
0xbb, 0xf9, 0xd9, 0x15, 0xf9, 0x46, 0x07, 0xb3, 0xc4, 0x65, 0x7c, 0x27, 0x22, 0x6b, 0xfe, 0xa1,
0x35, 0x3f, 0xaf, 0x09, 0xd9, 0x86, 0x32, 0xcd, 0x61, 0x58, 0xd7, 0x20, 0x23, 0x68, 0x2b, 0xeb,
0x47, 0xb7, 0xda, 0x10, 0xa6, 0x1d, 0xa7, 0x91, 0x27, 0x56, 0xd8, 0x8e, 0x36, 0x2b, 0x48, 0xb3,
0xd8, 0xfc, 0xda, 0x62, 0xc3, 0x25, 0x6c, 0x60, 0x6a, 0x3d, 0x0a, 0x13, 0x95, 0x30, 0x2a, 0xca,
0xff, 0x2e, 0xf2, 0xca, 0x8a, 0xbe, 0xa8, 0x41, 0xe1, 0x54, 0xcc, 0x0b, 0xf5, 0x4a, 0x33, 0x66,
0xd0, 0x5b, 0x57, 0x64, 0x3f, 0xc3, 0x9d, 0xcd, 0xca, 0x59, 0xa9, 0x42, 0xa7, 0x40, 0xac, 0x97,
0xb9, 0x2f, 0xdc, 0xbb, 0xcb, 0xd5, 0xdb, 0x40, 0xe2, 0x11, 0x11, 0x69, 0x6a, 0x90, 0xef, 0x31,
0x7c, 0xd3, 0x1c, 0xfa, 0x73, 0x7d, 0x5a, 0x4d, 0xc3, 0xc8, 0x73, 0xd8, 0x76, 0xb3, 0x14, 0xd7,
0xb9, 0x59, 0xc8, 0x66, 0x53, 0xd4, 0x99, 0x64, 0x02, 0xfd, 0x50, 0x84, 0x49, 0x1c, 0x2f, 0x2e,
0x82, 0x5f, 0x85, 0xfd, 0x72, 0xab, 0x2c, 0x42, 0x61, 0x10, 0xca, 0xdb, 0x9f, 0x32, 0x91, 0x09,
0x54, 0x69, 0xa2, 0x4a, 0x8d, 0x47, 0x39, 0xf4, 0x98, 0xb8, 0xb7, 0xcb, 0x74, 0x04, 0x6d, 0xa9,
0x78, 0x5a, 0x04, 0x34, 0x84, 0x1e, 0x47, 0x11, 0x79, 0x36, 0x80, 0x7e, 0xea, 0xb1, 0x08, 0xe4,
0x71, 0xb9, 0x88, 0xba, 0x6c, 0x4d, 0x17, 0xc3, 0xdb, 0xc2, 0xf2, 0xf4, 0x93, 0x3e, 0x83, 0xfe,
0x0f, 0x95, 0xac, 0x08, 0xb4, 0xa4, 0xce, 0xc6, 0xc4, 0xc0, 0x37, 0xdd, 0x83, 0x1d, 0x26, 0x92,
0x45, 0x8e, 0x79, 0xd8, 0xfa, 0xca, 0x7b, 0xe4, 0x54, 0xef, 0x91, 0xce, 0x18, 0xd5, 0x8e, 0x62,
0x2f, 0x2f, 0xce, 0x85, 0xf3, 0x8f, 0xe7, 0xe2, 0xdf, 0x8e, 0x1d, 0x7d, 0x09, 0x70, 0x2a, 0xe7,
0x3c, 0xbb, 0xf5, 0xd5, 0xfb, 0x44, 0x9f, 0xb8, 0x53, 0xe9, 0x22, 0x95, 0x25, 0x98, 0x4c, 0x97,
0x55, 0x38, 0xf4, 0x35, 0x0c, 0x4f, 0xe5, 0x3b, 0x95, 0xcc, 0x71, 0x5f, 0xe7, 0x91, 0xab, 0xa7,
0x32, 0x90, 0x91, 0x4a, 0x5c, 0x84, 0x35, 0x8f, 0x5c, 0x6b, 0xb5, 0xc1, 0xa5, 0xbf, 0x39, 0xb0,
0x8d, 0x8d, 0xff, 0x7e, 0x25, 0xdc, 0x4c, 0xc5, 0xa9, 0x2e, 0xda, 0x4b, 0x83, 0xa5, 0x48, 0xed,
0x48, 0x58, 0x4a, 0x23, 0x7e, 0x93, 0x45, 0xee, 0x3b, 0x7d, 0xb8, 0xcc, 0x95, 0x5a, 0xd3, 0xf5,
0xb3, 0xde, 0xdc, 0x3c, 0xeb, 0x23, 0x68, 0x27, 0x3c, 0xe5, 0xa1, 0x5d, 0x0c, 0x86, 0xd0, 0x5c,
0xb1, 0x52, 0x29, 0xc7, 0x5b, 0x3f, 0x60, 0x86, 0xa0, 0x5f, 0xd9, 0xe5, 0x59, 0x1c, 0x1d, 0xdd,
0x2b, 0xf4, 0xea, 0x98, 0x3f, 0x1e, 0x74, 0x48, 0xa0, 0x75, 0x99, 0x27, 0xc5, 0x07, 0x87, 0x6f,
0xfa, 0x35, 0x0c, 0x6b, 0x86, 0x7a, 0xc9, 0xd4, 0xd6, 0xfe, 0xc3, 0x37, 0xcd, 0x6e, 0x7f, 0x1f,
0x46, 0xe7, 0x3c, 0xe5, 0x88, 0x44, 0x75, 0xa3, 0x7e, 0x09, 0x7d, 0x5c, 0x9b, 0xf6, 0xe4, 0x39,
0x8f, 0x9e, 0xbc, 0xaa, 0x9a, 0x86, 0x4a, 0xda, 0x00, 0x36, 0xc7, 0x35, 0x7d, 0xf4, 0xf4, 0xe7,
0x4f, 0x6e, 0x03, 0xe5, 0x67, 0xd7, 0x33, 0x37, 0x0e, 0xf7, 0x0f, 0x0f, 0xdd, 0x68, 0x1f, 0xff,
0x69, 0x0f, 0x0f, 0xf7, 0xd1, 0xeb, 0x75, 0x07, 0x7f, 0x5a, 0x0f, 0xff, 0x0a, 0x00, 0x00, 0xff,
0xff, 0x23, 0x1c, 0x7b, 0x8c, 0xf0, 0x0a, 0x00, 0x00,
// 1122 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0xdb, 0x6e, 0x1b, 0x37,
0x13, 0xc6, 0xea, 0x64, 0x69, 0x74, 0xf8, 0x1d, 0x42, 0x7f, 0x21, 0x18, 0x6d, 0xa3, 0xb0, 0x41,
0x2a, 0xa4, 0x81, 0x02, 0xd8, 0x45, 0x9a, 0x8b, 0x16, 0x68, 0x2d, 0x17, 0xb0, 0xe3, 0x34, 0x75,
0x69, 0xc7, 0x17, 0xbd, 0xa3, 0x57, 0xb4, 0x97, 0xb0, 0xf6, 0xe0, 0x25, 0x57, 0x95, 0xfa, 0x0e,
0x7d, 0x91, 0xa2, 0xef, 0xd4, 0x57, 0x29, 0x38, 0xe4, 0x6a, 0x77, 0x55, 0xbb, 0x45, 0x2e, 0x7b,
0x37, 0xe7, 0x6f, 0x66, 0x48, 0xce, 0x10, 0x76, 0xaf, 0x16, 0xb1, 0x7f, 0xeb, 0x07, 0x5c, 0x46,
0xd3, 0x24, 0x8d, 0x75, 0x4c, 0x9a, 0x7a, 0x9d, 0x08, 0xb5, 0xf7, 0x48, 0xa7, 0x3c, 0x52, 0xdc,
0xd7, 0x32, 0x76, 0x9a, 0xbd, 0x9e, 0x1f, 0x87, 0x61, 0xce, 0xd1, 0x3f, 0x6a, 0xd0, 0x3a, 0x16,
0x7c, 0x2e, 0x52, 0x32, 0x82, 0x9d, 0xa5, 0x48, 0x95, 0x8c, 0xa3, 0x91, 0x37, 0xf6, 0x26, 0x75,
0x96, 0xb3, 0xe4, 0x53, 0x80, 0x84, 0xa7, 0x22, 0xd2, 0xc7, 0x5c, 0x05, 0xa3, 0xda, 0xd8, 0x9b,
0xf4, 0x58, 0x49, 0x42, 0x3e, 0x82, 0x96, 0x5e, 0xa1, 0xae, 0x8e, 0x3a, 0xc7, 0x91, 0x8f, 0xa1,
0xa3, 0x34, 0xd7, 0x02, 0x55, 0x0d, 0x54, 0x15, 0x02, 0xe3, 0x15, 0x08, 0x79, 0x13, 0xe8, 0x51,
0x13, 0xe1, 0x1c, 0x67, 0xbc, 0xb0, 0x9c, 0x0b, 0x19, 0x8a, 0x51, 0x0b, 0x55, 0x85, 0xc0, 0x64,
0xa9, 0x57, 0xb3, 0x38, 0x8b, 0xf4, 0xa8, 0x63, 0xb3, 0x74, 0x2c, 0x21, 0xd0, 0x08, 0x0c, 0x10,
0x20, 0x10, 0xd2, 0x26, 0xf3, 0xb9, 0xbc, 0xbe, 0x96, 0x7e, 0xb6, 0xd0, 0xeb, 0x51, 0x77, 0xec,
0x4d, 0xfa, 0xac, 0x24, 0x21, 0x53, 0xe8, 0x28, 0x79, 0x13, 0x71, 0x9d, 0xa5, 0x62, 0xd4, 0x1e,
0x7b, 0x93, 0xee, 0xfe, 0xee, 0x14, 0x5b, 0x37, 0x3d, 0xcf, 0xe5, 0xac, 0x30, 0xa1, 0x7f, 0xd6,
0xa0, 0x79, 0x68, 0x72, 0xf9, 0x8f, 0x74, 0xeb, 0xdf, 0xea, 0xdf, 0x83, 0x76, 0xc8, 0x65, 0x84,
0x90, 0x3d, 0x84, 0xdc, 0xf0, 0xc6, 0x17, 0x69, 0x8b, 0xda, 0xc7, 0xd0, 0x25, 0xc9, 0x87, 0xf6,
0x8e, 0x3c, 0x85, 0xba, 0x5e, 0xa9, 0xd1, 0xce, 0xb8, 0x3e, 0xe9, 0xee, 0x13, 0x67, 0x79, 0x51,
0xdc, 0x4f, 0x66, 0xd4, 0xf4, 0x05, 0xb4, 0xb0, 0xc1, 0x8a, 0x50, 0x68, 0x4a, 0x2d, 0x42, 0x35,
0xf2, 0xd0, 0xa3, 0xe7, 0x3c, 0x50, 0xcb, 0xac, 0x8a, 0xbe, 0x01, 0x40, 0xfe, 0x5c, 0xdc, 0xcd,
0x0e, 0xcd, 0x0d, 0x88, 0x78, 0x28, 0xf0, 0x40, 0x3a, 0x0c, 0x69, 0xb2, 0x0b, 0xf5, 0xf7, 0xec,
0x2d, 0x1e, 0x43, 0x87, 0x19, 0xd2, 0x74, 0x52, 0x44, 0x7e, 0x3c, 0x17, 0xd8, 0xff, 0x0e, 0x73,
0x1c, 0x7d, 0x05, 0xdd, 0x22, 0x96, 0x22, 0x9f, 0x57, 0xe1, 0x1f, 0x95, 0xe1, 0xd1, 0x24, 0xcf,
0x21, 0x81, 0x76, 0x2e, 0x34, 0x68, 0x51, 0x16, 0xba, 0x1b, 0x61, 0x48, 0xf2, 0x0c, 0xea, 0x4a,
0xdc, 0x21, 0x7e, 0x77, 0x7f, 0xb8, 0x15, 0x24, 0x13, 0x91, 0x2f, 0x98, 0x31, 0x20, 0xcf, 0xa1,
0x35, 0x17, 0x9a, 0xcb, 0x05, 0x66, 0x55, 0x34, 0x08, 0x4d, 0x8f, 0x50, 0xc3, 0x9c, 0x05, 0xfd,
0xd6, 0x21, 0x9e, 0xc9, 0xb9, 0x41, 0x4c, 0xe4, 0xdc, 0x95, 0x6c, 0x48, 0xd3, 0x37, 0xbc, 0x00,
0x0e, 0x73, 0xab, 0x6f, 0xa8, 0xa2, 0xaf, 0xa1, 0x57, 0x0a, 0xac, 0xc8, 0xa4, 0x5a, 0xec, 0x7d,
0xe0, 0xae, 0xda, 0x29, 0xec, 0xd8, 0x79, 0xa1, 0xc8, 0x67, 0x55, 0xa7, 0xbe, 0x73, 0xb2, 0xea,
0xdc, 0xfe, 0x18, 0xc0, 0xd9, 0xdf, 0x9f, 0xed, 0x04, 0x76, 0x02, 0xab, 0x77, 0xf9, 0x0e, 0x2a,
0x61, 0x14, 0xcb, 0xd5, 0x34, 0x80, 0x3e, 0xe6, 0xf3, 0xe3, 0x52, 0xa4, 0x4b, 0x29, 0x7e, 0x21,
0x4f, 0xa0, 0x61, 0x74, 0x18, 0xed, 0x6f, 0xf0, 0xa8, 0x2a, 0x4f, 0x8b, 0x5a, 0x75, 0x5a, 0xec,
0x41, 0xdb, 0xbe, 0x3b, 0xa1, 0x46, 0xf5, 0x71, 0xdd, 0xdc, 0xfc, 0x9c, 0xa7, 0xbf, 0x7b, 0xee,
0x2a, 0xd8, 0xd2, 0x8b, 0x8e, 0x7a, 0x0f, 0x76, 0x94, 0x4c, 0xa1, 0x9d, 0x0a, 0x5f, 0xc8, 0x44,
0x9b, 0x42, 0xca, 0x4d, 0x64, 0x56, 0x7c, 0xc4, 0x35, 0x67, 0x1b, 0x1b, 0xf2, 0x18, 0x6a, 0xa7,
0x97, 0x88, 0xdc, 0xdd, 0xff, 0x9f, 0xb3, 0x3c, 0x15, 0xeb, 0x4b, 0xbe, 0xc8, 0x04, 0xab, 0x9d,
0x5e, 0x92, 0x67, 0x30, 0x48, 0x52, 0xb1, 0x3c, 0xd7, 0x5c, 0x67, 0xaa, 0x34, 0x13, 0xb6, 0xa4,
0xf4, 0x15, 0xb4, 0x59, 0x1e, 0xf4, 0x79, 0x29, 0x09, 0x7b, 0x28, 0x83, 0x6a, 0x12, 0x45, 0x02,
0xf4, 0x0d, 0x74, 0xce, 0x52, 0xb9, 0xe4, 0xfe, 0xfa, 0xf4, 0x92, 0x7c, 0x63, 0xc0, 0x1c, 0x73,
0x11, 0xdf, 0x8a, 0xc8, 0xb9, 0xff, 0xdf, 0xb9, 0x9f, 0x55, 0x94, 0x6c, 0xcb, 0x98, 0xae, 0x61,
0x50, 0xb5, 0x20, 0x43, 0x68, 0x6a, 0x17, 0xc7, 0x1c, 0xb5, 0x65, 0xec, 0x71, 0x9c, 0x44, 0x73,
0xb1, 0xc2, 0xe3, 0x68, 0xb2, 0x9c, 0xb5, 0x43, 0x31, 0xa8, 0x0c, 0x45, 0x1c, 0xe0, 0xb6, 0x4d,
0x8d, 0x07, 0xdb, 0x44, 0x15, 0x0c, 0xf3, 0xf2, 0xbf, 0x8b, 0xe6, 0x45, 0x45, 0x5f, 0x54, 0x5a,
0xe1, 0x95, 0xdc, 0x73, 0xf3, 0xd2, 0x61, 0x4c, 0xa1, 0xb3, 0xa9, 0xc8, 0x5d, 0xc3, 0xdd, 0xed,
0xca, 0x59, 0x61, 0x42, 0x27, 0x40, 0x5c, 0x94, 0x59, 0x20, 0xfc, 0xdb, 0x8b, 0xd5, 0x5b, 0xa9,
0x70, 0x01, 0x89, 0x34, 0xb5, 0x9d, 0xef, 0x30, 0xa4, 0xe9, 0x1a, 0xba, 0x33, 0xb3, 0x96, 0xed,
0x81, 0x91, 0xa7, 0xd0, 0xf7, 0xb3, 0x14, 0x57, 0x81, 0x1d, 0xab, 0x76, 0x52, 0x54, 0x85, 0x64,
0x0c, 0xdd, 0x50, 0x84, 0x49, 0x1c, 0x2f, 0xce, 0xe5, 0xaf, 0xc2, 0xdd, 0xdc, 0xb2, 0x88, 0x50,
0xe8, 0x85, 0xea, 0xe6, 0xa7, 0x4c, 0x64, 0x02, 0x4d, 0xea, 0x68, 0x52, 0x91, 0x51, 0x0e, 0x1d,
0x26, 0xee, 0xdc, 0x30, 0x1d, 0x42, 0x53, 0x69, 0x9e, 0xe6, 0x80, 0x96, 0x31, 0xcf, 0x51, 0x44,
0x73, 0x07, 0x60, 0x48, 0xf3, 0x2c, 0xa4, 0x3a, 0x2a, 0x06, 0x51, 0x9b, 0x6d, 0xf8, 0xfc, 0xf1,
0x36, 0xb0, 0x3c, 0x43, 0xd2, 0x27, 0xd0, 0xfd, 0xa1, 0x94, 0x15, 0x81, 0x86, 0x32, 0xd9, 0x58,
0x0c, 0xa4, 0xe9, 0x73, 0xd8, 0x65, 0x22, 0x59, 0xac, 0x31, 0x0f, 0x57, 0x5f, 0xb1, 0xcb, 0xbc,
0xf2, 0x2e, 0x33, 0x19, 0xa3, 0xd9, 0x61, 0x3c, 0x5f, 0xe7, 0xeb, 0xc2, 0xfb, 0xc7, 0x75, 0xf1,
0xa1, 0xcf, 0x8e, 0xbe, 0x00, 0x38, 0x51, 0x33, 0x9e, 0xdd, 0x04, 0xfa, 0x7d, 0x62, 0x56, 0xdc,
0x89, 0xf2, 0x91, 0xcb, 0x12, 0x4c, 0xa6, 0xcd, 0x4a, 0x12, 0xfa, 0x1a, 0x06, 0x27, 0xea, 0x9d,
0x4e, 0x66, 0x38, 0xaf, 0xd7, 0x91, 0x6f, 0x5e, 0xa5, 0x54, 0x91, 0x4e, 0x7c, 0x6c, 0xeb, 0x3a,
0xf2, 0x9d, 0xd7, 0x96, 0x94, 0xfe, 0xe6, 0x41, 0x1f, 0x0f, 0xfe, 0xfb, 0x95, 0xf0, 0x33, 0x1d,
0xa7, 0xa6, 0xe8, 0x79, 0x2a, 0x97, 0x22, 0x75, 0x4f, 0xc2, 0x71, 0xa6, 0xe3, 0xd7, 0x59, 0xe4,
0xbf, 0x33, 0x8b, 0xcb, 0x6e, 0xa9, 0x0d, 0x5f, 0xfd, 0x12, 0xd4, 0xb7, 0xbf, 0x04, 0x43, 0x68,
0x26, 0x3c, 0xe5, 0xa1, 0x1b, 0x0c, 0x96, 0x31, 0x52, 0xb1, 0xd2, 0x29, 0xc7, 0x7f, 0x42, 0x8f,
0x59, 0x86, 0x7e, 0xe5, 0x86, 0x67, 0xbe, 0x74, 0xcc, 0x59, 0x61, 0x54, 0xcf, 0xfe, 0x96, 0x30,
0x20, 0x81, 0xc6, 0xc5, 0x3a, 0xc9, 0x2f, 0x1c, 0xd2, 0xf4, 0x6b, 0x18, 0x54, 0x1c, 0xcd, 0x90,
0xa9, 0x8c, 0xfd, 0xfb, 0x77, 0x9a, 0x9b, 0xfe, 0x01, 0x0c, 0xcf, 0x78, 0xca, 0xb1, 0x13, 0xe5,
0x89, 0xfa, 0x25, 0x74, 0x71, 0x6c, 0xba, 0x95, 0xe7, 0x3d, 0xb8, 0xf2, 0xca, 0x66, 0xa6, 0x55,
0xca, 0x01, 0xb8, 0x1c, 0x37, 0xfc, 0xe1, 0xe3, 0x9f, 0x3f, 0xb9, 0x91, 0x3a, 0xc8, 0xae, 0xa6,
0x7e, 0x1c, 0xbe, 0x3c, 0x38, 0xf0, 0xa3, 0x97, 0xf8, 0x1f, 0x3e, 0x38, 0x78, 0x89, 0x51, 0xaf,
0x5a, 0xf8, 0xe1, 0x3d, 0xf8, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x40, 0xe2, 0x2e, 0x78, 0x2c, 0x0b,
0x00, 0x00,
}
......@@ -65,19 +65,12 @@ type Mempool struct {
// Consensus 配置
type Consensus struct {
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
GenesisBlockTime int64 `protobuf:"varint,2,opt,name=genesisBlockTime" json:"genesisBlockTime,omitempty"`
Minerstart bool `protobuf:"varint,3,opt,name=minerstart" json:"minerstart,omitempty"`
Genesis string `protobuf:"bytes,4,opt,name=genesis" json:"genesis,omitempty"`
HotkeyAddr string `protobuf:"bytes,5,opt,name=hotkeyAddr" json:"hotkeyAddr,omitempty"`
ForceMining bool `protobuf:"varint,6,opt,name=forceMining" json:"forceMining,omitempty"`
WriteBlockSeconds int64 `protobuf:"varint,20,opt,name=writeBlockSeconds" json:"writeBlockSeconds,omitempty"`
ParaRemoteGrpcClient string `protobuf:"bytes,22,opt,name=paraRemoteGrpcClient" json:"paraRemoteGrpcClient,omitempty"`
StartHeight int64 `protobuf:"varint,23,opt,name=startHeight" json:"startHeight,omitempty"`
EmptyBlockInterval int64 `protobuf:"varint,24,opt,name=emptyBlockInterval" json:"emptyBlockInterval,omitempty"`
AuthAccount string `protobuf:"bytes,25,opt,name=authAccount" json:"authAccount,omitempty"`
WaitBlocks4CommitMsg int32 `protobuf:"varint,26,opt,name=waitBlocks4CommitMsg" json:"waitBlocks4CommitMsg,omitempty"`
SearchHashMatchedBlockDepth int32 `protobuf:"varint,27,opt,name=searchHashMatchedBlockDepth" json:"searchHashMatchedBlockDepth,omitempty"`
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
GenesisBlockTime int64 `protobuf:"varint,2,opt,name=genesisBlockTime" json:"genesisBlockTime,omitempty"`
Minerstart bool `protobuf:"varint,3,opt,name=minerstart" json:"minerstart,omitempty"`
Genesis string `protobuf:"bytes,4,opt,name=genesis" json:"genesis,omitempty"`
HotkeyAddr string `protobuf:"bytes,5,opt,name=hotkeyAddr" json:"hotkeyAddr,omitempty"`
ForceMining bool `protobuf:"varint,6,opt,name=forceMining" json:"forceMining,omitempty"`
}
// Wallet 配置
......
......@@ -217,8 +217,10 @@ func S(key string, value interface{}) {
mu.Lock()
defer mu.Unlock()
if strings.HasPrefix(key, "config.") {
if isLocal() {
if !isLocal() { //only local can modify for test
panic("prefix config. is readonly")
} else {
tlog.Error("modify " + key + " is only for test")
}
return
}
......@@ -559,6 +561,17 @@ func parseSubModule(cfg *subModule) (*ConfigSubModule, error) {
return &subcfg, nil
}
//ModifySubConfig json data modify
func ModifySubConfig(sub []byte, key string, value interface{}) ([]byte, error) {
var data map[string]interface{}
err := json.Unmarshal(sub, &data)
if err != nil {
return nil, err
}
data[key] = value
return json.Marshal(data)
}
func parseItem(data map[string]interface{}) map[string][]byte {
subconfig := make(map[string][]byte)
if len(data) == 0 {
......
......@@ -27,7 +27,6 @@ var (
ErrReRunGenesis = errors.New("ErrReRunGenesis")
ErrActionNotSupport = errors.New("ErrActionNotSupport")
ErrQueryNotSupport = errors.New("ErrQueryNotSupport")
ErrChannelFull = errors.New("ErrChannelFull")
ErrAmount = errors.New("ErrAmount")
ErrMinerIsStared = errors.New("ErrMinerIsStared")
ErrMinerNotStared = errors.New("ErrMinerNotStared")
......@@ -57,11 +56,11 @@ var (
ErrToAddrNotSameToExecAddr = errors.New("ErrToAddrNotSameToExecAddr")
ErrTypeAsset = errors.New("ErrTypeAsset")
ErrEmpty = errors.New("ErrEmpty")
ErrIsClosed = errors.New("ErrIsClosed")
ErrSendSameToRecv = errors.New("ErrSendSameToRecv")
ErrExecNameNotAllow = errors.New("ErrExecNameNotAllow")
ErrExecNotFound = errors.New("ErrExecNotFound")
ErrLocalDBPerfix = errors.New("ErrLocalDBPerfix")
ErrTimeout = errors.New("ErrTimeout")
ErrBlockHeaderDifficulty = errors.New("ErrBlockHeaderDifficulty")
ErrNoTx = errors.New("ErrNoTx")
ErrTxExist = errors.New("ErrTxExist")
......@@ -99,7 +98,6 @@ var (
ErrBlockHeightNoMatch = errors.New("ErrBlockHeightNoEqual")
ErrParentTdNoExist = errors.New("ErrParentTdNoExist")
ErrBlockHashNoMatch = errors.New("ErrBlockHashNoMatch")
ErrIsClosed = errors.New("ErrIsClosed")
ErrDecode = errors.New("ErrDecode")
ErrNotRollBack = errors.New("ErrNotRollBack")
ErrPeerInfoIsNil = errors.New("ErrPeerInfoIsNil")
......
......@@ -62,11 +62,14 @@ func (m *Genesis) GetIsrun() bool {
type ExecTxList struct {
StateHash []byte `protobuf:"bytes,1,opt,name=stateHash,proto3" json:"stateHash,omitempty"`
Txs []*Transaction `protobuf:"bytes,2,rep,name=txs,proto3" json:"txs,omitempty"`
ParentHash []byte `protobuf:"bytes,7,opt,name=parentHash,proto3" json:"parentHash,omitempty"`
MainHash []byte `protobuf:"bytes,8,opt,name=mainHash,proto3" json:"mainHash,omitempty"`
MainHeight int64 `protobuf:"varint,9,opt,name=mainHeight,proto3" json:"mainHeight,omitempty"`
BlockTime int64 `protobuf:"varint,3,opt,name=blockTime,proto3" json:"blockTime,omitempty"`
Height int64 `protobuf:"varint,4,opt,name=height,proto3" json:"height,omitempty"`
Difficulty uint64 `protobuf:"varint,5,opt,name=difficulty,proto3" json:"difficulty,omitempty"`
IsMempool bool `protobuf:"varint,6,opt,name=isMempool,proto3" json:"isMempool,omitempty"`
Txs []*Transaction `protobuf:"bytes,2,rep,name=txs,proto3" json:"txs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -104,13 +107,27 @@ func (m *ExecTxList) GetStateHash() []byte {
return nil
}
func (m *ExecTxList) GetTxs() []*Transaction {
func (m *ExecTxList) GetParentHash() []byte {
if m != nil {
return m.Txs
return m.ParentHash
}
return nil
}
func (m *ExecTxList) GetMainHash() []byte {
if m != nil {
return m.MainHash
}
return nil
}
func (m *ExecTxList) GetMainHeight() int64 {
if m != nil {
return m.MainHeight
}
return 0
}
func (m *ExecTxList) GetBlockTime() int64 {
if m != nil {
return m.BlockTime
......@@ -139,6 +156,13 @@ func (m *ExecTxList) GetIsMempool() bool {
return false
}
func (m *ExecTxList) GetTxs() []*Transaction {
if m != nil {
return m.Txs
}
return nil
}
type Query struct {
Execer []byte `protobuf:"bytes,1,opt,name=execer,proto3" json:"execer,omitempty"`
FuncName string `protobuf:"bytes,2,opt,name=funcName,proto3" json:"funcName,omitempty"`
......@@ -816,45 +840,47 @@ func init() {
func init() { proto.RegisterFile("executor.proto", fileDescriptor_12d1cdcda51e000f) }
var fileDescriptor_12d1cdcda51e000f = []byte{
// 633 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x61, 0x6b, 0xdb, 0x48,
0x10, 0x3d, 0x59, 0x76, 0x1c, 0x8f, 0x7d, 0x21, 0xd9, 0x3b, 0x0e, 0x11, 0xae, 0x89, 0x51, 0xd2,
0xd4, 0xd0, 0xe2, 0x80, 0x4d, 0x7f, 0x40, 0x63, 0x4a, 0x1d, 0x68, 0x0a, 0x55, 0xdc, 0x2f, 0xf9,
0x50, 0xd8, 0xac, 0xc7, 0xf6, 0x12, 0x7b, 0x57, 0xec, 0x8e, 0x82, 0xf5, 0xf7, 0x4a, 0x7f, 0x58,
0xd9, 0xb5, 0x6c, 0x89, 0x26, 0x2d, 0xf4, 0x9b, 0xe6, 0xcd, 0xe3, 0xcd, 0xbc, 0x19, 0xcd, 0xc2,
0x01, 0xae, 0x51, 0x64, 0xa4, 0x4d, 0x3f, 0x35, 0x9a, 0x34, 0x6b, 0x50, 0x9e, 0xa2, 0x3d, 0x3e,
0x22, 0xc3, 0x95, 0xe5, 0x82, 0xa4, 0x56, 0x9b, 0x4c, 0x7c, 0x0a, 0xcd, 0x0f, 0xa8, 0xd0, 0x4a,
0xcb, 0xfe, 0x85, 0x86, 0xb4, 0x26, 0x53, 0x51, 0xd0, 0x0d, 0x7a, 0xfb, 0xc9, 0x26, 0x88, 0xbf,
0x07, 0x00, 0xef, 0xd7, 0x28, 0x26, 0xeb, 0x8f, 0xd2, 0x12, 0xfb, 0x1f, 0x5a, 0x96, 0x38, 0xe1,
0x98, 0xdb, 0x85, 0x27, 0x76, 0x92, 0x12, 0x60, 0xe7, 0x10, 0xd2, 0xda, 0x46, 0xb5, 0x6e, 0xd8,
0x6b, 0x0f, 0x58, 0xdf, 0x57, 0xed, 0x4f, 0xca, 0xa2, 0x89, 0x4b, 0x3b, 0x8d, 0xfb, 0xa5, 0x16,
0x0f, 0x13, 0xb9, 0xc2, 0x28, 0xec, 0x06, 0xbd, 0x30, 0x29, 0x01, 0xf6, 0x1f, 0xec, 0x2d, 0x50,
0xce, 0x17, 0x14, 0xd5, 0x7d, 0xaa, 0x88, 0xd8, 0x09, 0xc0, 0x54, 0xce, 0x66, 0x52, 0x64, 0x4b,
0xca, 0xa3, 0x46, 0x37, 0xe8, 0xd5, 0x93, 0x0a, 0xe2, 0x54, 0xa5, 0xbd, 0xc1, 0x55, 0xaa, 0xf5,
0x32, 0xda, 0xf3, 0x16, 0x4a, 0x20, 0xfe, 0x02, 0x8d, 0xcf, 0x19, 0x9a, 0xdc, 0xc9, 0xbb, 0xe1,
0xa0, 0x29, 0xba, 0x2f, 0x22, 0x76, 0x0c, 0xfb, 0xb3, 0x4c, 0x89, 0x4f, 0x7c, 0x85, 0x51, 0xad,
0x1b, 0xf4, 0x5a, 0xc9, 0x2e, 0x66, 0x11, 0x34, 0x53, 0x9e, 0x2f, 0x35, 0x9f, 0xfa, 0x76, 0x3b,
0xc9, 0x36, 0x8c, 0xbf, 0x02, 0x8c, 0x0c, 0x72, 0xc2, 0xc9, 0xfa, 0x5a, 0xfd, 0x52, 0xfb, 0x04,
0x60, 0xe3, 0xbf, 0xa2, 0x5e, 0x41, 0x7e, 0xa3, 0x7f, 0x06, 0xed, 0x77, 0xc6, 0xf0, 0x7c, 0xa4,
0xd5, 0x4c, 0xce, 0xdd, 0x8a, 0x1e, 0xf9, 0x32, 0x73, 0x53, 0x0b, 0x7b, 0xad, 0x64, 0x13, 0xc4,
0xe7, 0xd0, 0xb9, 0x25, 0x23, 0xd5, 0xfc, 0x29, 0x2b, 0x28, 0x59, 0x67, 0xd0, 0xbe, 0x56, 0x34,
0x1c, 0x3c, 0x47, 0x6a, 0x6c, 0x49, 0x6e, 0xdb, 0x1b, 0xc2, 0x35, 0xe1, 0x8a, 0x1d, 0x42, 0xf8,
0x80, 0xb9, 0x77, 0xd3, 0x4a, 0xdc, 0x27, 0x63, 0x50, 0xe7, 0xd3, 0xa9, 0x29, 0x4c, 0xf8, 0x6f,
0x76, 0x01, 0x21, 0x37, 0xc6, 0x0b, 0x95, 0x5b, 0xaf, 0xb4, 0x3d, 0xfe, 0x2b, 0x71, 0x04, 0xf6,
0x0a, 0x42, 0x4b, 0xc6, 0xaf, 0xb5, 0x3d, 0xf8, 0xa7, 0xe0, 0x55, 0x3b, 0x77, 0x44, 0x4b, 0x5e,
0x50, 0x2a, 0xf2, 0x3b, 0x2e, 0x05, 0x2b, 0xcd, 0x3b, 0x9e, 0x54, 0xc4, 0x0e, 0xa0, 0x36, 0xc9,
0xa3, 0xb6, 0x37, 0x50, 0x9b, 0xe4, 0x57, 0xcd, 0xc2, 0x53, 0x7c, 0x07, 0x9d, 0x1b, 0x3d, 0x95,
0xb3, 0xed, 0xdc, 0x9e, 0xfa, 0xd8, 0xd9, 0xaf, 0x55, 0x66, 0xe4, 0x04, 0x75, 0x5a, 0x8c, 0xad,
0xa6, 0xd3, 0x9d, 0xdb, 0x7a, 0xe9, 0x36, 0x16, 0xf0, 0x77, 0x82, 0x02, 0x65, 0x4a, 0x85, 0xf8,
0x4b, 0xa8, 0xa7, 0x06, 0x1f, 0xbd, 0x7a, 0x7b, 0x70, 0x54, 0xb4, 0x5b, 0x4e, 0x31, 0xf1, 0x69,
0xf6, 0x1a, 0x9a, 0x22, 0x33, 0x06, 0x15, 0xf9, 0x9a, 0xcf, 0x32, 0xb7, 0x8c, 0xf8, 0x2d, 0xb4,
0x13, 0x4c, 0x97, 0x7f, 0xd8, 0x7f, 0xfc, 0x2d, 0x80, 0xc3, 0xb1, 0xb4, 0xa4, 0x4d, 0x3e, 0x42,
0x43, 0xb7, 0xa4, 0x0d, 0xba, 0xc3, 0x30, 0x5a, 0x93, 0x40, 0x43, 0x36, 0x0a, 0xba, 0xa1, 0x3b,
0xd9, 0x1d, 0xc0, 0xde, 0xc0, 0x91, 0x54, 0x84, 0x66, 0x85, 0x53, 0xc9, 0x09, 0x47, 0x9e, 0x55,
0xf3, 0xac, 0xa7, 0x09, 0x76, 0x01, 0x07, 0x06, 0x1f, 0xb5, 0xe0, 0xee, 0xdf, 0x75, 0x0f, 0x82,
0xff, 0x13, 0x3b, 0xc9, 0x4f, 0xa8, 0xab, 0x29, 0x32, 0x33, 0x46, 0x39, 0xa7, 0x45, 0x71, 0xc7,
0x25, 0xe0, 0xb2, 0x6a, 0x4d, 0xe3, 0xcd, 0x95, 0x37, 0x36, 0xd9, 0x1d, 0x70, 0x75, 0x7a, 0xf7,
0x62, 0x2e, 0x69, 0x91, 0xdd, 0xf7, 0x85, 0x5e, 0x5d, 0x0e, 0x87, 0x42, 0x5d, 0x8a, 0x05, 0x97,
0x6a, 0x38, 0xbc, 0xf4, 0x03, 0xbb, 0xdf, 0xf3, 0x4f, 0xd7, 0xf0, 0x47, 0x00, 0x00, 0x00, 0xff,
0xff, 0x95, 0x0a, 0xd4, 0x55, 0xe6, 0x04, 0x00, 0x00,
// 665 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xed, 0x6a, 0xdb, 0x4a,
0x10, 0xbd, 0x92, 0xec, 0x38, 0x1e, 0xfb, 0x86, 0x64, 0xef, 0xa5, 0x88, 0xd0, 0x26, 0x46, 0x49,
0x53, 0x43, 0x8b, 0x03, 0x36, 0x7d, 0x80, 0xc6, 0x94, 0x26, 0xd0, 0x14, 0xaa, 0xb8, 0x7f, 0xf2,
0xa3, 0xb0, 0x59, 0x8f, 0xed, 0x25, 0xf6, 0xae, 0x58, 0x8d, 0x82, 0xf5, 0x36, 0x7d, 0x96, 0xd2,
0x07, 0x2b, 0xbb, 0x92, 0x2d, 0xd1, 0xa4, 0x85, 0xfe, 0xd3, 0x9c, 0x73, 0x74, 0x76, 0xce, 0xec,
0x07, 0xec, 0xe1, 0x1a, 0x45, 0x46, 0xda, 0x0c, 0x12, 0xa3, 0x49, 0xb3, 0x26, 0xe5, 0x09, 0xa6,
0x87, 0x07, 0x64, 0xb8, 0x4a, 0xb9, 0x20, 0xa9, 0x55, 0xc1, 0x44, 0xc7, 0xd0, 0xfa, 0x80, 0x0a,
0x53, 0x99, 0xb2, 0xff, 0xa1, 0x29, 0x53, 0x93, 0xa9, 0xd0, 0xeb, 0x79, 0xfd, 0xdd, 0xb8, 0x28,
0xa2, 0x6f, 0x3e, 0xc0, 0xfb, 0x35, 0x8a, 0xc9, 0xfa, 0xa3, 0x4c, 0x89, 0x3d, 0x87, 0x76, 0x4a,
0x9c, 0xf0, 0x92, 0xa7, 0x0b, 0x27, 0xec, 0xc6, 0x15, 0xc0, 0x8e, 0x00, 0x12, 0x6e, 0x50, 0x91,
0xa3, 0x5b, 0x8e, 0xae, 0x21, 0xec, 0x10, 0x76, 0x57, 0x5c, 0x2a, 0xc7, 0xee, 0x3a, 0x76, 0x5b,
0xdb, 0x7f, 0xdd, 0x37, 0xca, 0xf9, 0x82, 0xc2, 0x76, 0xcf, 0xeb, 0x07, 0x71, 0x0d, 0xb1, 0x2b,
0xdf, 0x2d, 0xb5, 0xb8, 0x9f, 0xc8, 0x15, 0x86, 0x81, 0xa3, 0x2b, 0x80, 0x3d, 0x83, 0x9d, 0x45,
0xf1, 0x67, 0xc3, 0x51, 0x65, 0x65, 0x5d, 0xa7, 0x72, 0x36, 0x93, 0x22, 0x5b, 0x52, 0x1e, 0x36,
0x7b, 0x5e, 0xbf, 0x11, 0xd7, 0x10, 0xeb, 0x2a, 0xd3, 0x6b, 0x5c, 0x25, 0x5a, 0x2f, 0xc3, 0x1d,
0x17, 0xbc, 0x02, 0xd8, 0x29, 0x04, 0xb4, 0x4e, 0x43, 0xbf, 0x17, 0xf4, 0x3b, 0x43, 0x36, 0x70,
0x53, 0x1c, 0x4c, 0xaa, 0x21, 0xc6, 0x96, 0x8e, 0xbe, 0x40, 0xf3, 0x73, 0x86, 0x26, 0xb7, 0x4d,
0xd8, 0xc1, 0xa3, 0x29, 0x27, 0x53, 0x56, 0x36, 0xf6, 0x2c, 0x53, 0xe2, 0x13, 0x5f, 0x61, 0xe8,
0xf7, 0xbc, 0x7e, 0x3b, 0xde, 0xd6, 0x2c, 0x84, 0x56, 0xc2, 0xf3, 0xa5, 0xe6, 0x53, 0x17, 0xaa,
0x1b, 0x6f, 0xca, 0xe8, 0x2b, 0xc0, 0xd8, 0x20, 0x27, 0x9c, 0xac, 0xaf, 0xd4, 0x6f, 0xbd, 0x8f,
0x00, 0x8a, 0x5e, 0x6a, 0xee, 0x35, 0xe4, 0x0f, 0xfe, 0x27, 0xd0, 0x79, 0x67, 0x0c, 0xcf, 0xc7,
0x5a, 0xcd, 0xe4, 0xdc, 0x6e, 0xff, 0x03, 0x5f, 0x66, 0x76, 0xb6, 0x41, 0xbf, 0x1d, 0x17, 0x45,
0x74, 0x0a, 0xdd, 0x1b, 0x32, 0x52, 0xcd, 0x1f, 0xab, 0xbc, 0x4a, 0x75, 0x02, 0x9d, 0x2b, 0x45,
0xa3, 0xe1, 0x53, 0xa2, 0xe6, 0x46, 0xf4, 0xc3, 0x03, 0x28, 0x04, 0x57, 0x84, 0x2b, 0xb6, 0x0f,
0xc1, 0x3d, 0xe6, 0x2e, 0x4d, 0x3b, 0xb6, 0x9f, 0x8c, 0x41, 0x83, 0x4f, 0xa7, 0xa6, 0x0c, 0xe1,
0xbe, 0xd9, 0x19, 0x04, 0xdc, 0x18, 0x67, 0x54, 0xed, 0x40, 0xad, 0xed, 0xcb, 0x7f, 0x62, 0x2b,
0x60, 0xaf, 0x20, 0x48, 0xc9, 0xb8, 0xcd, 0xef, 0x0c, 0xff, 0x2b, 0x75, 0xf5, 0xce, 0xad, 0x30,
0x25, 0x67, 0x28, 0x15, 0xb9, 0x93, 0x50, 0x19, 0xd6, 0x9a, 0xb7, 0x3a, 0xa9, 0x88, 0xed, 0x81,
0x3f, 0xc9, 0xc3, 0x8e, 0x0b, 0xe0, 0x4f, 0xf2, 0x8b, 0x56, 0x99, 0x29, 0xba, 0x85, 0xee, 0xb5,
0x9e, 0xca, 0xd9, 0x66, 0x6e, 0x8f, 0x73, 0x6c, 0xe3, 0xfb, 0xb5, 0x19, 0x59, 0x43, 0x9d, 0x94,
0x63, 0xf3, 0x75, 0xb2, 0x4d, 0xdb, 0xa8, 0xd2, 0x46, 0x02, 0xfe, 0x8d, 0x51, 0xa0, 0x4c, 0xa8,
0x34, 0x7f, 0x09, 0x8d, 0xc4, 0xe0, 0x83, 0x73, 0xef, 0x0c, 0x0f, 0xca, 0x76, 0xab, 0x29, 0xc6,
0x8e, 0x66, 0xaf, 0xa1, 0x25, 0x32, 0x63, 0xaf, 0x99, 0x5b, 0xf3, 0x49, 0xe5, 0x46, 0x11, 0xbd,
0x85, 0x4e, 0x8c, 0xc9, 0xf2, 0x2f, 0xfb, 0x8f, 0xbe, 0x7b, 0xb0, 0x7f, 0x29, 0x53, 0xd2, 0x26,
0x1f, 0xa3, 0xa1, 0x1b, 0xd2, 0x06, 0xed, 0xf5, 0x31, 0x5a, 0x93, 0x40, 0x43, 0x69, 0xe8, 0xf5,
0x02, 0xfb, 0x1c, 0x6c, 0x01, 0xf6, 0x06, 0x0e, 0xa4, 0x22, 0x34, 0x2b, 0x9c, 0x4a, 0x4e, 0x38,
0x76, 0x2a, 0xdf, 0xa9, 0x1e, 0x13, 0xec, 0x0c, 0xf6, 0x0c, 0x3e, 0x68, 0xc1, 0xed, 0xd9, 0xb5,
0x8f, 0x8d, 0x3b, 0x89, 0xdd, 0xf8, 0x17, 0xd4, 0xae, 0x29, 0x32, 0x63, 0x5f, 0x05, 0x5a, 0x94,
0xb7, 0xbd, 0x02, 0x2c, 0xab, 0xd6, 0x54, 0xbe, 0x22, 0xcd, 0x82, 0xdd, 0x02, 0x17, 0xc7, 0xb7,
0x2f, 0xe6, 0x92, 0x16, 0xd9, 0xdd, 0x40, 0xe8, 0xd5, 0xf9, 0x68, 0x24, 0xd4, 0xb9, 0x58, 0x70,
0xa9, 0x46, 0xa3, 0x73, 0x37, 0xb0, 0xbb, 0x1d, 0xf7, 0x2c, 0x8e, 0x7e, 0x06, 0x00, 0x00, 0xff,
0xff, 0x22, 0x46, 0xb1, 0x62, 0x42, 0x05, 0x00, 0x00,
}
......@@ -28,6 +28,7 @@ message Header {
Signature signature = 8;
}
// 参考Header解释
// mainHash 平行链上使用的字段,代表这个区块的主链hash
message Block {
int64 version = 1;
bytes parentHash = 2;
......@@ -36,6 +37,8 @@ message Block {
int64 height = 5;
int64 blockTime = 6;
uint32 difficulty = 11;
bytes mainHash = 12;
int64 mainHeight = 13;
Signature signature = 8;
repeated Transaction txs = 7;
}
......
......@@ -10,12 +10,15 @@ message Genesis {
}
message ExecTxList {
bytes stateHash = 1;
repeated Transaction txs = 2;
int64 blockTime = 3;
int64 height = 4;
uint64 difficulty = 5;
bool isMempool = 6;
bytes stateHash = 1;
bytes parentHash = 7;
bytes mainHash = 8;
int64 mainHeight = 9;
int64 blockTime = 3;
int64 height = 4;
uint64 difficulty = 5;
bool isMempool = 6;
repeated Transaction txs = 2;
}
message Query {
......
......@@ -30,9 +30,12 @@ func CheckBlock(client queue.Client, block *types.BlockDetail) error {
}
//ExecTx : To send lists of txs within a block to exector for execution
func ExecTx(client queue.Client, prevStateRoot []byte, block *types.Block) *types.Receipts {
func ExecTx(client queue.Client, prevStateRoot []byte, block *types.Block) (*types.Receipts, error) {
list := &types.ExecTxList{
StateHash: prevStateRoot,
ParentHash: block.ParentHash,
MainHash: block.MainHash,
MainHeight: block.MainHeight,
Txs: block.Txs,
BlockTime: block.BlockTime,
Height: block.Height,
......@@ -43,14 +46,14 @@ func ExecTx(client queue.Client, prevStateRoot []byte, block *types.Block) *type
client.Send(msg, true)
resp, err := client.Wait(msg)
if err != nil {
panic(err)
return nil, err
}
receipts := resp.GetData().(*types.Receipts)
return receipts
return receipts, nil
}
//ExecKVMemSet : send kv values to memory store and set it in db
func ExecKVMemSet(client queue.Client, prevStateRoot []byte, height int64, kvset []*types.KeyValue, sync bool) []byte {
func ExecKVMemSet(client queue.Client, prevStateRoot []byte, height int64, kvset []*types.KeyValue, sync bool) ([]byte, error) {
set := &types.StoreSet{StateHash: prevStateRoot, KV: kvset, Height: height}
setwithsync := &types.StoreSetWithSync{Storeset: set, Sync: sync}
......@@ -58,10 +61,10 @@ func ExecKVMemSet(client queue.Client, prevStateRoot []byte, height int64, kvset
client.Send(msg, true)
resp, err := client.Wait(msg)
if err != nil {
panic(err)
return nil, err
}
hash := resp.GetData().(*types.ReplyHash)
return hash.GetHash()
return hash.GetHash(), nil
}
//ExecKVSetCommit : commit the data set opetation to db
......
......@@ -9,7 +9,6 @@ Title="local"
TestNet=true
FixTime=false
[log]
# 日志级别,支持debug(dbug)/info/warn/error(eror)/crit
loglevel = "debug"
......@@ -102,6 +101,20 @@ targetTimePerBlock = 2
[mver.consensus.ForkChainParamV2]
powLimitBits = "0x1f2fffff"
[consensus.sub.para]
ParaRemoteGrpcClient="localhost:8802"
#主链指定高度的区块开始同步
startHeight=345850
#打包时间间隔,单位秒
writeBlockSeconds=2
#主链每隔几个没有相关交易的区块,平行链上打包空区块
emptyBlockInterval=50
#验证账户,验证节点需要配置自己的账户,并且钱包导入对应种子,非验证节点留空
authAccount=""
#等待平行链共识消息在主链上链并成功的块数,超出会重发共识消息,最小是2
waitBlocks4CommitMsg=2
searchHashMatchedBlockDepth=100
[consensus.sub.solo]
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
genesisBlockTime=1514533394
......@@ -117,12 +130,12 @@ count=10000
[[consensus.sub.ticket.genesis]]
minerAddr="1PUiGcbsccfxW3zuvHXZBJfznziph5miAo"
returnAddr="1EbDHAXpoiewjPLX9uqoz38HsKqMXayZrF"
count=10000
count=1000
[[consensus.sub.ticket.genesis]]
minerAddr="1EDnnePAZN48aC2hiTDzhkczfF39g1pZZX"
returnAddr="1KcCVZLSQYRUwE5EXTsAoQs9LuJW6xwfQa"
count=10000
count=1000
[store]
name="mavl"
......
......@@ -66,6 +66,7 @@ type Chain33Mock struct {
store queue.Module
rpc *rpc.RPC
cfg *types.Config
sub *types.ConfigSubModule
datadir string
lastsend []byte
}
......@@ -82,11 +83,15 @@ func NewWithConfig(cfg *types.Config, sub *types.ConfigSubModule, mockapi client
func newWithConfig(cfg *types.Config, sub *types.ConfigSubModule, mockapi client.QueueProtocolAPI) *Chain33Mock {
chain33globalLock.Lock()
return newWithConfigNoLock(cfg, sub, mockapi)
}
func newWithConfigNoLock(cfg *types.Config, sub *types.ConfigSubModule, mockapi client.QueueProtocolAPI) *Chain33Mock {
types.Init(cfg.Title, cfg)
q := queue.New("channel")
types.Debug = false
datadir := util.ResetDatadir(cfg, "$TEMP/")
mock := &Chain33Mock{cfg: cfg, q: q, datadir: datadir}
mock := &Chain33Mock{cfg: cfg, sub: sub, q: q, datadir: datadir}
mock.random = rand.New(rand.NewSource(types.Now().UnixNano()))
mock.exec = executor.New(cfg.Exec, sub.Exec)
......@@ -163,6 +168,14 @@ func (mock *Chain33Mock) Listen() {
l := len(mock.cfg.RPC.GrpcBindAddr)
mock.cfg.RPC.GrpcBindAddr = mock.cfg.RPC.GrpcBindAddr[0:l-2] + ":" + fmt.Sprint(portgrpc)
}
if mock.sub.Consensus["para"] != nil {
data, err := types.ModifySubConfig(mock.sub.Consensus["para"], "ParaRemoteGrpcClient", mock.cfg.RPC.GrpcBindAddr)
if err != nil {
panic(err)
}
mock.sub.Consensus["para"] = data
types.S("config.consensus.sub.para.ParaRemoteGrpcClient", mock.cfg.RPC.GrpcBindAddr)
}
}
//GetBlockChain :
......@@ -271,6 +284,11 @@ func (mock *Chain33Mock) GetCfg() *types.Config {
//Close :
func (mock *Chain33Mock) Close() {
mock.closeNoLock()
chain33globalLock.Unlock()
}
func (mock *Chain33Mock) closeNoLock() {
mock.chain.Close()
mock.store.Close()
mock.mem.Close()
......@@ -281,7 +299,6 @@ func (mock *Chain33Mock) Close() {
mock.client.Close()
mock.rpc.Close()
os.RemoveAll(mock.datadir)
chain33globalLock.Unlock()
}
//WaitHeight :
......
......@@ -130,7 +130,11 @@ func JSONPrint(t *testing.T, input interface{}) {
t.Error(err)
return
}
t.Log(string(data))
if t == nil {
fmt.Println(string(data))
} else {
t.Log(string(data))
}
}
// CreateManageTx : Create Manage Tx
......@@ -245,7 +249,10 @@ func ExecBlock(client queue.Client, prevStateRoot []byte, block *types.Block, er
block.TxHash = merkle.CalcMerkleRootCache(cacheTxs)
block.Txs = types.CacheToTxs(cacheTxs)
receipts := ExecTx(client, prevStateRoot, block)
receipts, err := ExecTx(client, prevStateRoot, block)
if err != nil {
return nil, nil, err
}
var kvset []*types.KeyValue
var deltxlist = make(map[int]bool)
var rdata []*types.ReceiptData //save to db receipt log
......@@ -285,7 +292,10 @@ func ExecBlock(client queue.Client, prevStateRoot []byte, block *types.Block, er
}
var detail types.BlockDetail
calcHash = ExecKVMemSet(client, prevStateRoot, block.Height, kvset, sync)
calcHash, err = ExecKVMemSet(client, prevStateRoot, block.Height, kvset, sync)
if err != nil {
return nil, nil, err
}
if errReturn && !bytes.Equal(block.StateHash, calcHash) {
ExecKVSetRollback(client, calcHash)
if len(rdata) > 0 {
......
......@@ -139,7 +139,10 @@ func SaveAccountTomavl(client queue.Client, prevStateRoot []byte, accs []*types.
kvs := accountdb.GetKVSet(acc)
kvset = append(kvset, kvs...)
}
hash := util.ExecKVMemSet(client, prevStateRoot, 0, kvset, true)
hash, err := util.ExecKVMemSet(client, prevStateRoot, 0, kvset, true)
if err != nil {
panic(err)
}
Statehash = hash
util.ExecKVSetCommit(client, Statehash)
return hash
......
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