script(*): add config.sh

This commit is contained in:
Aiden X 2020-03-30 12:59:22 +08:00
parent 6a9cce1b76
commit 91fccf8380
19 changed files with 391 additions and 278 deletions

19
.github/ISSUE_TEMPLATE/bug-report.md vendored Normal file
View File

@ -0,0 +1,19 @@
---
name: 'Bug Report'
about: 'As a User, I want to report a Bug.'
labels: bug
---
## Bug Report
Please answer these questions before submitting your issue. Thanks!
### 1. What did you do?
<!-- If possible, provide a recipe for reproducing the error. -->
### 2. What did you expect to see?
### 3. What did you see instead?
### 4. What version of BitXHub are you using? (`bitxhub version` on BitXHub)

7
.github/ISSUE_TEMPLATE/enhancement.md vendored Normal file
View File

@ -0,0 +1,7 @@
---
name: 'Development Task'
about: 'As a BitXHub developer, I want to record a development task.'
labels: enhancement
---
## Development Task

19
.github/ISSUE_TEMPLATE/feature.md vendored Normal file
View File

@ -0,0 +1,19 @@
---
name: 'Feature Request'
about: 'As a user, I want to request a New Feature on the product.'
labels: feature
---
## Feature Request
**Is your feature request related to a problem? Please describe:**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
**Describe the feature you'd like:**
<!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered:**
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Teachability, Documentation, Adoption, Migration Strategy:**
<!-- If you can, explain some scenarios how users might use this, situations it would be helpful in. Any API designs, mockups, or diagrams are also helpful. -->

7
.github/ISSUE_TEMPLATE/question.md vendored Normal file
View File

@ -0,0 +1,7 @@
---
name: 'Ask a Question'
about: 'I want to ask a question.'
labels: question
---
## General Question

1
.gitignore vendored
View File

@ -11,7 +11,6 @@ dump
build
build_solo
build.tar.gz
bitxhub/bitxhub
cover.out
coverage.out
cover.html

View File

