diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6275d27..40be144 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,12 +39,6 @@ jobs: echo "name=xinfinorg/subnet-generator:${{github.ref_name}}" >> $GITHUB_OUTPUT fi - - name: Load Subnet commit/branch config (used for genesis gen) - id: commit - run: | - cat docker/puppeth_csc_commit.env - echo commit=$(cat docker/puppeth_csc_commit.env) >> $GITHUB_OUTPUT - - name: Build and push image run: | docker build . --file docker/Dockerfile \ diff --git a/.gitignore b/.gitignore index 7b8dc72..2d23609 100644 --- a/.gitignore +++ b/.gitignore @@ -10,10 +10,10 @@ subnet/bootnodes/* subnet/logs subnet/relayer subnet/stats-service +subnet/deployment-generator/script/gen.env* XDC-Subnet keys.json node_modules -subnet/deployment-generator/generated -subnet/deployment-generator/script/gen.env* -subnet/scripts/faucet/*.env -package-lock.json \ No newline at end of file +package-lock.json +generated +*.env \ No newline at end of file diff --git a/subnet/deployment-generator/docker/Dockerfile b/subnet/deployment-generator/docker/Dockerfile index 01c95a8..ee96710 100644 --- a/subnet/deployment-generator/docker/Dockerfile +++ b/subnet/deployment-generator/docker/Dockerfile @@ -1,42 +1,12 @@ - -FROM golang:1.14 as builder - -ARG SUBNET_BRANCH=master - -RUN git clone https://github.com/XinFinOrg/XDC-Subnet - -#it is called 'BRANCH' but commits also work -RUN cd XDC-Subnet && git checkout ${SUBNET_BRANCH} && make puppeth - - - - - FROM node:18.15 -ARG SUBNET_BRANCH=master -ARG IMAGE_NAME=latest -#inject build arg as ENV -ENV SUBNET_BRANCH=${SUBNET_BRANCH} -ENV IMAGE_NAME=${IMAGE_NAME} -RUN echo SUBNET_BRANCH=${SUBNET_BRANCH} -RUN echo IMAGE_NAME=${IMAGE_NAME} - WORKDIR /app -COPY --from=builder /go/XDC-Subnet/build/bin/puppeth /bin/puppeth -# COPY --from=builder /go/XDC-Subnet/mainnet_contract /app/contract - -#this step here for caching -# RUN cd contract && yarn - -COPY ./script /app/script +COPY ./src /app/src COPY ./docker/start.sh /app/start.sh -COPY ./docker/deploy_csc.sh /app/deploy_csc.sh RUN chmod +x /app/start.sh -RUN chmod +x /app/deploy_csc.sh -RUN cd script && npm install +RUN cd src && npm install ENTRYPOINT ["bash","/app/start.sh"] diff --git a/subnet/deployment-generator/docker/deploy_csc.sh b/subnet/deployment-generator/docker/deploy_csc.sh deleted file mode 100755 index 25e6d9f..0000000 --- a/subnet/deployment-generator/docker/deploy_csc.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -cd /app/contract -remove0x=${PARENTNET_WALLET_PK:2} -echo "PRIVATE_KEY=${remove0x}" >> .env -cp /app/generated/deployment.config.json /app/contract/deployment.config.json -echo "RELAYER_MODE=${RELAYER_MODE}" -if [[ $RELAYER_MODE == 'full' ]] -then - echo "Deploying full CSC" - npx hardhat run /app/contract/scripts/FullCheckpointDeploy.js --network xdcparentnet 2>&1 | tee csc.log -elif [[ $RELAYER_MODE == 'lite' ]] -then - echo "Deploying lite CSC" - npx hardhat run /app/contract/scripts/LiteCheckpointDeploy.js --network xdcparentnet 2>&1 | tee csc.log -else - echo "Unknown RELAYER_MODE" - exit 1 -fi - -found=$(cat csc.log | grep -m 1 "deployed to") -echo $found - -if [[ $found == '' ]] -then - echo 'CSC deployment failed' - exit 1 -else - echo 'Replacing CSC address in common.env file' - contract=${found: -42} - echo $contract - cat /app/generated/common.env | sed -e "s/CHECKPOINT_CONTRACT.*/CHECKPOINT_CONTRACT=$contract/" > temp.env - mv temp.env /app/generated/common.env -fi \ No newline at end of file diff --git a/subnet/deployment-generator/docker/puppeth_csc_commit.env b/subnet/deployment-generator/docker/puppeth_csc_commit.env deleted file mode 100644 index a172752..0000000 --- a/subnet/deployment-generator/docker/puppeth_csc_commit.env +++ /dev/null @@ -1 +0,0 @@ -880f749 \ No newline at end of file diff --git a/subnet/deployment-generator/docker/start.sh b/subnet/deployment-generator/docker/start.sh index f4d7de5..30c7447 100755 --- a/subnet/deployment-generator/docker/start.sh +++ b/subnet/deployment-generator/docker/start.sh @@ -1,10 +1,2 @@ #!/bin/bash -node /app/script/gen.js && puppeth --file /app/generated/genesis_input.yml --out /app/generated/ - - -if [[ -n "${SLEEP}" ]]; then - echo "sleep ${SLEEP}" - sleep ${SLEEP} -else - echo "docker run finished" -fi \ No newline at end of file +node /app/src/gen.js \ No newline at end of file diff --git a/subnet/deployment-generator/script/check_subnet.sh b/subnet/deployment-generator/script/check_subnet.sh new file mode 100644 index 0000000..8b68f79 --- /dev/null +++ b/subnet/deployment-generator/script/check_subnet.sh @@ -0,0 +1 @@ +#todo \ No newline at end of file diff --git a/subnet/deployment-generator/script/docker.env.example b/subnet/deployment-generator/script/docker.env.example new file mode 100644 index 0000000..49f2a26 --- /dev/null +++ b/subnet/deployment-generator/script/docker.env.example @@ -0,0 +1,23 @@ +CONFIG_PATH=~/subnet +#your current directory + + +#genesis config +NETWORK_NAME=localsubnet +NUM_MACHINE=1 +NUM_SUBNET=3 +MAIN_IP=192.168.1.1 + +#parentchain config +PARENTCHAIN=devnet +PARENTCHAIN_WALLET_PK=0x1111111111111111111111111111111111111111111111111111111111111111 + +# OS=mac + +#docker image versions, default to stable +# VERSION_SUBNET +# VERSION_BOOTNODE +# VERSION_OBSERVER +# VERSION_RELAYER +# VERSION_STATS +# VERSION_FRONTEND diff --git a/subnet/deployment-generator/script/generate.sh b/subnet/deployment-generator/script/generate.sh new file mode 100755 index 0000000..8ed32b9 --- /dev/null +++ b/subnet/deployment-generator/script/generate.sh @@ -0,0 +1,46 @@ +#!/bin/bash +VERSION_GENERATOR="generator-csc" +VERSION_CSC="generator-update" +VERSION_SUBNET="feature-puppeth-docker-2" + +current_dir="$(cd "$(dirname "$0")" && pwd)" +echo 'checking for docker.env' +if [ ! -f "docker.env" ]; then + echo 'docker.env not found' + exit 1 +fi + +if ! grep -q "CONFIG_PATH" "docker.env"; then + line="#current directory"$'\n'"CONFIG_PATH=$(pwd)" + echo "$line" | cat - "docker.env" > temp && mv temp "docker.env" + echo 'added CONFIG_PATH to docker.env' +fi + +echo 'checking docker images' +if [[ -z "$(docker images -q xinfinorg/subnet-generator:$VERSION_GENERATOR)" ]]; then # || echo "doesn't exist" + docker pull xinfinorg/subnet-generator:$VERSION_GENERATOR +fi +if [[ -z "$(docker images -q xinfinorg/csc:$VERSION_CSC)" ]]; then # || echo "doesn't exist" + docker pull xinfinorg/csc:$VERSION_CSC +fi +if [[ -z "$(docker images -q xinfinorg/xdcsubnets:$VERSION_SUBNET)" ]]; then # || echo "doesn't exist" + docker pull xinfinorg/xdcsubnets:$VERSION_SUBNET +fi + +echo '' +echo 'generating configs' +mkdir -p generated +docker run --env-file docker.env -v $current_dir/generated:/app/generated xinfinorg/subnet-generator:$VERSION_GENERATOR || gen_success=false +if [[ $gen_success == false ]]; then + echo 'configs generation failed' + exit 1 +fi + +echo 'generating genesis.json' +docker run -v $current_dir/generated/:/app/generated/ --entrypoint 'bash' xinfinorg/xdcsubnets:$VERSION_SUBNET /work/puppeth.sh || pup_success=false +if [[ $pup_success == false ]]; then + echo 'genesis.json generation failed' + exit 1 +fi + +echo 'subnet generation successful' \ No newline at end of file diff --git a/subnet/deployment-generator/script/upgrade_csc.sh b/subnet/deployment-generator/script/upgrade_csc.sh new file mode 100644 index 0000000..b15fe77 --- /dev/null +++ b/subnet/deployment-generator/script/upgrade_csc.sh @@ -0,0 +1 @@ +#todo diff --git a/subnet/deployment-generator/script/upgrade_subnet.sh b/subnet/deployment-generator/script/upgrade_subnet.sh new file mode 100644 index 0000000..4c312a9 --- /dev/null +++ b/subnet/deployment-generator/script/upgrade_subnet.sh @@ -0,0 +1 @@ +#todo \ No newline at end of file diff --git a/subnet/deployment-generator/script/config_gen.js b/subnet/deployment-generator/src/config_gen.js similarity index 94% rename from subnet/deployment-generator/script/config_gen.js rename to subnet/deployment-generator/src/config_gen.js index b0a51ee..f4f4e6b 100644 --- a/subnet/deployment-generator/script/config_gen.js +++ b/subnet/deployment-generator/src/config_gen.js @@ -6,7 +6,7 @@ const { off } = require('process'); dotenv.config({ path: `${__dirname}/gen.env` }); // console.log(__dirname) -var config = { +let config = { deployment_path: (process.env.CONFIG_PATH || ''), num_machines: parseInt(process.env.NUM_MACHINE), num_subnet: parseInt(process.env.NUM_SUBNET), @@ -14,17 +14,17 @@ var config = { network_name: (process.env.NETWORK_NAME), network_id: parseInt(process.env.NETWORK_ID || Math.floor(Math.random() * (65536 - 1) + 1)), secret_string: (process.env.SERVICES_SECRET || crypto.randomBytes(10).toString('hex')), - relayer_mode: (process.env.RELAYER_MODE || 'full'), //full or lite + relayer_mode: (process.env.RELAYER_MODE || 'full'), //full or lite //in upgradable csc both are deployed docker_image_name: (process.env.IMAGE_NAME || 'xinfinorg/subnet-generator:latest'), operating_system: (process.env.OS || 'linux'), version: { subnet: (process.env.VERSION_SUBNET || 'v0.2.1'), bootnode: (process.env.VERSION_BOOTNODE || 'v0.2.1'), - observer: (process.env.VERSION_OBSERVER || 'latest'), + // observer: (process.env.VERSION_OBSERVER || 'latest'), relayer: (process.env.VERSION_RELAYER || 'v0.2.1'), stats: (process.env.VERSION_STATS || 'v0.1.8'), frontend: (process.env.VERSION_FRONTEND || 'v0.1.8'), - // csc: (process.env.VERSION_CSC || 'v0.1.1'), + csc: (process.env.VERSION_CSC || 'v0.1.1'), // zero: (process.env.VERSION_ZERO || 'v0.1.1') }, parentnet:{ @@ -92,15 +92,16 @@ function configSanityCheck(config){ process.exit(1) } - if (!(config.parentnet.network === 'devnet' || - config.parentnet.network === 'testnet' || - config.parentnet.network === 'mainnet' )){ - var official_urls = { + if (config.parentnet.network === 'devnet' || + config.parentnet.network === 'testnet' || + config.parentnet.network === 'mainnet' ){ + let official_urls = { 'devnet':'https://devnetstats.apothem.network/devnet' , 'testnet':'https://erpc.apothem.network/' , 'mainnet': 'https://devnetstats.apothem.network/mainnet' //confirm url } config.parentnet.url = official_urls[config.parentnet.network] + } else { console.log('PARENTNET must be devnet, testnet, or mainnet ') process.exit(1) } diff --git a/subnet/deployment-generator/src/gen.env.2 b/subnet/deployment-generator/src/gen.env.2 new file mode 100644 index 0000000..4c3a414 --- /dev/null +++ b/subnet/deployment-generator/src/gen.env.2 @@ -0,0 +1,55 @@ +#your current directory +CONFIG_PATH=/Users/wp/Git/XinFin-Node/subnet/deployment-generator/ + +#genesis config +NETWORK_NAME=testsubnet +NETWORK_ID=47016 +NUM_MACHINE=1 +NUM_SUBNET=5 +MAIN_IP=192.168.1.1 + +#parentchain config +# PARENTCHAIN=testnet +# PARENTCHAIN_WALLET_PK=0xa7f3b3dd62552eba8d22d1b8a81f14952065a6b275e12ecc4d8851b9b751d95f +PARENTNET=testnet +PARENTNET_WALLET_PK=0xb2c9249d28dc78f2f4be8567f7573854a2bc3ce2ace8ad886f5dd40fdb36ae1b + + +GRANDMASTER_PK=dfc35b23e7afb972c7f9b8600e3fd58d15b4f7e2c50d4bffa60b955a9f03350b +SUBNETS_PK=31b9bfa25c6e217f409cc64fc97b8dcaf90fc0cb9a824b9c61105aba8fcaebf5,fa5b81709455b59195b25cc20694485feecf32d35b9f33315ea8b07817f1d7b7,b78db5d52d9261041e42becb58ebbef47ca1e78e4e5fca7de6e234eab16a0417,a5b6ae3cfc91ec2475908983ea9d42777465d155d8c69dfba1adc04449b7ecc3,24d6ba18767e14e0b1bcac8eb5ec4095759311940e7e60750cfbd4ef2e5512ac + +#docker image versions, default to stable +# VERSION_SUBNET +# VERSION_BOOTNODE +# VERSION_OBSERVER +# VERSION_RELAYER +# VERSION_STATS +# VERSION_FRONTEND + +OS=mac + + +CONFIG_PATH=/root/work/testgen2 +#your current directory + + +#genesis config +NETWORK_NAME=localsubnet +NETWORK_ID=953 +NUM_MACHINE=1 +NUM_SUBNET=3 +MAIN_IP=192.168.1.1 + +#parentchain config +PARENTCHAIN=devnet +PARENTCHAIN_WALLET_PK=0xb2c9249d28dc78f2f4be8567f7573854a2bc3ce2ace8ad886f5dd40fdb36ae1b + +#custom keys +# GRANDMASTER_PK=dfc35b23e7afb972c7f9b8600e3fd58d15b4f7e2c50d4bffa60b955a9f03350b +# SUBNETS_PK=31b9bfa25c6e217f409cc64fc97b8dcaf90fc0cb9a824b9c61105aba8fcaebf5,fa5b81709455b59195b25cc20694485feecf32d35b9f33315ea8b07817f1d7b7,b78db5d52d9261041e42becb58ebbef47ca1e78e4e5fca7de6e234eab16a0417 + + + + + + diff --git a/subnet/deployment-generator/script/gen.js b/subnet/deployment-generator/src/gen.js similarity index 84% rename from subnet/deployment-generator/script/gen.js rename to subnet/deployment-generator/src/gen.js index 6a9d0bc..9568b32 100644 --- a/subnet/deployment-generator/script/gen.js +++ b/subnet/deployment-generator/src/gen.js @@ -19,9 +19,9 @@ Object.freeze(config) // const output_path = `${__dirname}/../generated/` -keys = gen_other.genSubnetKeys() +let keys = gen_other.genSubnetKeys() -var num_per_machine = Array(config.num_machines) +let num_per_machine = Array(config.num_machines) //integer division for (let i=0; i { const [key, value] = entry; doc['services'][key]=value }); +//checkpoint smartcontract deployment config +let deployment_json = gen_other.genDeploymentJson(keys) if (config.operating_system === 'mac'){ doc, ip_record = gen_compose.injectMacConfig(doc) @@ -63,30 +65,24 @@ if (config.operating_system === 'mac'){ for (let i=1; i<=config.num_subnet; i++){ subnetconf.push(gen_env.genSubnetConfigMac(i, keys, ip_record)) } - //checkpoint smartcontract deployment config - deployment_json = gen_other.genDeploymentJsonMac(keys, ip_record) - } else if(config.operating_system === 'linux'){ commonconf = gen_env.genServicesConfig() subnetconf=[] for (let i=1; i<=config.num_subnet; i++){ subnetconf.push(gen_env.genSubnetConfig(i, keys)) } - //checkpoint smartcontract deployment config - deployment_json = gen_other.genDeploymentJson(keys) - } else { console.log(`ERROR: unknown OS ${config.operating_system} not supported`) process.exit(1) } -compose_content = yaml.dump(doc,{}) -compose_conf = gen_compose.genComposeEnv() +let compose_content = yaml.dump(doc,{}) +let compose_conf = gen_compose.genComposeEnv() //deployment commands list -commands = gen_other.genCommands() -genesis_input = gen_other.genGenesisInputFile(config.network_name, config.network_id, config.num_subnet, keys) -genesis_input_file = yaml.dump(genesis_input, {}) +let commands = gen_other.genCommands() +let genesis_input = gen_other.genGenesisInputFile(config.network_name, config.network_id, config.num_subnet, keys) +let genesis_input_file = yaml.dump(genesis_input, {}) writeGenerated(config.generator.output_path) @@ -119,7 +115,7 @@ function writeGenerated(output_dir){ } }); - keys_json = JSON.stringify(keys, null, 2); + let keys_json = JSON.stringify(keys, null, 2); fs.writeFile(`${output_dir}/keys.json`, keys_json, (err) => { if (err) { console.error('Error writing key file:', err); diff --git a/subnet/deployment-generator/script/gen_compose.js b/subnet/deployment-generator/src/gen_compose.js similarity index 98% rename from subnet/deployment-generator/script/gen_compose.js rename to subnet/deployment-generator/src/gen_compose.js index 1b0046d..ef985f5 100644 --- a/subnet/deployment-generator/script/gen_compose.js +++ b/subnet/deployment-generator/src/gen_compose.js @@ -81,6 +81,7 @@ function genServices(machine_id) { 'image': `xinfinorg/xdc-relayer:${config.version.relayer}`, 'restart': 'always', 'env_file': config_path, + 'ports': ['4000:4000'], 'profiles': [machine] } stats = { @@ -93,7 +94,7 @@ function genServices(machine_id) { }, bootnode=genBootNode(machine_id), - observer=genObserver(machine_id), + // observer=genObserver(machine_id), services = { diff --git a/subnet/deployment-generator/script/gen_env.js b/subnet/deployment-generator/src/gen_env.js similarity index 95% rename from subnet/deployment-generator/script/gen_env.js rename to subnet/deployment-generator/src/gen_env.js index 64dc109..8dc0ffb 100644 --- a/subnet/deployment-generator/script/gen_env.js +++ b/subnet/deployment-generator/src/gen_env.js @@ -112,10 +112,6 @@ CHECKPOINT_CONTRACT=0x0000000000000000000000000000000000000000 SLACK_WEBHOOK=https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX CORS_ALLOW_ORIGIN=* -# Parent Chain Observe Node -PARENTNET_NODE_NAME=mainnet_observer -PRIVATE_KEYS=1111111111111111111111111111111111111111111111111111111111111111 - # Frontend VITE_SUBNET_URL=http://127.0.0.1:3000 diff --git a/subnet/deployment-generator/script/gen_other.js b/subnet/deployment-generator/src/gen_other.js similarity index 72% rename from subnet/deployment-generator/script/gen_other.js rename to subnet/deployment-generator/src/gen_other.js index f4d56d5..8c7a333 100644 --- a/subnet/deployment-generator/script/gen_other.js +++ b/subnet/deployment-generator/src/gen_other.js @@ -5,7 +5,6 @@ Object.freeze(config) module.exports = { genSubnetKeys, genDeploymentJson, - genDeploymentJsonMac, genCommands, genGenesisInputFile, }; @@ -40,46 +39,36 @@ function genSubnetKeys(){ } function genDeploymentJson(keys){ - num = Object.keys(keys).length-1; - validators = [] + let num = Object.keys(keys).length-1; + let validators = [] for (let i=1; i<= num; i++){ - key_name = `key${i}` - public_key = keys[key_name]['0x'] + let key_name = `key${i}` + let public_key = keys[key_name]['0x'] validators.push(public_key) } - deployment = { + let deployment = { "validators": validators, "gap": 450, "epoch": 900, - "xdcparentnet": "https://devnetstats.apothem.network/devnet", - // "xdcparentnet": "http://127.0.0.1:20302", - // "xdcsubnet": "http://127.0.0.1:8545" - "xdcsubnet": `http://${config.ip_1}:8545` } return deployment - } -function genDeploymentJsonMac(keys){ - num = Object.keys(keys).length-1; - validators = [] - for (let i=1; i<= num; i++){ - key_name = `key${i}` - public_key = keys[key_name]['0x'] - validators.push(public_key) - } - deployment = { - "validators": validators, - "gap": 450, - "epoch": 900, - "xdcparentnet": "https://devnetstats.apothem.network/devnet", - // "xdcparentnet": "http://127.0.0.1:20302", - "xdcsubnet": `http://127.0.0.1:8545` - } - return deployment - -} +// function genNetworkJson(){ //don't need this, config will overlap(duplicate) with other files, shell script in CSC docker can gen this +// let network = { +// "xdcsubnet": `http://${config.ip_1}:8545`, +// "xdcparentnet": config.parentnet.url +// } +// return network +// } +// function genNetworkJsonMac(){ +// let network = { +// "xdcsubnet": `http://127.0.0.1:8545`, +// "xdcparentnet": config.parentnet.url +// } +// return network +// } function genCommands(){ conf_path = __dirname+'/config/' @@ -98,13 +87,11 @@ function genCommands(){ } commands+=`\nmachine1: deploy checkpoint smart contract\n` // - commands+=` cd ..\n` - commands+=` docker run --env-file generated/common.env \\ - -v $(pwd)/generated/:/app/generated/ \\ + commands+=` docker run --env-file common.env \\ + -v $(pwd)/../generated/:/app/config \\ --network host \\ - --entrypoint 'bash' xinfinorg/subnet-generator:v0.1.6 ./deploy_csc.sh \n` - // commands+=` make an edit to ./config/common.env to include values for CHECKPOINT_CONTRACT \n` - commands+=` cd generated\n` + --entrypoint './docker/deploy_proxy.sh' xinfinorg/csc:${config.version.csc}\n` + commands+=`\nmachine1: start services and frontend\n` commands+=` docker compose --env-file docker-compose.env --profile services pull\n` commands+=` docker compose --env-file docker-compose.env --profile services up -d\n` diff --git a/subnet/deployment-generator/script/package.json b/subnet/deployment-generator/src/package.json similarity index 100% rename from subnet/deployment-generator/script/package.json rename to subnet/deployment-generator/src/package.json