Commit 5b006881 authored by caopingcp's avatar caopingcp

Merge branch 'master' into 'issue615_tendermint'

parents fceee563 ff6ed7b4
...@@ -9,12 +9,12 @@ matrix: ...@@ -9,12 +9,12 @@ matrix:
include: include:
- name: check_fmt - name: check_fmt
sudo: require sudo: require
go: "1.12.x" go: "1.13.x"
env: env:
- GO111MODULE=on - GO111MODULE=on
install: install:
- go get -u golang.org/x/tools/cmd/goimports - go get -u golang.org/x/tools/cmd/goimports
- go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.17.1 - go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.18.0
- go get -u mvdan.cc/sh/cmd/shfmt - go get -u mvdan.cc/sh/cmd/shfmt
- go get -u mvdan.cc/sh/cmd/gosh - go get -u mvdan.cc/sh/cmd/gosh
script: script:
...@@ -22,7 +22,7 @@ matrix: ...@@ -22,7 +22,7 @@ matrix:
- make linter - make linter
- name: unit-test - name: unit-test
go: "1.12.x" go: "1.13.x"
env: env:
- GO111MODULE=on - GO111MODULE=on
install: skip install: skip
...@@ -31,7 +31,7 @@ matrix: ...@@ -31,7 +31,7 @@ matrix:
- name: coverage - name: coverage
if: branch = master if: branch = master
go: "1.12.x" go: "1.13.x"
env: env:
- GO111MODULE=on - GO111MODULE=on
before_install: before_install:
...@@ -43,7 +43,7 @@ matrix: ...@@ -43,7 +43,7 @@ matrix:
- bash <(curl -s https://codecov.io/bash) - bash <(curl -s https://codecov.io/bash)
- name: auto-test - name: auto-test
go: "1.12.x" go: "1.13.x"
env: env:
- GO111MODULE=on - GO111MODULE=on
install: skip install: skip
...@@ -56,7 +56,7 @@ matrix: ...@@ -56,7 +56,7 @@ matrix:
sudo: required sudo: required
services: services:
- docker - docker
go: "1.12.x" go: "1.13.x"
env: env:
- DOCKER_COMPOSE_VERSION=1.21.2 - DOCKER_COMPOSE_VERSION=1.21.2
- GO111MODULE=on - GO111MODULE=on
......
...@@ -25,6 +25,7 @@ default: depends build ...@@ -25,6 +25,7 @@ default: depends build
build: depends build: depends
go build $(BUILD_FLAGS) -v -i -o $(APP) go build $(BUILD_FLAGS) -v -i -o $(APP)
go build $(BUILD_FLAGS) -v -i -o $(CLI) $(SRC_CLI) go build $(BUILD_FLAGS) -v -i -o $(CLI) $(SRC_CLI)
go build $(BUILD_FLAGS) -v -i -o build/fork-config github.com/33cn/plugin/cli/fork_config/
@cp chain33.toml $(CHAIN33_PATH)/build/system-test-rpc.sh build/ @cp chain33.toml $(CHAIN33_PATH)/build/system-test-rpc.sh build/
@cp chain33.para.toml build/ci/paracross/ @cp chain33.para.toml build/ci/paracross/
...@@ -68,7 +69,7 @@ update: ## version 可以是git tag打的具体版本号,也可以是commit hash ...@@ -68,7 +69,7 @@ update: ## version 可以是git tag打的具体版本号,也可以是commit hash
go get github.com/33cn/chain33@master ;fi go get github.com/33cn/chain33@master ;fi
@go mod tidy @go mod tidy
dep: dep:
@go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.17.1 @go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.18.0
@go get -u golang.org/x/tools/cmd/goimports @go get -u golang.org/x/tools/cmd/goimports
@go get -u github.com/mitchellh/gox @go get -u github.com/mitchellh/gox
@go get -u github.com/vektra/mockery/.../ @go get -u github.com/vektra/mockery/.../
......
...@@ -14,8 +14,6 @@ echo_rst() { ...@@ -14,8 +14,6 @@ echo_rst() {
echo -e "${GRE}$1 ok${NOC}" echo -e "${GRE}$1 ok${NOC}"
elif [ "$2" -eq 2 ]; then elif [ "$2" -eq 2 ]; then
echo -e "${GRE}$1 not support${NOC}" echo -e "${GRE}$1 not support${NOC}"
CASE_ERR="err"
echo $CASE_ERR
else else
echo -e "${RED}$1 fail${NOC}" echo -e "${RED}$1 fail${NOC}"
CASE_ERR="err" CASE_ERR="err"
...@@ -108,7 +106,8 @@ chain33_ImportPrivkey() { ...@@ -108,7 +106,8 @@ chain33_ImportPrivkey() {
local req='"method":"Chain33.ImportPrivkey", "params":[{"privkey":"'"$pri"'", "label":"'"$label"'"}]' local req='"method":"Chain33.ImportPrivkey", "params":[{"privkey":"'"$pri"'", "label":"'"$label"'"}]'
resp=$(curl -ksd "{$req}" "$MAIN_HTTP") resp=$(curl -ksd "{$req}" "$MAIN_HTTP")
ok=$(jq '(((.error|not) and (.result.label=="'"$label"'") and (.result.acc.addr == "'"$acc"'")) or (.error=="ErrPrivkeyExist"))' <<<"$resp") #ok=$(jq '(((.error|not) and (.result.label=="'"$label"'") and (.result.acc.addr == "'"$acc"'")) or (.error=="ErrPrivkeyExist"))' <<<"$resp")
ok=$(jq '(((.error|not) and (.result.label=="'"$label"'") and (.result.acc.addr == "'"$acc"'")) or (.error=="ErrPrivkeyExist") or (.error=="ErrLabelHasUsed"))' <<<"$resp")
[ "$ok" == true ] [ "$ok" == true ]
} }
...@@ -185,6 +184,19 @@ chain33_applyCoins() { ...@@ -185,6 +184,19 @@ chain33_applyCoins() {
} }
chain33_RpcTestBegin() {
echo -e "${GRE}====== $1 Rpc Test Begin ===========${NOC}"
}
chain33_RpcTestRst() {
if [ -n "$2" ]; then
echo -e "${RED}====== $1 Rpc Test Fail ===========${NOC}"
exit 1
else
echo -e "${GRE}====== $1 Rpc Test Pass ===========${NOC}"
fi
}
chain33_debug_function() { chain33_debug_function() {
set -x set -x
eval "$@" eval "$@"
......
...@@ -10,12 +10,24 @@ function dapp_test_rpc() { ...@@ -10,12 +10,24 @@ function dapp_test_rpc() {
if [ -d dapptest ]; then if [ -d dapptest ]; then
cp "$DAPP_TEST_COMMON" dapptest/ cp "$DAPP_TEST_COMMON" dapptest/
cd dapptest || return cd dapptest || return
rm -f "retries.log"
rm -f "jobs.log"
dapps=$(find . -maxdepth 1 -type d ! -name dapptest ! -name . | sed 's/^\.\///' | sort) dapps=$(find . -maxdepth 1 -type d ! -name dapptest ! -name . | sed 's/^\.\///' | sort)
echo "dapps list: $dapps" echo "dapps list: $dapps"
parallel -k --retries 3 --joblog ./testlog ./{}/"${RPC_TESTFILE}" "$ip" ::: "$dapps" set +e
echo "check dapps test log" parallel -k --retries 3 --joblog ./jobs.log 'echo tried {} >>./retries.log; ./{}/"'"${RPC_TESTFILE}"'" "'"$ip"'"' ::: "$dapps"
cat ./testlog local ret=$?
# retries 3 times if one dapp fail
echo "============ # retried dapps log: ============="
cat ./retries.log
echo "============ # check dapps test log: ============="
cat ./jobs.log
set -e
if [ $ret -ne 0 ]; then
exit 1
fi
fi fi
echo "============ # dapp rpc test end =============" echo "============ # dapp rpc test end ============="
} }
...@@ -230,6 +230,27 @@ function block_wait() { ...@@ -230,6 +230,27 @@ function block_wait() {
echo "wait new block $count/10 s, cur height=$expect,old=$cur_height" echo "wait new block $count/10 s, cur height=$expect,old=$cur_height"
} }
function tx_wait() {
if [ "$#" -lt 2 ]; then
echo "wrong tx_wait params"
exit 1
fi
local req=\"${2}\"
txhash=$(${1} tx query -s "${2}" | jq ".tx.hash")
local count=0
while true; do
txhash=$(${1} tx query -s "${2}" | jq ".tx.hash")
if [ "${txhash}" != "${req}" ]; then
count=$((count + 1))
echo "${txhash}" "${req}" "${count}"
sleep 0.1
else
RAW_TX_HASH=$txhash
echo "====query tx=$RAW_TX_HASH success"
break
fi
done
}
function block_wait2height() { function block_wait2height() {
if [ "$#" -lt 3 ]; then if [ "$#" -lt 3 ]; then
echo "wrong block_wait params" echo "wrong block_wait params"
...@@ -336,7 +357,8 @@ function transfer() { ...@@ -336,7 +357,8 @@ function transfer() {
echo "=========== # withdraw =============" echo "=========== # withdraw ============="
hash=$(${1} send coins transfer -a 2 -n deposit -t 1wvmD6RNHzwhY4eN75WnM6JcaAvNQ4nHx -k CC38546E9E659D15E6B4893F0AB32A06D103931A8230B0BDE71459D2B27D6944) hash=$(${1} send coins transfer -a 2 -n deposit -t 1wvmD6RNHzwhY4eN75WnM6JcaAvNQ4nHx -k CC38546E9E659D15E6B4893F0AB32A06D103931A8230B0BDE71459D2B27D6944)
echo "${hash}" echo "${hash}"
block_wait "${1}" 1 # block_wait "${1}" 2
tx_wait "${1}" "${hash}"
before=$(${1} account balance -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -e retrieve | jq -r ".balance") before=$(${1} account balance -a 14KEKbYtKKQm4wMthSK9J4La4nAiidGozt -e retrieve | jq -r ".balance")
if [ "${before}" == "0.0000" ]; then if [ "${before}" == "0.0000" ]; then
echo "wrong ticket balance, should not be zero" echo "wrong ticket balance, should not be zero"
...@@ -345,7 +367,8 @@ function transfer() { ...@@ -345,7 +367,8 @@ function transfer() {
hash=$(${1} send coins withdraw -a 1 -n withdraw -e retrieve -k CC38546E9E659D15E6B4893F0AB32A06D103931A8230B0BDE71459D2B27D6944) hash=$(${1} send coins withdraw -a 1 -n withdraw -e retrieve -k CC38546E9E659D15E6B4893F0AB32A06D103931A8230B0BDE71459D2B27D6944)
echo "${hash}" echo "${hash}"
block_wait "${1}" 1 # block_wait "${1}" 1
tx_wait "${1}" "${hash}"
txs=$(${1} tx query_hash -s "${hash}" | jq ".txs") txs=$(${1} tx query_hash -s "${hash}" | jq ".txs")
if [ "${txs}" == "null" ]; then if [ "${txs}" == "null" ]; then
echo "withdraw cannot find tx" echo "withdraw cannot find tx"
...@@ -354,7 +377,8 @@ function transfer() { ...@@ -354,7 +377,8 @@ function transfer() {
hash=$(${1} send coins transfer -a 1000 -n transfer -t 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01) hash=$(${1} send coins transfer -a 1000 -n transfer -t 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}" echo "${hash}"
block_wait "${1}" 1 # block_wait "${1}" 1
tx_wait "${1}" "${hash}"
} }
function dapp_test_address() { function dapp_test_address() {
...@@ -382,11 +406,14 @@ function dapp_test_address() { ...@@ -382,11 +406,14 @@ function dapp_test_address() {
hash=$(${1} send coins transfer -a 1500 -n transfer -t 1PUiGcbsccfxW3zuvHXZBJfznziph5miAo -k 2116459C0EC8ED01AA0EEAE35CAC5C96F94473F7816F114873291217303F6989) hash=$(${1} send coins transfer -a 1500 -n transfer -t 1PUiGcbsccfxW3zuvHXZBJfznziph5miAo -k 2116459C0EC8ED01AA0EEAE35CAC5C96F94473F7816F114873291217303F6989)
echo "${hash}" echo "${hash}"
tx_wait "${1}" "${hash}"
#total allocation for rpc test #total allocation for rpc test
hash=$(${1} send coins transfer -a 8000 -n transfer -t 1PcGKYYoLn1PLLJJodc1UpgWGeFAQasAkx -k 2116459C0EC8ED01AA0EEAE35CAC5C96F94473F7816F114873291217303F6989) hash=$(${1} send coins transfer -a 8000 -n transfer -t 1PcGKYYoLn1PLLJJodc1UpgWGeFAQasAkx -k 2116459C0EC8ED01AA0EEAE35CAC5C96F94473F7816F114873291217303F6989)
echo "${hash}" echo "${hash}"
block_wait "${1}" 1 # block_wait "${1}" 1
tx_wait "${1}" "${hash}"
} }
function base_config() { function base_config() {
......
#!/bin/bash
# 在 plugin/plugin_type/plugin_name 找出fork
function subdir_forks() {
plugin_dir=$1
plugin_name=$2
full_dir=$1
forks=$(grep types.RegisterDappFork "${full_dir}" -R | cut -d '(' -f 2 | cut -d ')' -f 1 | sed 's/ //g')
if [ -z "${forks}" ]; then
return
fi
cnt=$(echo "${forks}" | grep "^\"" | wc -l)
if [ $cnt -gt 0 ]; then
name=$(echo $forks | head -n1 | cut -d ',' -f 1 | sed 's/"//g')
echo "[fork.sub.${name}]"
else
echo "[fork.sub.${plugin_name}]";
fi
for fork in "${forks}"
do
echo "${fork}" | awk -F ',' '{ \
if(match($2,"\"")) gsub("\"","",$2); else gsub("X$","",$2); \
print $2 "=" $3}'
#/*print "debug" $1 $2 $3;*/ \
done
echo
}
dir=$(go list -f '{{.Dir}}' github.com/33cn/plugin)/plugin/
plugins=$(find $dir -maxdepth 2 -mindepth 2 -type d | sort)
for plugin in ${plugins}
do
name=$(echo $plugin | sed 's/.*\///g')
subdir_forks $plugin $name
done
package main
import (
"fmt"
"os"
"sort"
"strings"
_ "github.com/33cn/chain33/system"
"github.com/33cn/chain33/types"
_ "github.com/33cn/plugin/plugin"
)
func main() {
forks, err := types.CloneFork("chain33")
if err != nil {
fmt.Printf("clone fork failed: %v", err)
return
}
fmtForks(forks)
}
/*
两个规则:
key 有 ".", Part1.Part2 为 [fork.sub.Part1] Part2=value
key 没有 "." [fork.system] key=value
把相同段的fork打印到一起
[fork.system]
ForkChainParamV1= 0 # ForkBlockCheck=1560000
[fork.sub.ticket]
Enable=0 # manage.ForkManageExec=400000
[fork.sub.store-kvmvccmavl]
ForkKvmvccmavl=2270000 # store-kvmvccmavl.ForkKvmvccmavl=1870000
*/
func fmtForks(forks map[string]int64) {
systemFork := make(map[string]int64)
subFork := make(map[string]map[string]int64)
for k, v := range forks {
if strings.Contains(k, ".") {
str2 := strings.SplitN(k, ".", 2)
if len(str2) != 2 {
fmt.Fprintf(os.Stderr, "can't deal key=%s ", k)
continue
}
_, ok := subFork[str2[0]]
if !ok {
subFork[str2[0]] = make(map[string]int64)
}
subFork[str2[0]][str2[1]] = v
} else {
systemFork[k] = v
}
}
fmt.Println("[fork.system]")
for k, v := range systemFork {
fmt.Printf("%s=%d\n", k, v)
}
fmt.Println("")
plugins := make([]string, 0)
for plugin := range subFork {
plugins = append(plugins, plugin)
}
sort.Strings(plugins)
for _, plugin := range plugins {
fmt.Printf("[fork.sub.%s]\n", plugin)
forks := subFork[plugin]
for k, v := range forks {
fmt.Printf("%s=%d\n", k, v)
}
fmt.Println("")
}
}
...@@ -3,7 +3,7 @@ module github.com/33cn/plugin ...@@ -3,7 +3,7 @@ module github.com/33cn/plugin
go 1.12 go 1.12
require ( require (
github.com/33cn/chain33 v0.0.0-20190925142515-31e357c36c74 github.com/33cn/chain33 v0.0.0-20191011025601-06dbefe7d2e8
github.com/BurntSushi/toml v0.3.1 github.com/BurntSushi/toml v0.3.1
github.com/NebulousLabs/Sia v1.3.7 github.com/NebulousLabs/Sia v1.3.7
github.com/btcsuite/btcd v0.0.0-20181013004428-67e573d211ac github.com/btcsuite/btcd v0.0.0-20181013004428-67e573d211ac
...@@ -20,8 +20,6 @@ require ( ...@@ -20,8 +20,6 @@ require (
github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3
github.com/golang/protobuf v1.3.2 github.com/golang/protobuf v1.3.2
github.com/hashicorp/golang-lru v0.5.0 github.com/hashicorp/golang-lru v0.5.0
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/pkg/errors v0.8.0 github.com/pkg/errors v0.8.0
github.com/prometheus/client_golang v1.1.0 // indirect github.com/prometheus/client_golang v1.1.0 // indirect
github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d
......
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/33cn/chain33 v0.0.0-20190925142515-31e357c36c74 h1:8PC5TDbLIV5haxz3uhiSS2zrgDwkAFQKOSa6KgNTn9c= github.com/33cn/chain33 v0.0.0-20190925142515-31e357c36c74 h1:8PC5TDbLIV5haxz3uhiSS2zrgDwkAFQKOSa6KgNTn9c=
github.com/33cn/chain33 v0.0.0-20190925142515-31e357c36c74/go.mod h1:4I8n+Zyf3t0UKM5jjpqJY627Tub62oXkLsdzIv4r6rQ= github.com/33cn/chain33 v0.0.0-20190925142515-31e357c36c74/go.mod h1:4I8n+Zyf3t0UKM5jjpqJY627Tub62oXkLsdzIv4r6rQ=
github.com/33cn/chain33 v0.0.0-20191011025601-06dbefe7d2e8 h1:YorXd8yAS26S49lY8Mdmn7Z5HhGJ1pat9QfXAEZfkw4=
github.com/33cn/chain33 v0.0.0-20191011025601-06dbefe7d2e8/go.mod h1:4I8n+Zyf3t0UKM5jjpqJY627Tub62oXkLsdzIv4r6rQ=
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 h1:PqzgE6kAMi81xWQA2QIVxjWkFHptGgC547vchpUbtFo= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 h1:PqzgE6kAMi81xWQA2QIVxjWkFHptGgC547vchpUbtFo=
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
......
...@@ -142,7 +142,6 @@ func generateVote(cs *ConsensusState) *dpostype.Vote { ...@@ -142,7 +142,6 @@ func generateVote(cs *ConsensusState) *dpostype.Vote {
PeriodStop: task.PeriodStop, PeriodStop: task.PeriodStop,
Height: height + 1, Height: height + 1,
} }
cs.validatorMgr.FillVoteItem(voteItem)
encode, err := json.Marshal(voteItem) encode, err := json.Marshal(voteItem)
if err != nil { if err != nil {
...@@ -151,6 +150,8 @@ func generateVote(cs *ConsensusState) *dpostype.Vote { ...@@ -151,6 +150,8 @@ func generateVote(cs *ConsensusState) *dpostype.Vote {
voteItem.VoteID = crypto.Ripemd160(encode) voteItem.VoteID = crypto.Ripemd160(encode)
cs.validatorMgr.FillVoteItem(voteItem)
index := cs.validatorMgr.GetIndexByPubKey(cs.privValidator.GetPubKey().Bytes()) index := cs.validatorMgr.GetIndexByPubKey(cs.privValidator.GetPubKey().Bytes())
if index == -1 { if index == -1 {
...@@ -245,7 +246,7 @@ func checkTopNRegist(cs *ConsensusState) { ...@@ -245,7 +246,7 @@ func checkTopNRegist(cs *ConsensusState) {
topN := cs.GetTopNCandidatorsByVersion(info.Version) topN := cs.GetTopNCandidatorsByVersion(info.Version)
if topN == nil || !cs.IsTopNRegisted(topN) { if topN == nil || !cs.IsTopNRegisted(topN) {
cands, err := cs.client.QueryCandidators() cands, err := cs.client.QueryCandidators()
if err != nil || cands == nil { if err != nil || cands == nil || len(cands) != int(dposDelegateNum) {
dposlog.Error("QueryCandidators failed", "now", now, "height", height, "HeightRegLimit", info.HeightRegLimit, "pubkey", strings.ToUpper(hex.EncodeToString(cs.privValidator.GetPubKey().Bytes()))) dposlog.Error("QueryCandidators failed", "now", now, "height", height, "HeightRegLimit", info.HeightRegLimit, "pubkey", strings.ToUpper(hex.EncodeToString(cs.privValidator.GetPubKey().Bytes())))
LastCheckRegTopNTime = now LastCheckRegTopNTime = now
return return
......
...@@ -12,6 +12,7 @@ import ( ...@@ -12,6 +12,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/common/crypto" "github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
...@@ -302,3 +303,46 @@ func TestSignTx(t *testing.T) { ...@@ -302,3 +303,46 @@ func TestSignTx(t *testing.T) {
remove(filename) remove(filename)
} }
func TestPubkeyAndAddress(t *testing.T) {
priv := "880D055D311827AB427031959F43238500D08F3EDF443EB903EC6D1A16A5783A"
pub := "026BD23C69F9A1D7A50F185514EDCA25AFD00DD2A92485CC1E8CDA3EDD284CA838"
addr := "22F4EA6D79D5AD0621900AB25A2BF01D3E288A7B"
testOneKey(priv, pub, addr, t)
priv = "2C1B7E0B53548209E6915D8C5EB3162E9AF43D051C1316784034C9D549DD5F61"
pub = "02DE57B5427CE38E7D9811AC7CAE51A6FCFD251BCAD88DBDCF636EC9F7441B6AB6"
addr = "F518C3964A84EF2E37FD3284B5C638D3C928C537"
testOneKey(priv, pub, addr, t)
priv = "2EA198F3F063F69B2DB860F41F8FAACB2EDEBCA1A74A75A5254B84E6F7D154B4"
pub = "036A818C01FA49F455E3779D073BD5FBE551A3E60BD447D8CFEE87F95037C29E59"
addr = "3FBB75FDC792E2618DA5D39B6C64B718AC0AAA5E"
testOneKey(priv, pub, addr, t)
priv = "EEDD4815535AD81B6191EF9883346702C5117C80F8D85EB36FBD77D6CC979C8F"
pub = "023D3E5DDAD1F20C28E333FF05C16539ECB95CFAA881B66ADFCB2A5198E5BC0EFE"
addr = "ACB850206A75F233DDBB56A4D7DA6A015C3FE2EB"
testOneKey(priv, pub, addr, t)
priv = "4EBB8B86F95DD7AB25CC27928D9AE04692DA9D7CA822CDA3FDE1DE778F01AFA7"
pub = "03DC5D8106E9E19EDFF91687CE55C97F3F6FA7584678313CF14925F76D0DB09055"
addr = "5A60D96560192EEE8EC9091FCC1AFC5511CA0BF0"
testOneKey(priv, pub, addr, t)
}
func testOneKey(priv, pub, addr string, t *testing.T) {
tmp, _ := hex.DecodeString(priv)
bPriv, _ := ConsensusCrypto.PrivKeyFromBytes(tmp)
fmt.Println(fmt.Sprintf("%x", bPriv))
bPub, _ := PubKeyFromString(pub)
assert.True(t, bytes.Equal(bPub.Bytes(), bPriv.PubKey().Bytes()))
bAddr := address.PubKeyToAddress(bPub.Bytes()).Hash160[:]
fmt.Println("addr:", addr)
fmt.Println(fmt.Sprintf("%x", bAddr))
assert.True(t, addr == fmt.Sprintf("%X", bAddr))
}
This diff is collapsed.
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package raft package raft
import ( import (
"context"
"fmt" "fmt"
"sync" "sync"
"time" "time"
...@@ -35,14 +36,15 @@ type Client struct { ...@@ -35,14 +36,15 @@ type Client struct {
errorC <-chan error errorC <-chan error
snapshotter *snap.Snapshotter snapshotter *snap.Snapshotter
validatorC <-chan bool validatorC <-chan bool
stopC chan<- struct{} ctx context.Context
cancel context.CancelFunc
once sync.Once once sync.Once
} }
// NewBlockstore create Raft Client // NewBlockstore create Raft Client
func NewBlockstore(cfg *types.Consensus, snapshotter *snap.Snapshotter, proposeC chan<- *types.Block, commitC <-chan *types.Block, errorC <-chan error, validatorC <-chan bool, stopC chan<- struct{}) *Client { func NewBlockstore(ctx context.Context, cfg *types.Consensus, snapshotter *snap.Snapshotter, proposeC chan<- *types.Block, commitC <-chan *types.Block, errorC <-chan error, validatorC <-chan bool, cancel context.CancelFunc) *Client {
c := drivers.NewBaseClient(cfg) c := drivers.NewBaseClient(cfg)
client := &Client{BaseClient: c, proposeC: proposeC, snapshotter: snapshotter, validatorC: validatorC, commitC: commitC, errorC: errorC, stopC: stopC} client := &Client{BaseClient: c, proposeC: proposeC, snapshotter: snapshotter, validatorC: validatorC, commitC: commitC, errorC: errorC, ctx: ctx, cancel: cancel}
c.SetChild(client) c.SetChild(client)
return client return client
} }
...@@ -97,12 +99,12 @@ func (client *Client) SetQueueClient(c queue.Client) { ...@@ -97,12 +99,12 @@ func (client *Client) SetQueueClient(c queue.Client) {
}) })
go client.EventLoop() go client.EventLoop()
go client.readCommits(client.commitC, client.errorC) go client.readCommits(client.commitC, client.errorC)
go client.pollingTask(c) go client.pollingTask()
} }
// Close method // Close method
func (client *Client) Close() { func (client *Client) Close() {
client.stopC <- struct{}{} client.cancel()
rlog.Info("consensus raft closed") rlog.Info("consensus raft closed")
} }
...@@ -125,73 +127,79 @@ func (client *Client) CreateBlock() { ...@@ -125,73 +127,79 @@ func (client *Client) CreateBlock() {
panic("This node encounter problem, exit.") panic("This node encounter problem, exit.")
} }
} }
ticker := time.NewTicker(50 * time.Millisecond)
defer ticker.Stop()
for { for {
//如果leader节点突然挂了,不是打包节点,需要退出 select {
if !isLeader { case <-client.ctx.Done():
rlog.Warn("I'm not the validator node anymore, exit.=============================") case <-ticker.C:
break //如果leader节点突然挂了,不是打包节点,需要退出
} if !mux.Load().(bool) {
infoflag++ rlog.Warn("I'm not the validator node anymore, exit.=============================")
if infoflag >= 3 { break
rlog.Info("==================This is Leader node=====================") }
infoflag = 0 infoflag++
} if infoflag >= 3 {
if issleep { rlog.Info("==================This is Leader node=====================")
time.Sleep(10 * time.Second) infoflag = 0
count++ }
} if issleep {
time.Sleep(10 * time.Second)
count++
}
if count >= 12 { if count >= 12 {
rlog.Info("Create an empty block") rlog.Info("Create an empty block")
block := client.GetCurrentBlock() block := client.GetCurrentBlock()
emptyBlock := &types.Block{} emptyBlock := &types.Block{}
emptyBlock.StateHash = block.StateHash emptyBlock.StateHash = block.StateHash
emptyBlock.ParentHash = block.Hash() emptyBlock.ParentHash = block.Hash()
emptyBlock.Height = block.Height + 1 emptyBlock.Height = block.Height + 1
emptyBlock.Txs = nil emptyBlock.Txs = nil
emptyBlock.TxHash = zeroHash[:] emptyBlock.TxHash = zeroHash[:]
emptyBlock.BlockTime = types.Now().Unix() emptyBlock.BlockTime = types.Now().Unix()
entry := emptyBlock entry := emptyBlock
client.propose(entry) client.propose(entry)
er := client.WriteBlock(block.StateHash, emptyBlock) er := client.WriteBlock(block.StateHash, emptyBlock)
if er != nil { if er != nil {
rlog.Error(fmt.Sprintf("********************err:%v", er.Error())) rlog.Error(fmt.Sprintf("********************err:%v", er.Error()))
continue
}
client.SetCurrentBlock(emptyBlock)
count = 0
}
lastBlock := client.GetCurrentBlock()
txs := client.RequestTx(int(types.GetP(lastBlock.Height+1).MaxTxNumber), nil)
if len(txs) == 0 {
issleep = true
continue continue
} }
client.SetCurrentBlock(emptyBlock) issleep = false
count = 0 count = 0
rlog.Debug("==================start create new block!=====================")
var newblock types.Block
newblock.ParentHash = lastBlock.Hash()
newblock.Height = lastBlock.Height + 1
client.AddTxsToBlock(&newblock, txs)
newblock.TxHash = merkle.CalcMerkleRoot(newblock.Txs)
newblock.BlockTime = types.Now().Unix()
if lastBlock.BlockTime >= newblock.BlockTime {
newblock.BlockTime = lastBlock.BlockTime + 1
}
blockEntry := newblock
client.propose(&blockEntry)
err := client.WriteBlock(lastBlock.StateHash, &newblock)
if err != nil {
issleep = true
rlog.Error(fmt.Sprintf("********************err:%v", err.Error()))
continue
}
time.Sleep(time.Second * time.Duration(writeBlockSeconds))
} }
lastBlock := client.GetCurrentBlock()
txs := client.RequestTx(int(types.GetP(lastBlock.Height+1).MaxTxNumber), nil)
if len(txs) == 0 {
issleep = true
continue
}
issleep = false
count = 0
rlog.Debug("==================start create new block!=====================")
var newblock types.Block
newblock.ParentHash = lastBlock.Hash()
newblock.Height = lastBlock.Height + 1
client.AddTxsToBlock(&newblock, txs)
newblock.TxHash = merkle.CalcMerkleRoot(newblock.Txs)
newblock.BlockTime = types.Now().Unix()
if lastBlock.BlockTime >= newblock.BlockTime {
newblock.BlockTime = lastBlock.BlockTime + 1
}
blockEntry := newblock
client.propose(&blockEntry)
err := client.WriteBlock(lastBlock.StateHash, &newblock)
if err != nil {
issleep = true
rlog.Error(fmt.Sprintf("********************err:%v", err.Error()))
continue
}
time.Sleep(time.Second * time.Duration(writeBlockSeconds))
} }
} }
...@@ -219,17 +227,21 @@ func (client *Client) readCommits(commitC <-chan *types.Block, errorC <-chan err ...@@ -219,17 +227,21 @@ func (client *Client) readCommits(commitC <-chan *types.Block, errorC <-chan err
if ok { if ok {
panic(err) panic(err)
} }
case <-client.ctx.Done():
return
} }
} }
} }
//轮询任务,去检测本机器是否为validator节点,如果是,则执行打包任务 //轮询任务,去检测本机器是否为validator节点,如果是,则执行打包任务
func (client *Client) pollingTask(c queue.Client) { func (client *Client) pollingTask() {
ticker := time.NewTicker(100 * time.Millisecond) ticker := time.NewTicker(100 * time.Millisecond)
defer ticker.Stop() defer ticker.Stop()
for { for {
select { select {
case <-client.ctx.Done():
return
case value, ok := <-client.validatorC: case value, ok := <-client.validatorC:
//各个节点Block只初始化一次 //各个节点Block只初始化一次
client.once.Do(func() { client.once.Do(func() {
...@@ -237,9 +249,14 @@ func (client *Client) pollingTask(c queue.Client) { ...@@ -237,9 +249,14 @@ func (client *Client) pollingTask(c queue.Client) {
}) })
if ok && !value { if ok && !value {
rlog.Debug("================I'm not the validator node!=============") rlog.Debug("================I'm not the validator node!=============")
isLeader = false leader := mux.Load().(bool)
} else if ok && !isLeader && value { if leader {
isLeader = false
mux.Store(isLeader)
}
} else if ok && !mux.Load().(bool) && value {
isLeader = true isLeader = true
mux.Store(isLeader)
go client.CreateBlock() go client.CreateBlock()
} else if !ok { } else if !ok {
break break
......
...@@ -36,8 +36,8 @@ enableTxQuickIndex=true ...@@ -36,8 +36,8 @@ enableTxQuickIndex=true
[p2p] [p2p]
seeds=["127.0.0.1:13802"] seeds=["127.0.0.1:13802"]
enable=true enable=false
isSeed=true isSeed=false
serverStart=true serverStart=true
innerSeedEnable=false innerSeedEnable=false
useGithub=false useGithub=false
...@@ -80,6 +80,7 @@ poolCacheSize=10240 ...@@ -80,6 +80,7 @@ poolCacheSize=10240
# 共识驱动名,支持solo/raft/ticket/tendermint/pbft # 共识驱动名,支持solo/raft/ticket/tendermint/pbft
name="raft" name="raft"
minerstart=false minerstart=false
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
[mver.consensus] [mver.consensus]
fundKeyAddr = "1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5" fundKeyAddr = "1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5"
...@@ -107,8 +108,8 @@ peersURL="http://127.0.0.1:9021" ...@@ -107,8 +108,8 @@ peersURL="http://127.0.0.1:9021"
# raft共识用到,指示raft集群中只读节点的IP(只同步日志,不参与raft共识) # raft共识用到,指示raft集群中只读节点的IP(只同步日志,不参与raft共识)
readOnlyPeersURL="" readOnlyPeersURL=""
addPeersURL="" addPeersURL=""
#raft共识用到,默认raft中多少条记录打包一个snapshot #raft共识用到,默认raft中多少条记录打包一个snapshot(这里为了测试调整小一点)
defaultSnapCount=1000 defaultSnapCount=2
#raft共识用到,默认raft中写区块时间间隔 #raft共识用到,默认raft中写区块时间间隔
writeBlockSeconds=1 writeBlockSeconds=1
#raft共识用到,默认raft中leader发送心跳包时间间隔 #raft共识用到,默认raft中leader发送心跳包时间间隔
...@@ -127,7 +128,7 @@ enableMVCC=false ...@@ -127,7 +128,7 @@ enableMVCC=false
[wallet] [wallet]
minFee=100000 minFee=100000
driver="leveldb" driver="memdb"
dbPath="wallet" dbPath="wallet"
dbCache=16 dbCache=16
signType="secp256k1" signType="secp256k1"
...@@ -135,6 +136,8 @@ signType="secp256k1" ...@@ -135,6 +136,8 @@ signType="secp256k1"
[wallet.sub.ticket] [wallet.sub.ticket]
minerdisable=false minerdisable=false
minerwhitelist=["*"] minerwhitelist=["*"]
minerWaitTime="1s"
[exec] [exec]
isFree=false isFree=false
...@@ -144,6 +147,9 @@ enableMVCC=false ...@@ -144,6 +147,9 @@ enableMVCC=false
alias=["token1:token","token2:token","token3:token"] alias=["token1:token","token2:token","token3:token"]
saveTokenTxList=false saveTokenTxList=false
[exec.sub.relay]
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
[exec.sub.cert] [exec.sub.cert]
# 是否启用证书验证和签名 # 是否启用证书验证和签名
enable=false enable=false
...@@ -151,3 +157,14 @@ enable=false ...@@ -151,3 +157,14 @@ enable=false
cryptoPath="authdir/crypto" cryptoPath="authdir/crypto"
# 带证书签名类型,支持"auth_ecdsa", "auth_sm2" # 带证书签名类型,支持"auth_ecdsa", "auth_sm2"
signType="auth_ecdsa" signType="auth_ecdsa"
[exec.sub.manage]
superManager=[
"1Bsg9j6gW83sShoee1fZAt9TkUjcrCgA9S",
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
"1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK"
]
[exec.sub.autonomy]
total="16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp"
useBalance=false
\ No newline at end of file
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
package raft package raft
import ( import (
"context"
"strings" "strings"
"sync/atomic"
log "github.com/33cn/chain33/common/log/log15" log "github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/queue" "github.com/33cn/chain33/queue"
...@@ -22,6 +24,7 @@ var ( ...@@ -22,6 +24,7 @@ var (
writeBlockSeconds int64 = 1 writeBlockSeconds int64 = 1
heartbeatTick = 1 heartbeatTick = 1
isLeader = false isLeader = false
mux atomic.Value
confChangeC chan raftpb.ConfChange confChangeC chan raftpb.ConfChange
) )
...@@ -39,6 +42,10 @@ type subConfig struct { ...@@ -39,6 +42,10 @@ type subConfig struct {
HeartbeatTick int32 `json:"heartbeatTick"` HeartbeatTick int32 `json:"heartbeatTick"`
} }
func init() {
mux.Store(isLeader)
}
// NewRaftCluster create raft cluster // NewRaftCluster create raft cluster
func NewRaftCluster(cfg *types.Consensus, sub []byte) queue.Module { func NewRaftCluster(cfg *types.Consensus, sub []byte) queue.Module {
rlog.Info("Start to create raft cluster") rlog.Info("Start to create raft cluster")
...@@ -70,10 +77,6 @@ func NewRaftCluster(cfg *types.Consensus, sub []byte) queue.Module { ...@@ -70,10 +77,6 @@ func NewRaftCluster(cfg *types.Consensus, sub []byte) queue.Module {
if subcfg.HeartbeatTick > 0 { if subcfg.HeartbeatTick > 0 {
heartbeatTick = int(subcfg.HeartbeatTick) heartbeatTick = int(subcfg.HeartbeatTick)
} }
// propose channel
proposeC := make(chan *types.Block)
confChangeC = make(chan raftpb.ConfChange)
var b *Client var b *Client
getSnapshot := func() ([]byte, error) { return b.getSnapshot() } getSnapshot := func() ([]byte, error) { return b.getSnapshot() }
// raft集群的建立,1. 初始化两条channel: propose channel用于客户端和raft底层交互, commit channel用于获取commit消息 // raft集群的建立,1. 初始化两条channel: propose channel用于客户端和raft底层交互, commit channel用于获取commit消息
...@@ -90,10 +93,15 @@ func NewRaftCluster(cfg *types.Consensus, sub []byte) queue.Module { ...@@ -90,10 +93,15 @@ func NewRaftCluster(cfg *types.Consensus, sub []byte) queue.Module {
if len(addPeers) == 1 && addPeers[0] == "" { if len(addPeers) == 1 && addPeers[0] == "" {
addPeers = []string{} addPeers = []string{}
} }
commitC, errorC, snapshotterReady, validatorC, stopC := NewRaftNode(int(subcfg.NodeID), subcfg.IsNewJoinNode, peers, readOnlyPeers, addPeers, getSnapshot, proposeC, confChangeC) //采用context来统一管理所有服务
ctx, stop := context.WithCancel(context.Background())
// propose channel
proposeC := make(chan *types.Block)
confChangeC = make(chan raftpb.ConfChange)
commitC, errorC, snapshotterReady, validatorC := NewRaftNode(ctx, int(subcfg.NodeID), subcfg.IsNewJoinNode, peers, readOnlyPeers, addPeers, getSnapshot, proposeC, confChangeC)
//启动raft删除节点操作监听 //启动raft删除节点操作监听
go serveHTTPRaftAPI(int(subcfg.RaftAPIPort), confChangeC, errorC) go serveHTTPRaftAPI(ctx, int(subcfg.RaftAPIPort), confChangeC, errorC)
// 监听commit channel,取block // 监听commit channel,取block
b = NewBlockstore(cfg, <-snapshotterReady, proposeC, commitC, errorC, validatorC, stopC) b = NewBlockstore(ctx, cfg, <-snapshotterReady, proposeC, commitC, errorC, validatorC, stop)
return b return b
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package raft package raft
import ( import (
"context"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"strconv" "strconv"
...@@ -66,8 +67,8 @@ func (h *httpRaftAPI) ServeHTTP(w http.ResponseWriter, r *http.Request) { ...@@ -66,8 +67,8 @@ func (h *httpRaftAPI) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
} }
func serveHTTPRaftAPI(port int, confChangeC chan<- raftpb.ConfChange, errorC <-chan error) { func serveHTTPRaftAPI(ctx context.Context, port int, confChangeC chan<- raftpb.ConfChange, errorC <-chan error) {
srv := http.Server{ srv := &http.Server{
Addr: "localhost:" + strconv.Itoa(port), Addr: "localhost:" + strconv.Itoa(port),
Handler: &httpRaftAPI{ Handler: &httpRaftAPI{
confChangeC: confChangeC, confChangeC: confChangeC,
...@@ -78,9 +79,11 @@ func serveHTTPRaftAPI(port int, confChangeC chan<- raftpb.ConfChange, errorC <-c ...@@ -78,9 +79,11 @@ func serveHTTPRaftAPI(port int, confChangeC chan<- raftpb.ConfChange, errorC <-c
rlog.Error(fmt.Sprintf("ListenAndServe have a err: (%v)", err.Error())) rlog.Error(fmt.Sprintf("ListenAndServe have a err: (%v)", err.Error()))
} }
}() }()
select {
// exit when raft goes down case <-ctx.Done():
if err, ok := <-errorC; ok { srv.Close()
case err := <-errorC:
srv.Close()
rlog.Error(fmt.Sprintf("the errorC chan receive a err (%v)\n", err.Error())) rlog.Error(fmt.Sprintf("the errorC chan receive a err (%v)\n", err.Error()))
} }
} }
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package raft package raft
import ( import (
"context"
"errors" "errors"
"net" "net"
"time" "time"
...@@ -13,16 +14,16 @@ import ( ...@@ -13,16 +14,16 @@ import (
// 设置TCP keep-alive超时,接收stopc // 设置TCP keep-alive超时,接收stopc
type stoppableListener struct { type stoppableListener struct {
*net.TCPListener *net.TCPListener
stopc <-chan struct{} ctx context.Context
} }
// 监听tcp连接 // 监听tcp连接
func newStoppableListener(addr string, stopc <-chan struct{}) (*stoppableListener, error) { func newStoppableListener(ctx context.Context, addr string) (*stoppableListener, error) {
ln, err := net.Listen("tcp", addr) ln, err := net.Listen("tcp", addr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &stoppableListener{ln.(*net.TCPListener), stopc}, nil return &stoppableListener{ln.(*net.TCPListener), ctx}, nil
} }
func (ln stoppableListener) Accept() (c net.Conn, err error) { func (ln stoppableListener) Accept() (c net.Conn, err error) {
...@@ -37,7 +38,7 @@ func (ln stoppableListener) Accept() (c net.Conn, err error) { ...@@ -37,7 +38,7 @@ func (ln stoppableListener) Accept() (c net.Conn, err error) {
connc <- tc connc <- tc
}() }()
select { select {
case <-ln.stopc: case <-ln.ctx.Done():
return nil, errors.New("server stopped") return nil, errors.New("server stopped")
case err := <-errc: case err := <-errc:
return nil, err return nil, err
......
...@@ -56,17 +56,18 @@ type raftNode struct { ...@@ -56,17 +56,18 @@ type raftNode struct {
snapCount uint64 snapCount uint64
transport *rafthttp.Transport transport *rafthttp.Transport
stopMu sync.RWMutex stopMu sync.RWMutex
stopc chan struct{} ctx context.Context
httpstopc chan struct{} //stopc chan struct{}
httpdonec chan struct{} //httpstopc chan struct{}
validatorC chan bool //httpdonec chan struct{}
validatorC chan bool
//用于判断该节点是否重启过 //用于判断该节点是否重启过
restartC chan struct{} restartC chan struct{}
} }
// NewRaftNode create raft node // NewRaftNode create raft node
func NewRaftNode(id int, join bool, peers []string, readOnlyPeers []string, addPeers []string, getSnapshot func() ([]byte, error), proposeC <-chan *types.Block, func NewRaftNode(ctx context.Context, id int, join bool, peers []string, readOnlyPeers []string, addPeers []string, getSnapshot func() ([]byte, error), proposeC <-chan *types.Block,
confChangeC <-chan raftpb.ConfChange) (<-chan *types.Block, <-chan error, <-chan *snap.Snapshotter, <-chan bool, chan<- struct{}) { confChangeC <-chan raftpb.ConfChange) (<-chan *types.Block, <-chan error, <-chan *snap.Snapshotter, <-chan bool) {
rlog.Info("Enter consensus raft") rlog.Info("Enter consensus raft")
// commit channel // commit channel
...@@ -86,16 +87,14 @@ func NewRaftNode(id int, join bool, peers []string, readOnlyPeers []string, addP ...@@ -86,16 +87,14 @@ func NewRaftNode(id int, join bool, peers []string, readOnlyPeers []string, addP
snapdir: fmt.Sprintf("chain33_raft-%d%ssnap", id, string(os.PathSeparator)), snapdir: fmt.Sprintf("chain33_raft-%d%ssnap", id, string(os.PathSeparator)),
getSnapshot: getSnapshot, getSnapshot: getSnapshot,
snapCount: defaultSnapCount, snapCount: defaultSnapCount,
stopc: make(chan struct{}),
httpstopc: make(chan struct{}),
httpdonec: make(chan struct{}),
validatorC: make(chan bool), validatorC: make(chan bool),
snapshotterReady: make(chan *snap.Snapshotter, 1), snapshotterReady: make(chan *snap.Snapshotter, 1),
restartC: make(chan struct{}, 1), restartC: make(chan struct{}, 1),
ctx: ctx,
} }
go rc.startRaft() go rc.startRaft()
return commitC, errorC, rc.snapshotterReady, rc.validatorC, rc.stopc return commitC, errorC, rc.snapshotterReady, rc.validatorC
} }
// 启动raft节点 // 启动raft节点
...@@ -184,22 +183,22 @@ func (rc *raftNode) serveRaft() { ...@@ -184,22 +183,22 @@ func (rc *raftNode) serveRaft() {
panic(err) panic(err)
} }
ln, err := newStoppableListener(nodeURL.Host, rc.httpstopc) ln, err := newStoppableListener(rc.ctx, nodeURL.Host)
if err != nil { if err != nil {
rlog.Error(fmt.Sprintf("raft: Failed to listen rafthttp (%v)", err.Error())) rlog.Error(fmt.Sprintf("raft: Failed to listen rafthttp (%v)", err.Error()))
panic(err) panic(err)
} }
raftSrv := &http.Server{Handler: rc.transport.Handler()}
err = (&http.Server{Handler: rc.transport.Handler()}).Serve(ln) err = raftSrv.Serve(ln)
if err != nil { if err != nil {
rlog.Error(fmt.Sprintf("raft: Failed to serve rafthttp (%v)", err.Error())) rlog.Error(fmt.Sprintf("raft: Failed to serve rafthttp (%v)", err.Error()))
} }
select { select {
case <-rc.httpstopc: case <-rc.ctx.Done():
raftSrv.Close()
default: default:
rlog.Error(fmt.Sprintf("raft: Failed to serve rafthttp (%v)", err.Error())) rlog.Error(fmt.Sprintf("raft: Failed to serve rafthttp (%v)", err.Error()))
} }
close(rc.httpdonec)
} }
func (rc *raftNode) serveChannels() { func (rc *raftNode) serveChannels() {
...@@ -246,9 +245,11 @@ func (rc *raftNode) serveChannels() { ...@@ -246,9 +245,11 @@ func (rc *raftNode) serveChannels() {
rlog.Error(fmt.Sprintf("rc.node.ProposeConfChange:%v", err.Error())) rlog.Error(fmt.Sprintf("rc.node.ProposeConfChange:%v", err.Error()))
} }
} }
case <-rc.ctx.Done():
rlog.Info("I have a exit message!")
return
} }
} }
close(rc.stopc)
}() }()
// 从Ready()中接收数据 // 从Ready()中接收数据
for { for {
...@@ -275,7 +276,7 @@ func (rc *raftNode) serveChannels() { ...@@ -275,7 +276,7 @@ func (rc *raftNode) serveChannels() {
rc.writeError(err) rc.writeError(err)
return return
case <-rc.stopc: case <-rc.ctx.Done():
rc.stop() rc.stop()
return return
} }
...@@ -283,9 +284,9 @@ func (rc *raftNode) serveChannels() { ...@@ -283,9 +284,9 @@ func (rc *raftNode) serveChannels() {
} }
func (rc *raftNode) updateValidator() { func (rc *raftNode) updateValidator() {
//TODO 这块监听后期需要根据场景进行优化? //TODO 这块监听后期需要根据场景进行优化?
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
//用于标记readOnlyPeers是否已经被添加到集群中了 //用于标记readOnlyPeers是否已经被添加到集群中了
flag := false flag := false
isRestart := false isRestart := false
...@@ -297,25 +298,31 @@ func (rc *raftNode) updateValidator() { ...@@ -297,25 +298,31 @@ func (rc *raftNode) updateValidator() {
case <-ticker.C: case <-ticker.C:
ticker.Stop() ticker.Stop()
} }
ticker = time.NewTicker(time.Second)
for { for {
time.Sleep(time.Second) select {
status := rc.Status() case <-rc.ctx.Done():
if status.Lead == raft.None { return
rlog.Debug(fmt.Sprintf("==============This is %s node!==============", status.RaftState.String())) case <-ticker.C:
continue status := rc.Status()
} else { if status.Lead == raft.None {
// 获取到leader ID,选主成功 rlog.Debug(fmt.Sprintf("==============This is %s node!==============", status.RaftState.String()))
if rc.id == int(status.Lead) { continue
//leader选举出来之后即可添加addReadOnlyPeers
if !flag && !isRestart {
go rc.addReadOnlyPeers()
}
rc.validatorC <- true
} else { } else {
rc.validatorC <- false // 获取到leader ID,选主成功
if rc.id == int(status.Lead) {
//leader选举出来之后即可添加addReadOnlyPeers
if !flag && !isRestart {
go rc.addReadOnlyPeers()
}
rc.validatorC <- true
} else {
rc.validatorC <- false
}
flag = true
} }
flag = true
} }
} }
} }
func (rc *raftNode) Status() raft.Status { func (rc *raftNode) Status() raft.Status {
...@@ -454,20 +461,18 @@ func (rc *raftNode) stop() { ...@@ -454,20 +461,18 @@ func (rc *raftNode) stop() {
rc.stopHTTP() rc.stopHTTP()
close(rc.commitC) close(rc.commitC)
close(rc.errorC) close(rc.errorC)
close(rc.stopc)
rc.node.Stop() rc.node.Stop()
} }
func (rc *raftNode) stopHTTP() { func (rc *raftNode) stopHTTP() {
rc.transport.Stop() rc.transport.Stop()
close(rc.httpstopc) //close(rc.httpstopc)
<-rc.httpdonec //<-rc.httpdonec
} }
func (rc *raftNode) writeError(err error) { func (rc *raftNode) writeError(err error) {
rc.stopHTTP() rc.stopHTTP()
close(rc.commitC) close(rc.commitC)
close(rc.stopc)
rc.errorC <- err rc.errorC <- err
close(rc.errorC) close(rc.errorC)
rc.node.Stop() rc.node.Stop()
...@@ -488,7 +493,7 @@ func (rc *raftNode) publishEntries(ents []raftpb.Entry) bool { ...@@ -488,7 +493,7 @@ func (rc *raftNode) publishEntries(ents []raftpb.Entry) bool {
} }
select { select {
case rc.commitC <- block: case rc.commitC <- block:
case <-rc.stopc: case <-rc.ctx.Done():
return false return false
} }
...@@ -521,7 +526,7 @@ func (rc *raftNode) publishEntries(ents []raftpb.Entry) bool { ...@@ -521,7 +526,7 @@ func (rc *raftNode) publishEntries(ents []raftpb.Entry) bool {
if ents[i].Index == rc.lastIndex { if ents[i].Index == rc.lastIndex {
select { select {
case rc.commitC <- nil: case rc.commitC <- nil:
case <-rc.stopc: case <-rc.ctx.Done():
return false return false
} }
} }
......
...@@ -5,177 +5,45 @@ ...@@ -5,177 +5,45 @@
package raft package raft
import ( import (
"encoding/binary"
"flag"
"fmt" "fmt"
"math/rand"
"os" "os"
"testing" "testing"
"time" "time"
"github.com/33cn/chain33/blockchain" //加载系统内置store, 不要依赖plugin
"github.com/33cn/chain33/common" _ "github.com/33cn/chain33/system/dapp/init"
"github.com/33cn/chain33/common/address" _ "github.com/33cn/chain33/system/mempool/init"
"github.com/33cn/chain33/common/crypto" _ "github.com/33cn/chain33/system/store/init"
"github.com/33cn/chain33/common/limits" "github.com/33cn/chain33/util"
"github.com/33cn/chain33/common/log" "github.com/33cn/chain33/util/testnode"
"github.com/33cn/chain33/executor"
"github.com/33cn/chain33/mempool"
"github.com/33cn/chain33/p2p"
"github.com/33cn/chain33/queue"
"github.com/33cn/chain33/store"
"github.com/33cn/chain33/types"
_ "github.com/33cn/chain33/system" _ "github.com/33cn/chain33/system"
_ "github.com/33cn/plugin/plugin/dapp/init" _ "github.com/33cn/plugin/plugin/dapp/init"
pty "github.com/33cn/plugin/plugin/dapp/norm/types"
_ "github.com/33cn/plugin/plugin/store/init" _ "github.com/33cn/plugin/plugin/store/init"
) )
var ( // 执行: go test -cover
random *rand.Rand func TestRaft(t *testing.T) {
txNumber = 10 mock33 := testnode.New("chain33.test.toml", nil)
loopCount = 10 defer mock33.Close()
) mock33.Listen()
t.Log(mock33.GetGenesisAddress())
func init() { time.Sleep(10 * time.Second)
err := limits.SetLimits() txs := util.GenNoneTxs(mock33.GetGenesisKey(), 10)
if err != nil { for i := 0; i < len(txs); i++ {
panic(err) mock33.GetAPI().SendTx(txs[i])
} }
random = rand.New(rand.NewSource(types.Now().UnixNano())) mock33.WaitHeight(1)
log.SetLogLevel("info") txs = util.GenNoneTxs(mock33.GetGenesisKey(), 10)
} for i := 0; i < len(txs); i++ {
func TestRaftPerf(t *testing.T) { mock33.GetAPI().SendTx(txs[i])
RaftPerf() }
fmt.Println("=======start clear test data!=======") mock33.WaitHeight(2)
clearTestData() clearTestData()
} }
func RaftPerf() {
q, chain, s, mem, exec, cs, p2p := initEnvRaft()
defer q.Close()
defer s.Close()
defer p2p.Close()
defer mem.Close()
defer exec.Close()
defer chain.Close()
defer cs.Close()
sendReplyList(q)
}
func initEnvRaft() (queue.Queue, *blockchain.BlockChain, queue.Module, queue.Module, *executor.Executor, queue.Module, queue.Module) {
var q = queue.New("channel")
flag.Parse()
cfg, sub := types.InitCfg("chain33.test.toml")
types.Init(cfg.Title, cfg)
s := store.New(cfg.Store, sub.Store)
s.SetQueueClient(q.Client())
chain := blockchain.New(cfg.BlockChain)
chain.SetQueueClient(q.Client())
exec := executor.New(cfg.Exec, sub.Exec)
exec.SetQueueClient(q.Client())
types.SetMinFee(0)
mem := mempool.New(cfg.Mempool, nil)
mem.SetQueueClient(q.Client())
cs := NewRaftCluster(cfg.Consensus, sub.Consensus["raft"])
cs.SetQueueClient(q.Client())
network := p2p.New(cfg.P2P)
network.SetQueueClient(q.Client())
return q, chain, s, mem, exec, cs, network
}
func generateKey(i, valI int) string {
key := make([]byte, valI)
binary.PutUvarint(key[:10], uint64(valI))
binary.PutUvarint(key[12:24], uint64(i))
if _, err := rand.Read(key[24:]); err != nil {
os.Exit(1)
}
return string(key)
}
func generateValue(i, valI int) string {
value := make([]byte, valI)
binary.PutUvarint(value[:16], uint64(i))
binary.PutUvarint(value[32:128], uint64(i))
if _, err := rand.Read(value[128:]); err != nil {
os.Exit(1)
}
return string(value)
}
func getprivkey(key string) crypto.PrivKey {
cr, err := crypto.New(types.GetSignName("", types.SECP256K1))
if err != nil {
panic(err)
}
bkey, err := common.FromHex(key)
if err != nil {
panic(err)
}
priv, err := cr.PrivKeyFromBytes(bkey)
if err != nil {
panic(err)
}
return priv
}
func sendReplyList(q queue.Queue) {
client := q.Client()
client.Sub("mempool")
var count int
for msg := range client.Recv() {
if msg.Ty == types.EventTxList {
count++
msg.Reply(client.NewMessage("consensus", types.EventReplyTxList,
&types.ReplyTxList{Txs: getReplyList(txNumber)}))
if count >= loopCount {
time.Sleep(4 * time.Second)
break
}
}
}
}
func prepareTxList() *types.Transaction {
var key string
var value string
var i int
key = generateKey(i, 32)
value = generateValue(i, 180)
nput := &pty.NormAction_Nput{Nput: &pty.NormPut{Key: []byte(key), Value: []byte(value)}}
action := &pty.NormAction{Value: nput, Ty: pty.NormActionPut}
tx := &types.Transaction{Execer: []byte("norm"), Payload: types.Encode(action), Fee: 0}
tx.To = address.ExecAddress("norm")
tx.Nonce = random.Int63()
tx.Sign(types.SECP256K1, getprivkey("CC38546E9E659D15E6B4893F0AB32A06D103931A8230B0BDE71459D2B27D6944"))
return tx
}
func getReplyList(n int) (txs []*types.Transaction) {
for i := 0; i < n; i++ {
txs = append(txs, prepareTxList())
}
return txs
}
func clearTestData() { func clearTestData() {
err := os.RemoveAll("datadir") err := os.RemoveAll("chain33_raft-1")
if err != nil {
fmt.Println("delete datadir have a err:", err.Error())
}
err = os.RemoveAll("chain33_raft-1")
if err != nil { if err != nil {
fmt.Println("delete chain33_raft dir have a err:", err.Error()) fmt.Println("delete chain33_raft dir have a err:", err.Error())
} }
......
#!/usr/bin/env bash #!/usr/bin/env bash
output_dir=${1}
strpwd=$(pwd) strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${output_dir}/$strapp"
[ ! -e "${OUT_DIR}" ] && mkdir -p "${OUT_DIR}"
# shellcheck disable=SC2086
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/* "${OUT_TESTDIR}"
...@@ -18,18 +18,16 @@ function debug_function() { ...@@ -18,18 +18,16 @@ function debug_function() {
} }
function rpc_test() { function rpc_test() {
chain33_RpcTestBegin autonomy
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
run_testcases run_testcases
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst autonomy "$CASE_ERR"
echo "=======autonomy rpc test error ==========="
exit 1
else
echo "====== autonomy rpc test pass ==========="
fi
} }
debug_function rpc_test "$1" debug_function rpc_test "$1"
...@@ -4,12 +4,6 @@ strpwd=$(pwd) ...@@ -4,12 +4,6 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/test-rpc.sh "${OUT_TESTDIR}"
...@@ -207,6 +207,7 @@ function run_testcases() { ...@@ -207,6 +207,7 @@ function run_testcases() {
} }
function main() { function main() {
chain33_RpcTestBegin blackwhite
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
...@@ -214,10 +215,8 @@ function main() { ...@@ -214,10 +215,8 @@ function main() {
run_testcases run_testcases
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst blackwhite "$CASE_ERR"
echo "paracross there some case error"
exit 1
fi
} }
function debug_function() { function debug_function() {
......
...@@ -3,13 +3,9 @@ ...@@ -3,13 +3,9 @@
strpwd=$(pwd) strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}" #FLAG=$2
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
chmod +x ./build/test-rpc.sh cp ./test/test-rpc.sh "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}"
...@@ -14,11 +14,6 @@ CASE_ERR="" ...@@ -14,11 +14,6 @@ CASE_ERR=""
#eventId="" #eventId=""
#txhash="" #txhash=""
#color
RED='\033[1;31m'
GRE='\033[1;32m'
NOC='\033[0m'
init() { init() {
ispara=$(echo '"'"${MAIN_HTTP}"'"' | jq '.|contains("8901")') ispara=$(echo '"'"${MAIN_HTTP}"'"' | jq '.|contains("8901")')
echo "ipara=$ispara" echo "ipara=$ispara"
...@@ -29,21 +24,14 @@ function run_test() { ...@@ -29,21 +24,14 @@ function run_test() {
} }
function main() { function main() {
chain33_RpcTestBegin dposvote
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
echo "=========== # dposvote rpc test start============="
run_test run_test
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst dposvote "$CASE_ERR"
echo -e "${RED}=============Dposvote Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Dposvote Rpc Test Pass==============${NOC}"
fi
echo "=========== # dposvote rpc test end============="
} }
main "$1" main "$1"
...@@ -640,7 +640,7 @@ func queryTopNByVersion(db dbm.KV, req *dty.TopNCandidatorsQuery) (types.Message ...@@ -640,7 +640,7 @@ func queryTopNByVersion(db dbm.KV, req *dty.TopNCandidatorsQuery) (types.Message
strVersion := fmt.Sprintf("%018d", req.Version) strVersion := fmt.Sprintf("%018d", req.Version)
data, err := db.Get(TopNKey(strVersion)) data, err := db.Get(TopNKey(strVersion))
if err != nil || data == nil { if err != nil || data == nil {
logger.Error("queryTopNByVersion have err:", "err", err.Error()) logger.Error("queryTopNByVersion have err", "err", err.Error())
return nil, err return nil, err
} }
var cands dty.TopNCandidators var cands dty.TopNCandidators
......
...@@ -3,13 +3,7 @@ ...@@ -3,13 +3,7 @@
strpwd=$(pwd) strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
chmod +x ./build/test-rpc.sh cp ./test/test-rpc.sh "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}"
...@@ -242,20 +242,16 @@ function run_test() { ...@@ -242,20 +242,16 @@ function run_test() {
} }
function main() { function main() {
chain33_RpcTestBegin evm
local ip=$1 local ip=$1
MAIN_HTTP=$ip MAIN_HTTP=$ip
echo "=========== # evm rpc test ============="
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
run_test "$MAIN_HTTP" run_test "$MAIN_HTTP"
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst evm "$CASE_ERR"
echo -e "${RED}=============Evm Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Evm Rpc Test Pass==============${NOC}"
fi
} }
chain33_debug_function main "$1" chain33_debug_function main "$1"
...@@ -4,16 +4,6 @@ strpwd=$(pwd) ...@@ -4,16 +4,6 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
PARACLI="${OUT_DIR}/chain33-para-cli"
PARANAME=para
SRC_CLI=github.com/33cn/plugin/cli
go build -v -o "${PARACLI}" -ldflags "-X ${SRC_CLI}/buildflags.ParaName=user.p.${PARANAME}. -X ${SRC_CLI}/buildflags.RPCAddr=http://localhost:8901" "${SRC_CLI}"
# shellcheck disable=SC2086
cp ./build/* "${OUT_DIR}"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/* "${OUT_TESTDIR}" cp ./test/* "${OUT_TESTDIR}"
...@@ -3,9 +3,6 @@ ...@@ -3,9 +3,6 @@
set -e set -e
set -o pipefail set -o pipefail
# shellcheck source=/dev/null
source ../dapp-test-common.sh
MAIN_HTTP="" MAIN_HTTP=""
GAME_ID="" GAME_ID=""
PASSWD="ABCD" PASSWD="ABCD"
...@@ -215,18 +212,13 @@ function run_test() { ...@@ -215,18 +212,13 @@ function run_test() {
function main() { function main() {
local ip=$1 local ip=$1
MAIN_HTTP=$ip MAIN_HTTP=$ip
echo "=========== # game rpc test =============" chain33_RpcTestBegin game
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
run_test "$MAIN_HTTP" run_test "$MAIN_HTTP"
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst game "$CASE_ERR"
echo -e "${RED}=============game Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============game Rpc Test Pass==============${NOC}"
fi
} }
chain33_debug_function main "$1" chain33_debug_function main "$1"
...@@ -3,13 +3,7 @@ ...@@ -3,13 +3,7 @@
strpwd=$(pwd) strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
chmod +x ./build/test-rpc.sh cp ./test/test-rpc.sh "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}"
...@@ -19,11 +19,6 @@ guess_exec="" ...@@ -19,11 +19,6 @@ guess_exec=""
eventId="" eventId=""
txhash="" txhash=""
#color
RED='\033[1;31m'
GRE='\033[1;32m'
NOC='\033[0m'
guess_game_start() { guess_game_start() {
echo "========== # guess start tx begin ==========" echo "========== # guess start tx begin =========="
tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"guess","actionName":"Start", "payload":{"topic":"WorldCup Final","options":"A:France;B:Claodia","category":"football","maxBetsOneTime":10000000000,"maxBetsNumber":100000000000,"devFeeFactor":5,"devFeeAddr":"1D6RFZNp2rh6QdbcZ1d7RWuBUz61We6SD7","platFeeFactor":5,"platFeeAddr":"1PHtChNt3UcfssR7v7trKSk3WJtAWjKjjX"}}]}' ${MAIN_HTTP} | jq -r ".result") tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"guess","actionName":"Start", "payload":{"topic":"WorldCup Final","options":"A:France;B:Claodia","category":"football","maxBetsOneTime":10000000000,"maxBetsNumber":100000000000,"devFeeFactor":5,"devFeeAddr":"1D6RFZNp2rh6QdbcZ1d7RWuBUz61We6SD7","platFeeFactor":5,"platFeeAddr":"1PHtChNt3UcfssR7v7trKSk3WJtAWjKjjX"}}]}' ${MAIN_HTTP} | jq -r ".result")
...@@ -139,9 +134,9 @@ init() { ...@@ -139,9 +134,9 @@ init() {
local main_ip=${MAIN_HTTP//8901/8801} local main_ip=${MAIN_HTTP//8901/8801}
#main chain import pri key #main chain import pri key
#1NrfEBfdFJUUqgbw5ZbHXhdew6NNQumYhM #1NrfEBfdFJUUqgbw5ZbHXhdew6NNQumYhM
chain33_ImportPrivkey "0xc889d2958843fc96d4bd3f578173137d37230e580d65e9074545c61e7e9c1932" "1NrfEBfdFJUUqgbw5ZbHXhdew6NNQumYhM" "guess1" "${main_ip}" chain33_ImportPrivkey "0xc889d2958843fc96d4bd3f578173137d37230e580d65e9074545c61e7e9c1932" "1NrfEBfdFJUUqgbw5ZbHXhdew6NNQumYhM" "guess11" "${main_ip}"
#17tRkBrccmFiVcLPXgEceRxDzJ2WaDZumN #17tRkBrccmFiVcLPXgEceRxDzJ2WaDZumN
chain33_ImportPrivkey "0xf10c79470dc74c229c4ee73b05d14c58322b771a6c749d27824f6a59bb6c2d73" "17tRkBrccmFiVcLPXgEceRxDzJ2WaDZumN" "guess2" "$main_ip" chain33_ImportPrivkey "0xf10c79470dc74c229c4ee73b05d14c58322b771a6c749d27824f6a59bb6c2d73" "17tRkBrccmFiVcLPXgEceRxDzJ2WaDZumN" "guess22" "$main_ip"
local guess1="1NrfEBfdFJUUqgbw5ZbHXhdew6NNQumYhM" local guess1="1NrfEBfdFJUUqgbw5ZbHXhdew6NNQumYhM"
local guess2="17tRkBrccmFiVcLPXgEceRxDzJ2WaDZumN" local guess2="17tRkBrccmFiVcLPXgEceRxDzJ2WaDZumN"
...@@ -161,8 +156,8 @@ init() { ...@@ -161,8 +156,8 @@ init() {
chain33_QueryBalance "${guess2}" "$main_ip" chain33_QueryBalance "${guess2}" "$main_ip"
local para_ip="${MAIN_HTTP}" local para_ip="${MAIN_HTTP}"
#para chain import pri key #para chain import pri key
chain33_ImportPrivkey "0xc889d2958843fc96d4bd3f578173137d37230e580d65e9074545c61e7e9c1932" "1NrfEBfdFJUUqgbw5ZbHXhdew6NNQumYhM" "guess1" "$para_ip" chain33_ImportPrivkey "0xc889d2958843fc96d4bd3f578173137d37230e580d65e9074545c61e7e9c1932" "1NrfEBfdFJUUqgbw5ZbHXhdew6NNQumYhM" "guess11" "$para_ip"
chain33_ImportPrivkey "0xf10c79470dc74c229c4ee73b05d14c58322b771a6c749d27824f6a59bb6c2d73" "17tRkBrccmFiVcLPXgEceRxDzJ2WaDZumN" "guess2" "$para_ip" chain33_ImportPrivkey "0xf10c79470dc74c229c4ee73b05d14c58322b771a6c749d27824f6a59bb6c2d73" "17tRkBrccmFiVcLPXgEceRxDzJ2WaDZumN" "guess22" "$para_ip"
chain33_applyCoins "$guess1" 12000000000 "${para_ip}" chain33_applyCoins "$guess1" 12000000000 "${para_ip}"
chain33_QueryBalance "${guess1}" "$para_ip" chain33_QueryBalance "${guess1}" "$para_ip"
...@@ -319,21 +314,14 @@ function run_test() { ...@@ -319,21 +314,14 @@ function run_test() {
} }
function main() { function main() {
chain33_RpcTestBegin guess
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
echo "=========== # guess rpc test start============="
run_test run_test
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst guess "$CASE_ERR"
echo -e "${RED}=============Guess Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Guess Rpc Test Pass==============${NOC}"
fi
echo "=========== # guess rpc test end============="
} }
chain33_debug_function main "$1" chain33_debug_function main "$1"
...@@ -132,7 +132,7 @@ func guessBet(cmd *cobra.Command, args []string) { ...@@ -132,7 +132,7 @@ func guessBet(cmd *cobra.Command, args []string) {
//GuessStopBetRawTxCmd 构造Guess合约的停止下注(stopBet)原始交易(未签名)的命令行 //GuessStopBetRawTxCmd 构造Guess合约的停止下注(stopBet)原始交易(未签名)的命令行
func GuessStopBetRawTxCmd() *cobra.Command { func GuessStopBetRawTxCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "stop bet", Use: "stop",
Short: "stop bet for a guess game", Short: "stop bet for a guess game",
Run: guessStopBet, Run: guessStopBet,
} }
...@@ -143,7 +143,6 @@ func GuessStopBetRawTxCmd() *cobra.Command { ...@@ -143,7 +143,6 @@ func GuessStopBetRawTxCmd() *cobra.Command {
func addGuessStopBetFlags(cmd *cobra.Command) { func addGuessStopBetFlags(cmd *cobra.Command) {
cmd.Flags().StringP("gameId", "g", "", "game ID") cmd.Flags().StringP("gameId", "g", "", "game ID")
cmd.MarkFlagRequired("gameId") cmd.MarkFlagRequired("gameId")
cmd.Flags().Float64P("fee", "f", 0.01, "tx fee")
} }
func guessStopBet(cmd *cobra.Command, args []string) { func guessStopBet(cmd *cobra.Command, args []string) {
...@@ -266,11 +265,6 @@ func guessQuery(cmd *cobra.Command, args []string) { ...@@ -266,11 +265,6 @@ func guessQuery(cmd *cobra.Command, args []string) {
category, _ := cmd.Flags().GetString("category") category, _ := cmd.Flags().GetString("category")
primary, _ := cmd.Flags().GetString("primary") primary, _ := cmd.Flags().GetString("primary")
//var primaryKey []byte
//if len(primary) > 0 {
// primaryKey = []byte(primary)
//}
var params rpctypes.Query4Jrpc var params rpctypes.Query4Jrpc
params.Execer = gty.GuessX params.Execer = gty.GuessX
......
This diff is collapsed.
...@@ -257,7 +257,7 @@ func (action *Action) getReceiptLog(game *gty.GuessGame, statusChange bool, bet ...@@ -257,7 +257,7 @@ func (action *Action) getReceiptLog(game *gty.GuessGame, statusChange bool, bet
func (action *Action) readGame(id string) (*gty.GuessGame, error) { func (action *Action) readGame(id string) (*gty.GuessGame, error) {
data, err := action.db.Get(Key(id)) data, err := action.db.Get(Key(id))
if err != nil { if err != nil {
logger.Error("readGame have err:", err.Error()) logger.Error("readGame have err", "err", err.Error())
return nil, err return nil, err
} }
var game gty.GuessGame var game gty.GuessGame
......
This diff is collapsed.
...@@ -6,24 +6,19 @@ package types ...@@ -6,24 +6,19 @@ package types
//game action ty //game action ty
const ( const (
PBGameActionStart = iota + 1 GuessGameActionStart = 5
PBGameActionContinue GuessGameActionBet = 6
PBGameActionQuit GuessGameActionStopBet = 7
PBGameActionQuery GuessGameActionAbort = 8
GuessGameActionPublish = 9
GuessGameActionStart = iota + 1 GuessGameActionQuery = 10
GuessGameActionBet
GuessGameActionStopBet GuessGameStatusStart = 11
GuessGameActionAbort GuessGameStatusBet = 12
GuessGameActionPublish GuessGameStatusStopBet = 13
GuessGameActionQuery GuessGameStatusAbort = 14
GuessGameStatusPublish = 15
GuessGameStatusStart = iota + 1 GuessGameStatusTimeOut = 16
GuessGameStatusBet
GuessGameStatusStopBet
GuessGameStatusAbort
GuessGameStatusPublish
GuessGameStatusTimeOut
) )
//game log ty //game log ty
......
...@@ -3,13 +3,7 @@ ...@@ -3,13 +3,7 @@
strpwd=$(pwd) strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
chmod +x ./build/test-rpc.sh cp ./test/test-rpc.sh "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}"
...@@ -141,18 +141,13 @@ function run_test() { ...@@ -141,18 +141,13 @@ function run_test() {
function main() { function main() {
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "=========== # Hashlock rpc test =============" chain33_RpcTestBegin hashlock
echo "ip=$MAIN_HTTP" echo "ip=$MAIN_HTTP"
init init
run_test run_test
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst hashlock "$CASE_ERR"
echo -e "${RED}=============Hashlock Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Hashlock Rpc Test Pass==============${NOC}"
fi
} }
chain33_debug_function main "$1" chain33_debug_function main "$1"
#!/usr/bin/env bash #!/usr/bin/env bash
output_dir=${1}
strpwd=$(pwd) strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${output_dir}/$strapp"
[ ! -e "${OUT_DIR}" ] && mkdir -p "${OUT_DIR}"
# shellcheck disable=SC2086
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/test-rpc.sh "${OUT_TESTDIR}"
cp ../executor/test.js "${OUT_TESTDIR}" cp ../executor/test.js "${OUT_TESTDIR}"
...@@ -94,25 +94,16 @@ function run_testcases() { ...@@ -94,25 +94,16 @@ function run_testcases() {
queryJS queryJS
} }
function debug_function() {
set -x
eval "$@"
set +x
}
function rpc_test() { function rpc_test() {
chain33_RpcTestBegin js
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
run_testcases run_testcases
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst js "$CASE_ERR"
echo "=======js rpc test error ==========="
exit 1
else
echo "====== js rpc test pass ==========="
fi
} }
rpc_test "$1" chain33_debug_function rpc_test "$1"
...@@ -4,12 +4,6 @@ strpwd=$(pwd) ...@@ -4,12 +4,6 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/test-rpc.sh "${OUT_TESTDIR}"
...@@ -315,17 +315,11 @@ function main() { ...@@ -315,17 +315,11 @@ function main() {
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
echo "=========== # lottery rpc test start=============" chain33_RpcTestBegin lottery
init init
run_testcases run_testcases
if [[ -n $CASE_ERR ]]; then chain33_RpcTestRst lottery "$CASE_ERR"
echo -e "${RED}=============Lottery Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Lottery Rpc Test Pass==============${NOC}"
fi
echo "=========== # lottery rpc test end============="
} }
chain33_debug_function main "$1" chain33_debug_function main "$1"
...@@ -4,12 +4,6 @@ strpwd=$(pwd) ...@@ -4,12 +4,6 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/test-rpc.sh "${OUT_TESTDIR}"
...@@ -8,11 +8,6 @@ MAIN_HTTP="" ...@@ -8,11 +8,6 @@ MAIN_HTTP=""
# shellcheck source=/dev/null # shellcheck source=/dev/null
source ../dapp-test-common.sh source ../dapp-test-common.sh
#color
RED='\033[1;31m'
GRE='\033[1;32m'
NOC='\033[0m'
Symbol="BTY" Symbol="BTY"
Asset="coins" Asset="coins"
#PrivKeyA="0x06c0fa653c719275d1baa365c7bc0b9306447287499a715b541b930482eaa504" #PrivKeyA="0x06c0fa653c719275d1baa365c7bc0b9306447287499a715b541b930482eaa504"
...@@ -250,21 +245,14 @@ function run_test() { ...@@ -250,21 +245,14 @@ function run_test() {
} }
function main() { function main() {
chain33_RpcTestBegin multisi
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
echo "=========== # multisi rpc test start============="
run_test run_test
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst multisi "$CASE_ERR"
echo -e "${RED}=============multisi Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============multisi Rpc Test Pass==============${NOC}"
fi
echo "=========== # multisi rpc test end============="
} }
main "$1" main "$1"
...@@ -3,13 +3,7 @@ ...@@ -3,13 +3,7 @@
strpwd=$(pwd) strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
chmod +x ./build/test-rpc.sh cp ./test/test-rpc.sh "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}"
...@@ -138,16 +138,10 @@ function main() { ...@@ -138,16 +138,10 @@ function main() {
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
echo "=========== # oracle rpc test start=============" chain33_RpcTestBegin oracle
run_test run_test
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst oracle "$CASE_ERR"
echo -e "${RED}=============Oracle Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Oracle Rpc Test Pass==============${NOC}"
fi
echo "=========== # oracle rpc test end============="
} }
main "$1" main "$1"
...@@ -372,7 +372,7 @@ function run_testcases() { ...@@ -372,7 +372,7 @@ function run_testcases() {
} }
function main() { function main() {
chain33_RpcTestBegin paracross
UNIT_HTTP=$1 UNIT_HTTP=$1
IS_PARA=$(echo '"'"${UNIT_HTTP}"'"' | jq '.|contains("8901")') IS_PARA=$(echo '"'"${UNIT_HTTP}"'"' | jq '.|contains("8901")')
...@@ -398,10 +398,7 @@ function main() { ...@@ -398,10 +398,7 @@ function main() {
fi fi
fi fi
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst paracross "$CASE_ERR"
echo "paracross there some case errors"
exit 1
fi
} }
chain33_debug_function main "$1" "$2" "$3" "$4" chain33_debug_function main "$1" "$2" "$3" "$4"
......
...@@ -4,12 +4,6 @@ strpwd=$(pwd) ...@@ -4,12 +4,6 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/test-rpc.sh "${OUT_TESTDIR}"
...@@ -159,19 +159,14 @@ function run_test() { ...@@ -159,19 +159,14 @@ function run_test() {
} }
function main() { function main() {
chain33_RpcTestBegin pokerbull
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "=========== # pokerbull rpc test ============="
echo "ip=$MAIN_HTTP" echo "ip=$MAIN_HTTP"
init init
run_test run_test
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst pokerbull "$CASE_ERR"
echo -e "${RED}=============Pokerbull Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Pokerbull Rpc Test Pass==============${NOC}"
fi
} }
chain33_debug_function main "$1" chain33_debug_function main "$1"
package executor
import (
"testing"
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/common/crypto"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/system/dapp"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/util"
pkt "github.com/33cn/plugin/plugin/dapp/pokerbull/types"
"github.com/stretchr/testify/assert"
)
type execEnv struct {
blockTime int64
blockHeight int64
difficulty uint64
}
var (
PrivKeyA = "0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b" // 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4
PrivKeyB = "0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4" // 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR
Nodes = [][]byte{
[]byte("1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4"),
[]byte("1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR"),
}
)
func TestPokerbull(t *testing.T) {
types.SetTitleOnlyForTest("chain33")
total := 1000 * types.Coin
accountA := types.Account{
Balance: total,
Frozen: 0,
Addr: string(Nodes[0]),
}
accountB := types.Account{
Balance: total,
Frozen: 0,
Addr: string(Nodes[1]),
}
execAddr := dapp.ExecAddress(pkt.PokerBullX)
stateDB, _ := dbm.NewGoMemDB("1", "2", 100)
_, _, kvdb := util.CreateTestDB()
accA := account.NewCoinsAccount()
accA.SetDB(stateDB)
accA.SaveExecAccount(execAddr, &accountA)
accB := account.NewCoinsAccount()
accB.SetDB(stateDB)
accB.SaveExecAccount(execAddr, &accountB)
env := execEnv{
10,
types.GetDappFork(pkt.PokerBullX, "Enable"),
1539918074,
}
// start game
p1 := &pkt.PBGameStart{
Value: 5 * types.Coin,
PlayerNum: 2,
}
createTx, err := types.CallCreateTransaction(pkt.PokerBullX, "Start", p1)
if err != nil {
t.Error("RPC_Default_Process", "err", err)
}
createTx.Execer = pkt.ExecerPokerBull
createTx, err = signTx(createTx, PrivKeyA)
if err != nil {
t.Error("RPC_Default_Process sign", "err", err)
}
exec := newPBGame()
exec.SetStateDB(stateDB)
assert.Equal(t, exec.GetCoinsAccount().LoadExecAccount(string(Nodes[0]), execAddr).GetBalance(), total)
exec.SetLocalDB(kvdb)
exec.SetEnv(env.blockHeight, env.blockTime, env.difficulty)
receipt, err := exec.Exec(createTx, int(1))
assert.Nil(t, err)
assert.NotNil(t, receipt)
t.Log(receipt)
for _, kv := range receipt.KV {
stateDB.Set(kv.Key, kv.Value)
}
receiptData := &types.ReceiptData{Ty: receipt.Ty, Logs: receipt.Logs}
set, err := exec.ExecLocal(createTx, receiptData, int(1))
assert.Nil(t, err)
assert.NotNil(t, set)
for _, kv := range set.KV {
kvdb.Set(kv.Key, kv.Value)
}
gameID := createTx.Hash()
// start game p2
createTx, err = types.CallCreateTransaction(pkt.PokerBullX, "Start", p1)
if err != nil {
t.Error("RPC_Default_Process", "err", err)
}
createTx.Execer = pkt.ExecerPokerBull
createTx, err = signTx(createTx, PrivKeyB)
if err != nil {
t.Error("RPC_Default_Process sign", "err", err)
}
exec.SetEnv(env.blockHeight+1, env.blockTime+1, env.difficulty)
receipt, err = exec.Exec(createTx, int(1))
assert.Nil(t, err)
assert.NotNil(t, receipt)
t.Log(receipt)
for _, kv := range receipt.KV {
stateDB.Set(kv.Key, kv.Value)
}
receiptData = &types.ReceiptData{Ty: receipt.Ty, Logs: receipt.Logs}
set, err = exec.ExecLocal(createTx, receiptData, int(1))
assert.Nil(t, err)
assert.NotNil(t, set)
for _, kv := range set.KV {
kvdb.Set(kv.Key, kv.Value)
}
// continue game
p2 := &pkt.PBGameContinue{
GameId: common.ToHex(gameID),
}
createTx, err = types.CallCreateTransaction(pkt.PokerBullX, "Continue", p2)
if err != nil {
t.Error("RPC_Default_Process", "err", err)
}
createTx.Execer = pkt.ExecerPokerBull
createTx, err = signTx(createTx, PrivKeyA)
if err != nil {
t.Error("RPC_Default_Process sign", "err", err)
}
exec.SetEnv(env.blockHeight+1, env.blockTime+1, env.difficulty)
receipt, err = exec.Exec(createTx, int(1))
assert.Nil(t, err)
assert.NotNil(t, receipt)
t.Log(receipt)
for _, kv := range receipt.KV {
stateDB.Set(kv.Key, kv.Value)
}
receiptData = &types.ReceiptData{Ty: receipt.Ty, Logs: receipt.Logs}
set, err = exec.ExecLocal(createTx, receiptData, int(1))
assert.Nil(t, err)
assert.NotNil(t, set)
for _, kv := range set.KV {
kvdb.Set(kv.Key, kv.Value)
}
// quit game
p3 := &pkt.PBGameQuit{
GameId: common.ToHex(gameID),
}
createTx, err = types.CallCreateTransaction(pkt.PokerBullX, "Quit", p3)
if err != nil {
t.Error("RPC_Default_Process", "err", err)
}
createTx.Execer = pkt.ExecerPokerBull
createTx, err = signTx(createTx, PrivKeyA)
if err != nil {
t.Error("RPC_Default_Process sign", "err", err)
}
exec.SetEnv(env.blockHeight+2, env.blockTime+2, env.difficulty)
receipt, err = exec.Exec(createTx, int(1))
assert.Nil(t, err)
assert.NotNil(t, receipt)
for _, kv := range receipt.KV {
stateDB.Set(kv.Key, kv.Value)
}
receiptData = &types.ReceiptData{Ty: receipt.Ty, Logs: receipt.Logs}
set, err = exec.ExecLocal(createTx, receiptData, int(1))
assert.Nil(t, err)
assert.NotNil(t, set)
for _, kv := range set.KV {
kvdb.Set(kv.Key, kv.Value)
}
// query
res, err := exec.Query(pkt.FuncNameQueryGameByID, types.Encode(&pkt.QueryPBGameInfo{GameId: common.ToHex(gameID)}))
assert.Nil(t, err)
assert.NotNil(t, res)
res, err = exec.Query(pkt.FuncNameQueryGameByAddr, types.Encode(&pkt.QueryPBGameInfo{Addr: string(Nodes[0])}))
assert.Nil(t, err)
assert.NotNil(t, res)
res, err = exec.Query(pkt.FuncNameQueryGameByStatus, types.Encode(&pkt.QueryPBGameInfo{Status: pkt.PBGameActionQuit}))
assert.Nil(t, err)
assert.NotNil(t, res)
res, err = exec.Query(pkt.FuncNameQueryGameByRound, types.Encode(&pkt.QueryPBGameByRound{GameId: common.ToHex(gameID), Round: int32(1)}))
assert.Nil(t, err)
assert.NotNil(t, res)
var gameIDsS []string
gameIDsS = append(gameIDsS, common.ToHex(gameID))
res, err = exec.Query(pkt.FuncNameQueryGameListByIDs, types.Encode(&pkt.QueryPBGameInfos{GameIds: gameIDsS}))
assert.Nil(t, err)
assert.NotNil(t, res)
}
func signTx(tx *types.Transaction, hexPrivKey string) (*types.Transaction, error) {
signType := types.SECP256K1
c, err := crypto.New(types.GetSignName(pkt.PokerBullX, signType))
if err != nil {
return tx, err
}
bytes, err := common.FromHex(hexPrivKey[:])
if err != nil {
return tx, err
}
privKey, err := c.PrivKeyFromBytes(bytes)
if err != nil {
return tx, err
}
tx.Sign(int32(signType), privKey)
return tx, nil
}
...@@ -41,7 +41,9 @@ func TestJRPCChannel(t *testing.T) { ...@@ -41,7 +41,9 @@ func TestJRPCChannel(t *testing.T) {
{fn: testStartRawTxCmd}, {fn: testStartRawTxCmd},
{fn: testContinueRawTxCmd}, {fn: testContinueRawTxCmd},
{fn: testQuitRawTxCmd}, {fn: testQuitRawTxCmd},
{fn: testPlayRawTxCmd},
} }
for _, testCase := range testCases { for _, testCase := range testCases {
err := testCase.fn(t, jrpcClient) err := testCase.fn(t, jrpcClient)
assert.Nil(t, err) assert.Nil(t, err)
...@@ -93,6 +95,17 @@ func testContinueRawTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error { ...@@ -93,6 +95,17 @@ func testContinueRawTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
return jrpc.Call("Chain33.CreateTransaction", params, &res) return jrpc.Call("Chain33.CreateTransaction", params, &res)
} }
func testPlayRawTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
payload := &pty.PBGamePlay{GameId: "123", Round: 1, Value: 5, Address: []string{"a", "b"}}
params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pty.PokerBullX),
ActionName: pty.CreatePlayTx,
Payload: types.MustPBToJSON(payload),
}
var res string
return jrpc.Call("Chain33.CreateTransaction", params, &res)
}
func testQuitRawTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error { func testQuitRawTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
payload := &pty.PBGameQuit{GameId: "123"} payload := &pty.PBGameQuit{GameId: "123"}
params := &rpctypes.CreateTxIn{ params := &rpctypes.CreateTxIn{
......
...@@ -4,12 +4,6 @@ strpwd=$(pwd) ...@@ -4,12 +4,6 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/test-rpc.sh "${OUT_TESTDIR}"
...@@ -3,23 +3,10 @@ ...@@ -3,23 +3,10 @@
set -e set -e
set -o pipefail set -o pipefail
MAIN_HTTP="" # shellcheck source=/dev/null
CASE_ERR="" source ../dapp-test-common.sh
#color
RED='\033[1;31m'
GRE='\033[1;32m'
NOC='\033[0m'
echo_rst() {
if [ "$2" == true ]; then
echo -e "${GRE}$1 ok${NOC}"
else
echo -e "${RED}$1 fail${NOC}"
CASE_ERR="FAIL"
fi
} MAIN_HTTP=""
privacy_CreateRawTransaction() { privacy_CreateRawTransaction() {
...@@ -29,7 +16,8 @@ privacy_CreateRawTransaction() { ...@@ -29,7 +16,8 @@ privacy_CreateRawTransaction() {
resp=$(curl -ksd "{$req}" "$ip") resp=$(curl -ksd "{$req}" "$ip")
echo "#response: $resp" echo "#response: $resp"
ok=$(jq '.error|not' <<<"$resp") ok=$(jq '.error|not' <<<"$resp")
echo_rst "$FUNCNAME" "$ok" [ "$ok" == true ]
echo_rst "$FUNCNAME" "$?"
} }
privacy_GetPrivacyTxByAddr() { privacy_GetPrivacyTxByAddr() {
...@@ -40,8 +28,8 @@ privacy_GetPrivacyTxByAddr() { ...@@ -40,8 +28,8 @@ privacy_GetPrivacyTxByAddr() {
resp=$(curl -ksd "{$req}" "$ip") resp=$(curl -ksd "{$req}" "$ip")
echo "#response: $resp" echo "#response: $resp"
ok=$(jq '.error|not' <<<"$resp") ok=$(jq '.error|not' <<<"$resp")
[ "$ok" == true ]
echo_rst "$FUNCNAME" "$ok" echo_rst "$FUNCNAME" "$?"
} }
privacy_ShowPrivacyKey() { privacy_ShowPrivacyKey() {
...@@ -52,8 +40,8 @@ privacy_ShowPrivacyKey() { ...@@ -52,8 +40,8 @@ privacy_ShowPrivacyKey() {
resp=$(curl -ksd "{$req}" "$ip") resp=$(curl -ksd "{$req}" "$ip")
echo "#response: $resp" echo "#response: $resp"
ok=$(jq '(.error|not) and .result.showSuccessful and (.result.pubkeypair=="0a9d212b2505aefaa8da370319088bbccfac097b007f52ed71d8133456c8185823c8eac43c5e937953d7b6c8e68b0db1f4f03df4946a29f524875118960a35fb")' <<<"$resp") ok=$(jq '(.error|not) and .result.showSuccessful and (.result.pubkeypair=="0a9d212b2505aefaa8da370319088bbccfac097b007f52ed71d8133456c8185823c8eac43c5e937953d7b6c8e68b0db1f4f03df4946a29f524875118960a35fb")' <<<"$resp")
[ "$ok" == true ]
echo_rst "$FUNCNAME" "$ok" echo_rst "$FUNCNAME" "$?"
} }
privacy_ShowPrivacyAccountInfo() { privacy_ShowPrivacyAccountInfo() {
...@@ -64,8 +52,8 @@ privacy_ShowPrivacyAccountInfo() { ...@@ -64,8 +52,8 @@ privacy_ShowPrivacyAccountInfo() {
resp=$(curl -ksd "{$req}" "$ip") resp=$(curl -ksd "{$req}" "$ip")
echo "#response: $resp" echo "#response: $resp"
ok=$(jq '(.error|not) and (.result|[has("utxos", "ftxos", "displaymode"), true] | unique | length == 1)' <<<"$resp") ok=$(jq '(.error|not) and (.result|[has("utxos", "ftxos", "displaymode"), true] | unique | length == 1)' <<<"$resp")
[ "$ok" == true ]
echo_rst "$FUNCNAME" "$ok" echo_rst "$FUNCNAME" "$?"
} }
privacy_ShowPrivacyAccountSpend() { privacy_ShowPrivacyAccountSpend() {
...@@ -76,8 +64,8 @@ privacy_ShowPrivacyAccountSpend() { ...@@ -76,8 +64,8 @@ privacy_ShowPrivacyAccountSpend() {
resp=$(curl -ksd "{$req}" "$ip") resp=$(curl -ksd "{$req}" "$ip")
echo "#response: $resp" echo "#response: $resp"
ok=$(jq '(.error|not) and .result.utxoHaveTxHashs' <<<"$resp") ok=$(jq '(.error|not) and .result.utxoHaveTxHashs' <<<"$resp")
[ "$ok" == true ]
echo_rst "$FUNCNAME" "$ok" echo_rst "$FUNCNAME" "$?"
} }
privacy_RescanUtxos() { privacy_RescanUtxos() {
...@@ -88,8 +76,8 @@ privacy_RescanUtxos() { ...@@ -88,8 +76,8 @@ privacy_RescanUtxos() {
resp=$(curl -ksd "{$req}" "$ip") resp=$(curl -ksd "{$req}" "$ip")
echo "#response: $resp" echo "#response: $resp"
ok=$(jq '(.error|not) and (.result|[has("flag", "repRescanResults"), true] | unique | length == 1)' <<<"$resp") ok=$(jq '(.error|not) and (.result|[has("flag", "repRescanResults"), true] | unique | length == 1)' <<<"$resp")
[ "$ok" == true ]
echo_rst "$FUNCNAME" "$ok" echo_rst "$FUNCNAME" "$?"
} }
privacy_EnablePrivacy() { privacy_EnablePrivacy() {
...@@ -100,7 +88,8 @@ privacy_EnablePrivacy() { ...@@ -100,7 +88,8 @@ privacy_EnablePrivacy() {
resp=$(curl -ksd "{$req}" "$ip") resp=$(curl -ksd "{$req}" "$ip")
echo "#response: $resp" echo "#response: $resp"
ok=$(jq '(.error|not) and .result.results[0].IsOK' <<<"$resp") ok=$(jq '(.error|not) and .result.results[0].IsOK' <<<"$resp")
echo_rst "$FUNCNAME" "$ok" [ "$ok" == true ]
echo_rst "$FUNCNAME" "$?"
} }
function run_test() { function run_test() {
...@@ -116,17 +105,12 @@ function run_test() { ...@@ -116,17 +105,12 @@ function run_test() {
} }
function main() { function main() {
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "=========== # privacy rpc test =============" chain33_RpcTestBegin privacy
echo "ip=$MAIN_HTTP" echo "ip=$MAIN_HTTP"
run_test "$MAIN_HTTP" run_test "$MAIN_HTTP"
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst privacy "$CASE_ERR"
echo -e "${RED}=============Privacy Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Prviacy Rpc Test Pass==============${NOC}"
fi
} }
main "$1" main "$1"
...@@ -242,18 +242,14 @@ function run_testcases() { ...@@ -242,18 +242,14 @@ function run_testcases() {
} }
function rpc_test() { function rpc_test() {
chain33_RpcTestBegin Relay
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
run_testcases run_testcases
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst Relay "$CASE_ERR"
echo -e "${RED}=============Relay Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Relay Rpc Test Pass==============${NOC}"
fi
} }
chain33_debug_function rpc_test "$1" chain33_debug_function rpc_test "$1"
...@@ -4,12 +4,6 @@ strpwd=$(pwd) ...@@ -4,12 +4,6 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/test-rpc.sh "${OUT_TESTDIR}"
...@@ -245,18 +245,13 @@ function run_test() { ...@@ -245,18 +245,13 @@ function run_test() {
function main() { function main() {
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "=========== # retrieve rpc test =============" chain33_RpcTestBegin retrieve
echo "ip=$MAIN_HTTP" echo "ip=$MAIN_HTTP"
init init
run_test run_test
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst retrieve "$CASE_ERR"
echo -e "${RED}=============retrieve Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============retrieve Rpc Test Pass==============${NOC}"
fi
} }
set -x set -x
......
...@@ -4,12 +4,6 @@ strpwd=$(pwd) ...@@ -4,12 +4,6 @@ strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/test-rpc.sh "${OUT_TESTDIR}"
...@@ -149,11 +149,10 @@ function run_testcases() { ...@@ -149,11 +149,10 @@ function run_testcases() {
} }
function main() { function main() {
chain33_RpcTestBegin Ticket
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
echo "=========== # ticket rpc test start============="
ispara=$(echo '"'"${MAIN_HTTP}"'"' | jq '.|contains("8901")') ispara=$(echo '"'"${MAIN_HTTP}"'"' | jq '.|contains("8901")')
if [[ $ispara == true ]]; then if [[ $ispara == true ]]; then
echo "***skip ticket test on parachain***" echo "***skip ticket test on parachain***"
...@@ -161,13 +160,7 @@ function main() { ...@@ -161,13 +160,7 @@ function main() {
run_testcases run_testcases
fi fi
if [[ -n $CASE_ERR ]]; then chain33_RpcTestRst Ticket "$CASE_ERR"
echo -e "${RED}=============Ticket Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Ticket Rpc Test Pass==============${NOC}"
fi
echo "=========== # ticket rpc test end============="
} }
chain33_debug_function main "$1" chain33_debug_function main "$1"
...@@ -10,7 +10,7 @@ import ( ...@@ -10,7 +10,7 @@ import (
rpctypes "github.com/33cn/chain33/rpc/types" rpctypes "github.com/33cn/chain33/rpc/types"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
ty "github.com/33cn/plugin/plugin/dapp/ticket/types" ty "github.com/33cn/plugin/plugin/dapp/ticket/types"
context "golang.org/x/net/context" "golang.org/x/net/context"
) )
func bindMiner(param *ty.ReqBindMiner) (*ty.ReplyBindMiner, error) { func bindMiner(param *ty.ReqBindMiner) (*ty.ReplyBindMiner, error) {
...@@ -28,14 +28,7 @@ func bindMiner(param *ty.ReqBindMiner) (*ty.ReplyBindMiner, error) { ...@@ -28,14 +28,7 @@ func bindMiner(param *ty.ReqBindMiner) (*ty.ReplyBindMiner, error) {
// CreateBindMiner 创建绑定挖矿 // CreateBindMiner 创建绑定挖矿
func (g *channelClient) CreateBindMiner(ctx context.Context, in *ty.ReqBindMiner) (*ty.ReplyBindMiner, error) { func (g *channelClient) CreateBindMiner(ctx context.Context, in *ty.ReqBindMiner) (*ty.ReplyBindMiner, error) {
header, err := g.GetLastHeader() err := address.CheckAddress(in.BindAddr)
if err != nil {
return nil, err
}
if in.Amount%ty.GetTicketMinerParam(header.Height).TicketPrice != 0 || in.Amount < 0 {
return nil, types.ErrAmount
}
err = address.CheckAddress(in.BindAddr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -45,6 +38,14 @@ func (g *channelClient) CreateBindMiner(ctx context.Context, in *ty.ReqBindMiner ...@@ -45,6 +38,14 @@ func (g *channelClient) CreateBindMiner(ctx context.Context, in *ty.ReqBindMiner
} }
if in.CheckBalance { if in.CheckBalance {
header, err := g.GetLastHeader()
if err != nil {
return nil, err
}
if in.Amount%ty.GetTicketMinerParam(header.Height).TicketPrice != 0 || in.Amount < 0 {
return nil, types.ErrAmount
}
getBalance := &types.ReqBalance{Addresses: []string{in.OriginAddr}, Execer: "coins", AssetSymbol: "bty", AssetExec: "coins"} getBalance := &types.ReqBalance{Addresses: []string{in.OriginAddr}, Execer: "coins", AssetSymbol: "bty", AssetExec: "coins"}
balances, err := g.GetCoinsAccountDB().GetBalance(g, getBalance) balances, err := g.GetCoinsAccountDB().GetBalance(g, getBalance)
if err != nil { if err != nil {
......
...@@ -26,6 +26,26 @@ import ( ...@@ -26,6 +26,26 @@ import (
var cfgstring = ` var cfgstring = `
Title="test" Title="test"
[mempool]
poolCacheSize=102400
minTxFee=100000
maxTxNumPerAccount=100
[exec]
isFree=false
minExecFee=100000
enableStat=false
enableMVCC=false
[wallet]
minFee=100000
driver="leveldb"
dbPath="wallet"
dbCache=16
signType="secp256k1"
minerdisable=false
minerwhitelist=["*"]
[mver.consensus] [mver.consensus]
fundKeyAddr = "1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5" fundKeyAddr = "1BQXS6TxaYYG5mADaWij4AxhZZUTpw95a5"
powLimitBits = "0x1f00ffff" powLimitBits = "0x1f00ffff"
...@@ -43,6 +63,46 @@ ticketWithdrawTime = 10 ...@@ -43,6 +63,46 @@ ticketWithdrawTime = 10
ticketMinerWaitTime = 2 ticketMinerWaitTime = 2
targetTimespan = 2304 targetTimespan = 2304
targetTimePerBlock = 16 targetTimePerBlock = 16
[mver.consensus.ticket.ForkChainParamV1]
ticketPrice = 3000
[mver.consensus.ticket.ForkChainParamV2]
ticketPrice = 6000
[fork.system]
ForkChainParamV1= 10
ForkChainParamV2= 20
ForkStateDBSet=-1
ForkCheckTxDup=0
ForkBlockHash= 1
ForkMinerTime= 10
ForkTransferExec= 100000
ForkExecKey= 200000
ForkTxGroup= 200000
ForkResetTx0= 200000
ForkWithdraw= 200000
ForkExecRollback= 450000
ForkTxHeight= -1
ForkTxGroupPara= -1
ForkCheckBlockTime=1200000
ForkMultiSignAddress=1298600
ForkBlockCheck=1
ForkLocalDBAccess=0
ForkBase58AddressCheck=1800000
ForkEnableParaRegExec=0
ForkCacheDriver=0
ForkTicketFundAddrV1=-1
[fork.sub.coins]
Enable=0
[fork.sub.manage]
Enable=0
ForkManageExec=100000
[fork.sub.store-kvmvccmavl]
ForkKvmvccmavl=1
` `
func newGrpc(api client.QueueProtocolAPI) *channelClient { func newGrpc(api client.QueueProtocolAPI) *channelClient {
...@@ -59,17 +119,18 @@ func TestChannelClient_BindMiner(t *testing.T) { ...@@ -59,17 +119,18 @@ func TestChannelClient_BindMiner(t *testing.T) {
api := new(mocks.QueueProtocolAPI) api := new(mocks.QueueProtocolAPI)
client := newGrpc(api) client := newGrpc(api)
client.Init("ticket", nil, nil, nil) client.Init("ticket", nil, nil, nil)
head := &types.Header{StateHash: []byte("sdfadasds")} head := &types.Header{Height: 2, StateHash: []byte("sdfadasds")}
api.On("GetLastHeader").Return(head, nil) api.On("GetLastHeader").Return(head, nil).Times(4)
var acc = &types.Account{Addr: "1Jn2qu84Z1SUUosWjySggBS9pKWdAP3tZt", Balance: 100000 * types.Coin} var acc = &types.Account{Addr: "1Jn2qu84Z1SUUosWjySggBS9pKWdAP3tZt", Balance: 100000 * types.Coin}
accv := types.Encode(acc) accv := types.Encode(acc)
storevalue := &types.StoreReplyValue{} storevalue := &types.StoreReplyValue{}
storevalue.Values = append(storevalue.Values, accv) storevalue.Values = append(storevalue.Values, accv)
api.On("StoreGet", mock.Anything).Return(storevalue, nil) api.On("StoreGet", mock.Anything).Return(storevalue, nil).Twice()
types.SetTitleOnlyForTest("test") types.SetTitleOnlyForTest("test")
types.InitCfgString(cfgstring) cfg, _ := types.InitCfgString(cfgstring)
types.Init("test", cfg)
//var addrs = make([]string, 1) //var addrs = make([]string, 1)
//addrs = append(addrs, "1Jn2qu84Z1SUUosWjySggBS9pKWdAP3tZt") //addrs = append(addrs, "1Jn2qu84Z1SUUosWjySggBS9pKWdAP3tZt")
...@@ -81,6 +142,16 @@ func TestChannelClient_BindMiner(t *testing.T) { ...@@ -81,6 +142,16 @@ func TestChannelClient_BindMiner(t *testing.T) {
} }
_, err := client.CreateBindMiner(context.Background(), in) _, err := client.CreateBindMiner(context.Background(), in)
assert.Nil(t, err) assert.Nil(t, err)
in.Amount = 200000 * types.Coin
_, err = client.CreateBindMiner(context.Background(), in)
assert.Equal(t, types.ErrNoBalance, err)
head.Height = 20 //ForkChainParamV2
api.On("GetLastHeader").Return(head, nil).Times(2)
_, err = client.CreateBindMiner(context.Background(), in)
assert.Equal(t, types.ErrAmount, err)
} }
func testGetTicketCountOK(t *testing.T) { func testGetTicketCountOK(t *testing.T) {
......
...@@ -3,12 +3,7 @@ ...@@ -3,12 +3,7 @@
strpwd=$(pwd) strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/test-rpc.sh "${OUT_TESTDIR}"
...@@ -276,19 +276,15 @@ function run_test() { ...@@ -276,19 +276,15 @@ function run_test() {
function main() { function main() {
local ip=$1 local ip=$1
chain33_RpcTestBegin token
MAIN_HTTP=$ip MAIN_HTTP=$ip
echo "=========== # token rpc test ============="
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
run_test "$ip" run_test "$ip"
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst token "$CASE_ERR"
echo -e "${RED}=============Token Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============Token Rpc Test Pass==============${NOC}"
fi
} }
chain33_debug_function main "$1" chain33_debug_function main "$1"
...@@ -3,13 +3,7 @@ ...@@ -3,13 +3,7 @@
strpwd=$(pwd) strpwd=$(pwd)
strcmd=${strpwd##*dapp/} strcmd=${strpwd##*dapp/}
strapp=${strcmd%/cmd*} strapp=${strcmd%/cmd*}
OUT_DIR="${1}/$strapp"
#FLAG=$2
mkdir -p "${OUT_DIR}"
cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
chmod +x ./build/test-rpc.sh cp ./test/test-rpc.sh "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}"
...@@ -11,11 +11,6 @@ tradeAddr="12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv" ...@@ -11,11 +11,6 @@ tradeAddr="12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
tradeBuyerAddr="1CvLe1qNaC7tCf5xmfAqJ9UJkMhtmhUKNg" tradeBuyerAddr="1CvLe1qNaC7tCf5xmfAqJ9UJkMhtmhUKNg"
tokenSymbol="TOKEN" tokenSymbol="TOKEN"
#color
RED='\033[1;31m'
GRE='\033[1;32m'
NOC='\033[0m'
function updateConfig() { function updateConfig() {
unsignedTx=$(curl -s --data-binary '{"jsonrpc":"2.0","id":2,"method":"Chain33.CreateTransaction","params":[{"execer": "manage","actionName":"Modify","payload":{ "key": "token-blacklist","value": "BTY","op": "add","addr": ""}}]}' -H 'content-type:text/plain;' ${MAIN_HTTP} | jq -r ".result") unsignedTx=$(curl -s --data-binary '{"jsonrpc":"2.0","id":2,"method":"Chain33.CreateTransaction","params":[{"execer": "manage","actionName":"Modify","payload":{ "key": "token-blacklist","value": "BTY","op": "add","addr": ""}}]}' -H 'content-type:text/plain;' ${MAIN_HTTP} | jq -r ".result")
if [ "${unsignedTx}" == "" ]; then if [ "${unsignedTx}" == "" ]; then
...@@ -339,19 +334,14 @@ function run_test() { ...@@ -339,19 +334,14 @@ function run_test() {
function main() { function main() {
local ip=$1 local ip=$1
chain33_RpcTestBegin trade
MAIN_HTTP=$ip MAIN_HTTP=$ip
echo "=========== # trade rpc test ============="
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
run_test "$MAIN_HTTP" run_test "$MAIN_HTTP"
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst trade "$CASE_ERR"
echo -e "${RED}=============trade Rpc Test Fail=============${NOC}"
exit 1
else
echo -e "${GRE}=============trade Rpc Test Pass==============${NOC}"
fi
} }
chain33_debug_function main "$1" chain33_debug_function main "$1"
...@@ -13,4 +13,4 @@ cp ./build/* "${OUT_DIR}" ...@@ -13,4 +13,4 @@ cp ./build/* "${OUT_DIR}"
OUT_TESTDIR="${1}/dapptest/$strapp" OUT_TESTDIR="${1}/dapptest/$strapp"
mkdir -p "${OUT_TESTDIR}" mkdir -p "${OUT_TESTDIR}"
cp ./build/test-rpc.sh "${OUT_TESTDIR}" cp ./test/test-rpc.sh "${OUT_TESTDIR}"
...@@ -149,18 +149,15 @@ function debug_function() { ...@@ -149,18 +149,15 @@ function debug_function() {
} }
function rpc_test() { function rpc_test() {
chain33_RpcTestBegin unfreeze
MAIN_HTTP="$1" MAIN_HTTP="$1"
echo "main_ip=$MAIN_HTTP" echo "main_ip=$MAIN_HTTP"
init init
run_testcases run_testcases
if [ -n "$CASE_ERR" ]; then chain33_RpcTestRst unfreeze "$CASE_ERR"
echo "=======unfreeze rpc test error ==========="
exit 1
else
echo "====== unfreeze rpc test pass ==========="
fi
} }
debug_function rpc_test "$1" debug_function rpc_test "$1"
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