@ -1 +1,141 @@
# Contributing
## <a name="submit"></a> Submission Guidelines
### <a name="submit-pr"></a> Submitting a Pull Request (PR)
Before you submit your Pull Request (PR) consider the following guidelines:
1. Search [GitHub](https://github.com/meshplus/bitxhub/pulls) for an open or closed PR
that relates to your submission. You don't want to duplicate effort.
1. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add.
Discussing the design up front helps to ensure that we're ready to accept your work.
1. Fork the meshplus/bitxhub repo.
1. Make your changes in a new git branch:
```shell
git checkout -b my-fix-branch master
```
1. Create your patch, **including appropriate test cases**.
1. Follow gofmt and golint specifications.
1. Run the full test suite and ensure that all tests pass.
1. Commit your changes using a descriptive commit message that follows our
[commit message conventions](#commit). Adherence to these conventions
is necessary because release notes are automatically generated from these messages.
```shell
git commit -a
```
Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
1. Push your branch to GitHub:
```shell
git push origin my-fix-branch
```
1. In GitHub, send a pull request to `bitxhub:master`.
* If we suggest changes then:
* Make the required updates.
* Re-run the test suites to ensure tests are still passing.
* Rebase your branch and force push to your GitHub repository (this will update your Pull Request):
```shell
git rebase master -i
git push -f
```
That's it! Thank you for your contribution!
#### After your pull request is merged
After your pull request is merged, you can safely delete your branch and pull the changes
from the main (upstream) repository:
* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows:
```shell
git push origin --delete my-fix-branch
```
* Check out the master branch:
```shell
git checkout master -f
```
* Delete the local branch:
```shell
git branch -D my-fix-branch
```
* Update your master with the latest upstream version:
```shell
git pull --ff upstream master
```
## <a name="commit"> Commit Message Guidelines
Commit Message in this repository should strictly follow the [AngularJS Git Commit Message Conventions](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#-commit-message-guidelines). We explain the conventions below. For detail explanation, it can be found in this [document](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#).
### Commit Message Format
Each commit message consists of a **header**, a **body** and a **footer**. The header has a special
format that includes a **type**, a **scope** and a **subject**:
```
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
```
The **header** is mandatory and the **scope** of the header is optional.
Any line of the commit message cannot be longer than 100 characters! This allows the message to be easier
to read on GitHub as well as in various git tools.
The footer should contain a [closing reference to an issue](https://help.github.com/articles/closing-issues-via-commit-messages/) if any.
### Revert
If the commit reverts a previous commit, it should begin with `revert:`, followed by the header of the reverted commit. In the body it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.
### Type
Must be one of the following:
* **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
* **ci**: Changes to our CI configuration files and scripts (example scopes: Circle, BrowserStack, SauceLabs)
* **docs**: Documentation only changes
* **feat**: A new feature
* **fix**: A bug fix
* **perf**: A code change that improves performance
* **refactor**: A code change that neither fixes a bug nor adds a feature
* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
* **test**: Adding missing tests or correcting existing tests
### Subject
The subject contains a succinct description of the change:
* use the imperative, present tense: "change" not "changed" nor "changes"
* don't capitalize the first letter
* no dot (.) at the end
### Body
Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes".
The body should include the motivation for the change and contrast this with previous behavior.
### Footer
The footer should contain any information about **Breaking Changes** and is also the place to
reference GitHub issues that this commit **Closes**.
**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.

View File

@ -51,13 +51,12 @@ install:
$(GO) install -ldflags '${LDFLAGS}' ./cmd/${APP_NAME}
@printf "${GREEN}Build bitxhub successfully!${NC}\n"
## make build-linux: Go build linux executable file
build-linux:
cd scripts && sh cross_compile.sh linux-amd64 ${CURRENT_PATH}
## make docs-build: Build vuepress docs
docs-build:
cd docs && sudo vuepress build
build:
cd internal/repo && packr
@mkdir -p bin
$(GO) build -ldflags '${LDFLAGS}' ./cmd/${APP_NAME}
@mv ./bitxhub bin
@printf "${GREEN}Build bitxhub successfully!${NC}\n"
## make linter: Run golanci-lint
linter:
@ -68,6 +67,6 @@ linter:
## make cluster: Run cluster including 4 nodes
cluster:
cd scripts && sh cluster.sh 4
@cd scripts && bash cluster.sh
.PHONY: tester

View File

@ -1,8 +1,6 @@
package main
import (
"bufio"
"encoding/json"
"fmt"
"io/ioutil"
"os"
@ -13,7 +11,6 @@ import (
"github.com/libp2p/go-libp2p-core/crypto"
"github.com/libp2p/go-libp2p-core/peer"
"github.com/meshplus/bitxhub-kit/crypto/asym/ecdsa"
"github.com/meshplus/bitxhub-kit/fileutil"
"github.com/meshplus/bitxhub/internal/repo"
"github.com/meshplus/bitxhub/pkg/cert"
"github.com/urfave/cli"
@ -53,12 +50,25 @@ func keyCMD() cli.Command {
},
{
Name: "pid",
Usage: "Show pid from cert",
Usage: "Show pid from private key",
Action: getPid,
Flags: []cli.Flag{
cli.StringFlag{
Name: "path",
Usage: "Private Key Path",
Required: true,
},
},
},
{
Name: "address",
Usage: "Show address from private",
Action: getAddress,
Flags: []cli.Flag{
cli.StringFlag{
Name: "path",
Usage: "Specific private key path",
Required: true,
},
},
},
@ -85,7 +95,7 @@ func generateKey(ctx *cli.Context) error {
return fmt.Errorf("create account error: %s", err)
}
out, err := json.Marshal(act)
out, err := act.Pretty()
if err != nil {
return err
}
@ -97,28 +107,12 @@ func generateKey(ctx *cli.Context) error {
}
keyPath := filepath.Join(repoRoot, repo.KeyName)
ok := fileutil.Exist(keyPath)
if ok {
fmt.Println("Key file already exists")
fmt.Println("Recreate would overwrite your key, Y/N?")
input := bufio.NewScanner(os.Stdin)
input.Scan()
if input.Text() == "Y" || input.Text() == "y" {
err := ioutil.WriteFile(keyPath, out, os.ModePerm)
if err != nil {
return fmt.Errorf("write key file: %w", err)
}
}
return nil
}
err = ioutil.WriteFile(keyPath, out, os.ModePerm)
err = ioutil.WriteFile(keyPath, []byte(out), os.ModePerm)
if err != nil {
return fmt.Errorf("write key file: %w", err)
}
} else {
fmt.Println(string(out))
fmt.Println(out)
}
return nil
@ -167,3 +161,28 @@ func getPid(ctx *cli.Context) error {
return nil
}
func getAddress(ctx *cli.Context) error {
privPath := ctx.String("path")
data, err := ioutil.ReadFile(privPath)
if err != nil {
return fmt.Errorf("read private key: %w", err)
}
stdPriv, err := cert.ParsePrivateKey(data)
if err != nil {
return err
}
privKey := &ecdsa.PrivateKey{K: stdPriv}
act, err := key.NewWithPrivateKey(privKey, "bitxhub")
if err != nil {
return fmt.Errorf("create account error: %s", err)
}
fmt.Println(act.Address)
return nil
}

3
config/README.md Normal file
View File

@ -0,0 +1,3 @@
# Config
BitXHub包括bitxhub.toml、network.tom和order.toml三个配置文件。

View File

@ -14,14 +14,14 @@ solo = false
allowed_origins = ["*"]
[log]
level = "debug"
level = "info"
dir = "logs"
filename = "bitxhub.log"
report_caller = true
report_caller = false
[log.module]
p2p = "debug"
consensus = "debug"
executor = "debug"
p2p = "info"
consensus = "info"
executor = "info"
router = "info"
api = "info"
coreapi = "info"

View File

@ -46,7 +46,7 @@ func New(logger logrus.FieldLogger, repo *repo.Repo, ledger ledger.Ledger, peerM
}
func (router *InterchainRouter) Start() error {
router.logger.Infof("router module started")
router.logger.Infof("Router module started")
return nil
}
@ -54,7 +54,7 @@ func (router *InterchainRouter) Start() error {
func (router *InterchainRouter) Stop() error {
router.cancel()
router.logger.Infof("router module stopped")
router.logger.Infof("Router module stopped")
return nil
}

View File

@ -1,37 +0,0 @@
CURRENT_PATH=$(pwd)
BUILD_PATH=${CURRENT_PATH}/build
N=$1
function splitWindow() {
tmux splitw -v -p 50
tmux splitw -h -p 50
tmux selectp -t 0
tmux splitw -h -p 50
}
function start() {
cd ${CURRENT_PATH}
rm -rf build
tar -xf build.tar.gz
pkill -9 bitxhub
tmux kill-session -t bitxhub
tmux new -d -s bitxhub
cd build
for ((i=0;i<N/4;i=i+1)); do
splitWindow
tmux new-window
done
splitWindow
for ((i = 0;i < N;i = i + 1)); do
tmux selectw -t $(($i / 4))
tmux selectp -t $(($i % 4))
cp bitxhub ./node$(($i + 1))/
mkdir ./node$(($i + 1))/plugins
cp *.so ./node$(($i + 1))/plugins/
tmux send-keys "cd ${BUILD_PATH} && ./node$(($i + 1))/bitxhub --repo=${BUILD_PATH}/node$(($i + 1)) start" C-m
done
tmux selectw -t 0
}
start

View File

@ -1,26 +0,0 @@
#!/usr/bin/env bash
set -e
CURRENT_PATH=$(pwd)
PROJECT_PATH=$(dirname "${CURRENT_PATH}")
BUILD_PATH=${CURRENT_PATH}/build
N=$1
function build_config() {
bash config.sh "${N}"
}
function build_plugins() {
## build plugin(make plugin type=<rbft> or <raft>)
cd "${PROJECT_PATH}"/internal/plugins
make raft
for ((i = 1; i < N + 1; i = i + 1)); do
mkdir -p "${BUILD_PATH}"/node${i}
cp -rf "${PROJECT_PATH}"/internal/plugins/build "${BUILD_PATH}"/node${i}/plugins
done
}
build_config
build_plugins

View File

@ -1,22 +0,0 @@
#!/usr/bin/env bash
set -e
CURRENT_PATH=$(pwd)
PROJECT_PATH=$(dirname "${CURRENT_PATH}")
BUILD_PATH=${CURRENT_PATH}/build
CERT_PATH=${CURRENT_PATH}/cert
N=$1
mkdir -p "${CERT_PATH}"
cd "${CERT_PATH}"
## Generate ca private key and cert
premo cert ca
for ((i = 1; i < N + 1; i = i + 1)); do
mkdir -p "${CERT_PATH}"/node${i}
cd "${CERT_PATH}"/node${i}
premo cert issue --name agency --priv ../ca.priv --cert ../ca.cert --org=Hyperchain
premo cert issue --name node --priv ./agency.priv --cert ./agency.cert --org=Agency${i}
done

View File

@ -4,14 +4,65 @@ set -e
CURRENT_PATH=$(pwd)
PROJECT_PATH=$(dirname "${CURRENT_PATH}")
CONFIG_PATH=${PROJECT_PATH}/config
BUILD_PATH=${CURRENT_PATH}/build
N=$1
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m'
N=4
function print_blue() {
printf "${BLUE}%s${NC}\n" "$1"
}
# The sed commend with system judging
# Examples:
# sed -i 's/a/b/g' bob.txt => x_replace 's/a/b/g' bob.txt
function x_replace() {
system=$(uname)
if [ "${system}" = "Linux" ]; then
sed -i "$@"
else
sed -i '' "$@"
fi
}
function prepare() {
bash build.sh "${N}"
print_blue "===> Generating $N nodes configuration"
rm -rf "${BUILD_PATH}"
mkdir "${BUILD_PATH}"
for ((i = 1; i < N + 1; i = i + 1)); do
root=${BUILD_PATH}/node${i}
mkdir -p "${root}"
cp -rf "${CURRENT_PATH}"/certs/node${i}/certs "${root}"
cp -rf "${CONFIG_PATH}"/* "${root}"
echo " #!/usr/bin/env bash" >"${root}"/start.sh
echo "./bitxhub --root \$(pwd)" start >>"${root}"/start.sh
bitxhubConfig=${root}/bitxhub.toml
networkConfig=${root}/network.toml
x_replace "s/60011/6001${i}/g" "${bitxhubConfig}"
x_replace "s/9091/909${i}/g" "${bitxhubConfig}"
x_replace "s/53121/5312${i}/g" "${bitxhubConfig}"
x_replace "s/9091/909${i}/g" "${root}"/api
x_replace "1s/1/${i}/" "${networkConfig}"
done
print_blue "===> Building plugin"
cd "${PROJECT_PATH}"/internal/plugins
make raft
for ((i = 1; i < N + 1; i = i + 1)); do
cp -rf "${PROJECT_PATH}"/internal/plugins/build "${BUILD_PATH}"/node${i}/plugins
done
}
function compile() {
print_blue "===> Compiling bitxhub"
cd "${PROJECT_PATH}"
make install
}
@ -24,6 +75,7 @@ function splitWindow() {
}
function start() {
print_blue "===> Staring cluster"
#osascript ${PROJECT_PATH}/scripts/split.scpt ${N} ${DUMP_PATH}/cluster/node
tmux new -d -s bitxhub || (tmux kill-session -t bitxhub && tmux new -d -s bitxhub)

View File

@ -2,63 +2,97 @@
set -e
source x.sh
CURRENT_PATH=$(pwd)
PROJECT_PATH=$(dirname "${CURRENT_PATH}")
BUILD_PATH=${CURRENT_PATH}/build
CONFIG_PATH=${PROJECT_PATH}/config
BUILD_PATH=${CURRENT_PATH}/build
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m'
N=$1
function print_blue() {
printf "${BLUE}%s${NC}\n" "$1"
}
function print_red() {
printf "${RED}%s${NC}\n" "$1"
}
# The sed commend with system judging
# Examples:
# sed -i 's/a/b/g' bob.txt => x_replace 's/a/b/g' bob.txt
function x_replace() {
system=$(uname)
if [ "${system}" = "Linux" ]; then
sed -i "$@"
else
sed -i '' "$@"
fi
}
function prepare() {
cd "${PROJECT_PATH}"
make build
rm -rf "${BUILD_PATH}"
mkdir "${BUILD_PATH}"
mkdir "${BUILD_PATH}"/certs
cd "${PROJECT_PATH}"/internal/plugins
make raft
}
function generate_certs() {
for ((i = 1; i < N + 1; i = i + 1)); do
if [[ $i -le 4 ]]; then
cp -rf "${CURRENT_PATH}"/certs/node${i} "${BUILD_PATH}"/certs
else
certs_path=${BUILD_PATH}/certs/node${i}/certs
mkdir -p "${certs_path}"
cp "${CURRENT_PATH}"/certs/ca.cert "${CURRENT_PATH}"/certs/agency.cert "${certs_path}"
premo cert priv --name node --target "${certs_path}"
premo cert csr --key "${certs_path}"/node.priv --org Node${i} --target "${certs_path}"
premo cert issue --csr "${certs_path}"/node.csr \
--key "${CURRENT_PATH}"/certs/ca.priv \
--cert "${CURRENT_PATH}"/certs/ca.cert \
--target "${certs_path}"
premo key convert --path "${certs_path}"/node.priv --target "${BUILD_PATH}"/certs/node${i}
fi
done
}
# Generate config
function generate() {
cd "${BUILD_PATH}"
cp "${PROJECT_PATH}"/bin/bitxhub "${BUILD_PATH}"
cp -rf "${PROJECT_PATH}"/internal/plugins/build/raft.so "${BUILD_PATH}"
bitxhub cert ca
bitxhub cert priv --name agency
bitxhub cert csr --key ./agency.priv --org Agency
bitxhub cert issue --key ./ca.priv --cert ./ca.cert --csr ./agency.csr --is_ca true
rm agency.csr
for ((i = 1; i < N + 1; i = i + 1)); do
root=${BUILD_PATH}/node${i}
mkdir -p "${root}"
cp -rf "${BUILD_PATH}"/certs/node${i}/* "${root}"
cp -rf "${CONFIG_PATH}"/* "${root}"
repo=${BUILD_PATH}/node${i}
mkdir -p "${repo}"
bitxhub --repo="${repo}" init
echo "#!/usr/bin/env bash" >"${root}"/start.sh
echo "./bitxhub --root \$(pwd)" start >>"${root}"/start.sh
mkdir -p "${repo}"/plugins
mkdir -p "${repo}"/certs
bitxhubConfig=${root}/bitxhub.toml
networkConfig=${root}/network.toml
x_replace "s/60011/6001${i}/g" "${bitxhubConfig}"
x_replace "s/60011/6001${i}/g" "${bitxhubConfig}"
x_replace "s/9091/909${i}/g" "${bitxhubConfig}"
x_replace "s/53121/5312${i}/g" "${bitxhubConfig}"
x_replace "s/9091/909${i}/g" "${root}"/api
x_replace "1s/1/${i}/" "${networkConfig}"
cd "${repo}"/certs
bitxhub cert priv --name node
bitxhub cert csr --key ./node.priv --org Node${i}
bitxhub cert issue --key "${BUILD_PATH}"/agency.priv --cert "${BUILD_PATH}"/agency.cert --csr ./node.csr
cp "${BUILD_PATH}"/ca.cert "${repo}"/certs
cp "${BUILD_PATH}"/agency.cert "${repo}"/certs
rm "${repo}"/certs/node.csr
id=$(bitxhub --repo="${repo}" key pid --path "${repo}"/certs/node.priv)
addr=$(bitxhub --repo="${repo}" key address --path "${repo}"/certs/node.priv)
echo "${id}" >>"${BUILD_PATH}"/pids
echo "${addr}" >>"${BUILD_PATH}"/addresses
echo "#!/usr/bin/env bash" >"${repo}"/start.sh
echo "./bitxhub --repo \$(pwd)" start >>"${repo}"/start.sh
done
}
print_green "Generating $1 nodes configuration..."
function printHelp() {
print_blue "Usage: "
echo " config.sh <number>"
echo " <number> - node number"
echo " config.sh -h (print this message)"
}
if [ ! $1 ]; then
printHelp
exit 1
fi
prepare
generate_certs
generate

View File

@ -1,87 +0,0 @@
set -e
source x.sh
CURRENT_PATH=$(pwd)
PROJECT_PATH=$(dirname "${CURRENT_PATH}")
BUILD_PATH=${CURRENT_PATH}/build
USERNAME=hyperchain
SERVER_BUILD_PATH="/home/hyperchain/bitxhub"
N=$1
IP=$2
RECOMPILE=$3
if [ "$#" -ne 3 ]; then
echo "Illegal number of parameters"
exit
fi
while getopts "h?n:r:" opt; do
case "$opt" in
h | \?)
help
exit 0
;;
n)
N=$OPTARG
;;
r)
RECOMPILE=$OPTARG
;;
esac
done
function build() {
bash config.sh "$N"
}
function compile() {
if [[ $RECOMPILE == true ]]; then
cd "${PROJECT_PATH}"
make build-linux
else
echo "Do not need compile"
fi
}
function prepare() {
cd "${CURRENT_PATH}"
cp ../bin/bitxhub_linux-amd64 "${BUILD_PATH}"/bitxhub
cp ../internal/plugins/build/*.so "${BUILD_PATH}"/
tar cf build.tar.gz build
}
function deploy() {
cd "${CURRENT_PATH}"
#ssh-copy-id -i ~/.ssh/id_rsa.pub hyperchain@${IP}
scp build.tar.gz ${USERNAME}@"${IP}":${SERVER_BUILD_PATH}
scp boot_bitxhub.sh ${USERNAME}@"${IP}":${SERVER_BUILD_PATH}
ssh -t ${USERNAME}@"${IP}" '
cd '${SERVER_BUILD_PATH}'
bash boot_bitxhub.sh 4
tmux attach-session -t bitxhub
'
}
# help prompt message
function help() {
echo "deploy.sh helper:"
echo " -h, --help: show the help for this bash script"
echo " -n, --number: bitxhub node to be started"
echo " -r, --recompile: need compile or not"
echo "---------------------------------------------------"
echo "Example for deploy 4 node in server:"
echo "./deploy.sh -n 4 -r 1"
}
print_blue "1. Generate config"
build
print_blue "2. Compile bitxhub"
compile
prepare
print_blue "3. Deploy bitxhub"
deploy

View File

@ -1,20 +0,0 @@
#!/usr/bin/env bash
set -e
# integration test script
CURRENT_PATH=$(pwd)
PROJECT_PATH=$(dirname "${CURRENT_PATH}")
BUILD_PATH=${CURRENT_PATH}/build
N=$1
sh build.sh "$N"
cd "${PROJECT_PATH}"
make install
bitxhub version
for ((i = 1; i < N + 1; i = i + 1)); do
echo "Start node${i}"
nohup bitxhub --repo="${BUILD_PATH}"/node${i} start &
done

View File

@ -2,6 +2,8 @@
set -e
source x.sh
CURRENT_PATH=$(pwd)
PROJECT_PATH=$(dirname "${CURRENT_PATH}")
BUILD_PATH=${CURRENT_PATH}/build_solo
@ -12,11 +14,12 @@ function prepare() {
}
function config() {
mkdir -p ${BUILD_PATH}/certs
mkdir -p "${BUILD_PATH}"/certs
cp -r "${CURRENT_PATH}"/certs/node1/certs/* "${BUILD_PATH}"/certs
}
function compile() {
print_blue "===> Compileing bitxhub"
cd "${PROJECT_PATH}"
make install
@ -26,7 +29,11 @@ function compile() {
}
function start() {
print_blue "===> Start solo bitxhub"
bitxhub --repo="${BUILD_PATH}" init
bitxhubConfig=${BUILD_PATH}/bitxhub.toml
x_replace "s/solo = false/solo = true/g" "${bitxhubConfig}"
x_replace "s/raft.so/solo.so/g" "${bitxhubConfig}"
mkdir -p "${BUILD_PATH}"/plugins
cp "${PROJECT_PATH}"/internal/plugins/build/solo.so "${BUILD_PATH}"/plugins/
bitxhub --repo="${BUILD_PATH}" start