diff --git a/.gitignore b/.gitignore index 1ee8b83022ef..aadc8de4bfab 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,4 @@ profile.cov /dashboard/assets/package-lock.json **/yarn-error.log +foundry/deployments/local-private-network/geth-linux-amd64 diff --git a/foundry/deployments/local-private-network/Dockerfile b/foundry/deployments/local-private-network/Dockerfile new file mode 100644 index 000000000000..0a75c05fd3ea --- /dev/null +++ b/foundry/deployments/local-private-network/Dockerfile @@ -0,0 +1,21 @@ +FROM frolvlad/alpine-bash + +RUN apk update ; apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ --allow-untrusted ca-certificates curl bash git jshon jq + +#USER guest +WORKDIR /root + +# copy all files +ADD ./deploy-local-network.sh . +ADD ./geth-linux-amd64 /bin/geth +ADD ./start-private-network.sh . + +RUN curl -L https://foundry.paradigm.xyz | bash; \ + /bin/bash -c 'source $HOME/.bashrc'; \ + /root/.foundry/bin/foundryup + +RUN chmod +x /bin/geth + +EXPOSE 8545 +EXPOSE 8546 +ENTRYPOINT ["./start-private-network.sh"] \ No newline at end of file diff --git a/foundry/deployments/local-private-network/compile-geth.sh b/foundry/deployments/local-private-network/compile-geth.sh new file mode 100755 index 000000000000..93d40538e455 --- /dev/null +++ b/foundry/deployments/local-private-network/compile-geth.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e + +GREEN='\033[0;32m' +RED='\033[0;31m' +NC='\033[0m' + +start_path=$(pwd) +cd ../../../ +echo -e "${GREEN}Building geth!${NC}" +docker build -t vulcanize/go-ethereum -f Dockerfile . +docker run --rm --entrypoint cat vulcanize/go-ethereum /usr/local/bin/geth > foundry/deployments/local-private-network/geth-linux-amd64 +chmod +x foundry/deployments/local-private-network/geth-linux-amd64 + +echo -e "${GREEN}geth build complete!${NC}" +cd $start_path diff --git a/foundry/deployments/local-private-network/deploy-local-network.sh b/foundry/deployments/local-private-network/deploy-local-network.sh new file mode 100755 index 000000000000..949ee00631b8 --- /dev/null +++ b/foundry/deployments/local-private-network/deploy-local-network.sh @@ -0,0 +1,187 @@ +#!/bin/bash +set -e + +OPTS="dapp testnet [] ... +dapp testnet --help +-- +db-user=name database user +db-password=password database password +db-name=name database name +db-host=address database host +db-port=port database port +db-write=bool turn on database write mode +db-type=name the type of database +db-driver=name the driver used for the database +db-waitforsync=bool Should the statediff service start once geth has synced to head (default: false) +rpc-port=port change RPC port (default: 8545) +rpc-addr=address change RPC address (default: 127.0.0.1) +chain-id=number change chain ID (default: 99) +period=seconds use a block time instead of instamine +accounts=number create multiple accounts (default: 1) +address=address eth address to add to genesis +save=name after finishing, save snapshot +load=name start from a previously saved snapshot +dir=directory testnet directory +" + +eval "$( + git rev-parse --parseopt -- "$@" <<<"$OPTS" || echo exit $? +)" + +DB_USER=vdbm +DB_PASSWORD=password +DB_NAME=vulcanize_public +DB_HOST=127.0.0.1 +DB_PORT=5432 +DB_TYPE=postgres +DB_DRIVER=sqlx +DB_WAIT_FOR_SYNC=false +RPC_PORT=8545 +RPC_ADDRESS=127.0.0.1 +PERIOD=0 +CHAINID=99 +ACCOUNTS=0 +ADDRESS= +gethdir=$HOME/testnet + +while [[ $1 ]]; do + case $1 in + --) shift; break;; + --db-user) shift; DB_USER=$1;; + --db-password) shift; DB_PASSWORD=$1;; + --db-name) shift; DB_NAME=$1;; + --db-host) shift; DB_HOST=$1;; + --db-port) shift; DB_PORT=$1;; + --db-write) shift; DB_WRITE=$1;; + --db-type) shift; DB_TYPE=$1;; + --db-driver) shift; DB_DRIVER=$1;; + --db-waitforsync) shift; DB_WAIT_FOR_SYNC=$1;; + --rpc-port) shift; RPC_PORT=$1;; + --rpc-addr) shift; RPC_ADDRESS=$1;; + --chain-id) shift; CHAINID=$1;; + --period) shift; PERIOD=$1;; + --accounts) shift; ACCOUNTS=$1;; + --save) shift; SAVE=$1;; + --address) shift; ADDRESS=$1;; + --load) shift; LOAD=$1;; + --dir) shift; gethdir=$1;; + *) printf "${0##*/}: internal error: %q\\n" "$1"; exit 1 + esac; shift +done + +chaindir=$gethdir/$RPC_PORT +#while true; do +# if [[ ! -d "$gethdir/$CHAINID" ]]; then break; fi +# CHAINID=$((CHAINID + 1)) +#done + +mkdir -p "$chaindir/config" +#if [ -n "$ADDRESS" ]; then +# balance+=(-n {} -s "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" -i balance \ +# -i "$ADDRESS") +#fi +for i in $(seq 0 "$ACCOUNTS"); do + address+=( "$( + geth 2>/dev/null account new --datadir "$chaindir" --password=<(exit) 2>/dev/null \ + | grep -o -E "0x[A-Fa-f0-9]*" )" ) +# balance+=(-n {} -s "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" -i balance \ +# -i "${address[i]}") + balance+=(' "'"${address[i]}"'": { "balance": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}') +done + +#ALLOC_CLEAN=$(echo ${ALLOC} | jq .) +EXTRA_DATA="0x3132333400000000000000000000000000000000000000000000000000000000${address[0]#0x}0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" +JSON_VAL='{ + "config": { + "chainId": '"$CHAINID"', + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "clique": { + "period": '"$PERIOD"', + "epoch": 3000 + } + }, + "difficulty": "0x1", + "gaslimit": "0xffffffffffff", + "extraData": "'"$EXTRA_DATA"'", + "alloc": {'"$balance"'} +}' +echo $JSON_VAL | jq . > $chaindir/config/genesis.json + +geth 2>/dev/null --datadir "$chaindir" init "$chaindir/config/genesis.json" + +export ETH_RPC_URL=http://$RPC_ADDRESS:$RPC_PORT + +port=$((RPC_PORT + 30000)) + +geth version +echo >&2 "dapp-testnet: RPC URL: $ETH_RPC_URL" +echo >&2 "dapp-testnet: TCP port: $port" +echo >&2 "dapp-testnet: Chain ID: $CHAINID" +echo >&2 "dapp-testnet: Database: $chaindir" +echo >&2 "dapp-testnet: Geth log: $chaindir/geth.log" + +printf "%s\n" "${address[@]}" > "$chaindir/config/account" +echo "$ETH_RPC_URL" > "$chaindir/config/rpc-url" +echo "$port" > "$chaindir/config/node-port" + +set +m +# Uncomment below once waitforsync has been merged +# geth \ +# 2> >(tee "$chaindir/geth.log" | grep --line-buffered Success | sed 's/^/geth: /' >&2) \ +# --datadir "$chaindir" --networkid "$CHAINID" --port="$port" \ +# --mine --miner.threads=1 --allow-insecure-unlock \ +# --http --http.api "web3,eth,net,debug,personal,statediff" --http.corsdomain '*' --http.vhosts '*' --nodiscover \ +# --http.addr="$RPC_ADDRESS" --http.port="$RPC_PORT" --syncmode=full --gcmode=archive \ +# --statediff --statediff.db.host="$DB_HOST" --statediff.db.port="$DB_PORT" --statediff.db.user="$DB_USER" \ +# --statediff.db.password="$DB_PASSWORD" --statediff.db.name="$DB_NAME" \ +# --statediff.db.nodeid 1 --statediff.db.clientname test1 --statediff.writing="$DB_WRITE" \ +# --statediff.db.type="$DB_TYPE" --statediff.db.driver="$DB_DRIVER" --statediff.waitforsync="$DB_WAIT_FOR_SYNC" \ +# --ws --ws.addr="0.0.0.0" --unlock="$(IFS=,; echo "${address[*]}")" --password=<(exit) & + +geth \ + 2> >(tee "$chaindir/geth.log" | grep --line-buffered Success | sed 's/^/geth: /' >&2) \ + --datadir "$chaindir" --networkid "$CHAINID" --port="$port" \ + --mine --miner.threads=1 --allow-insecure-unlock \ + --http --http.api "web3,eth,net,debug,personal,statediff" --http.corsdomain '*' --http.vhosts '*' --nodiscover \ + --http.addr="$RPC_ADDRESS" --http.port="$RPC_PORT" --syncmode=full --gcmode=archive \ + --statediff --statediff.db.host="$DB_HOST" --statediff.db.port="$DB_PORT" --statediff.db.user="$DB_USER" \ + --statediff.db.password="$DB_PASSWORD" --statediff.db.name="$DB_NAME" \ + --statediff.db.nodeid 1 --statediff.db.clientname test1 --statediff.writing="$DB_WRITE" \ + --statediff.db.type="$DB_TYPE" --statediff.db.driver="$DB_DRIVER" \ + --ws --ws.addr="0.0.0.0" --unlock="$(IFS=,; echo "${address[*]}")" --password=<(exit) & + +gethpid=$! + +clean() { + ( set -x; kill -INT $gethpid; wait ) + if [[ $SAVE ]]; then + echo >&2 "dapp-testnet: saving $gethdir/snapshots/$SAVE" + mkdir -p "$gethdir/snapshots/$SAVE" + cp -r "$chaindir/keystore" "$gethdir/snapshots/$SAVE" + cp -r "$chaindir/config" "$gethdir/snapshots/$SAVE" + geth >/dev/null 2>&1 --datadir "$chaindir" \ + export "$gethdir/snapshots/$SAVE/backup" + fi + ( set -x; rm -rf "$chaindir" ) +} +trap clean EXIT + +until curl -s "$ETH_RPC_URL"; do sleep 1; done + +# UPDATE +#ETH_FROM=$(seth --rpc-url="$ETH_RPC_URL" rpc eth_coinbase) +#export ETH_FROM +export ETH_KEYSTORE=$chaindir/keystore +export ETH_PASSWORD=/dev/null +printf 'dapp-testnet: Account: %s (default)\n' "${address[0]}" >&2 + +[[ "${#address[@]}" -gt 1 ]] && printf 'dapp-testnet: Account: %s\n' "${address[@]:1}" >&2 + +while true; do sleep 3600; done \ No newline at end of file diff --git a/foundry/deployments/local-private-network/docker-compose.yml b/foundry/deployments/local-private-network/docker-compose.yml new file mode 100644 index 000000000000..b5ef47d2015f --- /dev/null +++ b/foundry/deployments/local-private-network/docker-compose.yml @@ -0,0 +1,37 @@ +version: "3.2" + +services: + foundry: + restart: unless-stopped + depends_on: + - ipld-eth-db + build: ./ + environment: + DB_USER: vdbm + DB_NAME: vulcanize_testing + DB_HOST: ipld-eth-db + DB_PORT: 5432 + DB_PASSWORD: password + DB_WRITE: "true" + DB_TYPE: postgres + DB_DRIVER: sqlx + DB_WAIT_FOR_SYNC: "true" + ports: + - "127.0.0.1:8545:8545" + - "127.0.0.1:8546:8546" + + ipld-eth-db: + restart: always + image: vulcanize/ipld-eth-db:v3.0.6 + environment: + POSTGRES_USER: "vdbm" + POSTGRES_DB: "vulcanize_testing" + POSTGRES_PASSWORD: "password" + volumes: + - vdb_db_eth_server:/var/lib/postgresql/data + ports: + - "127.0.0.1:8077:5432" + command: ["postgres", "-c", "log_statement=all"] + +volumes: + vdb_db_eth_server: diff --git a/foundry/deployments/local-private-network/start-private-network.sh b/foundry/deployments/local-private-network/start-private-network.sh new file mode 100755 index 000000000000..0b8117ffbb29 --- /dev/null +++ b/foundry/deployments/local-private-network/start-private-network.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -ex + +# clean up +trap 'killall geth && rm -rf "$TMPDIR"' EXIT +trap "exit 1" SIGINT SIGTERM + +TMPDIR=$(mktemp -d) +/bin/bash deploy-local-network.sh --rpc-addr 0.0.0.0 --chain-id 4 --db-user $DB_USER --db-password $DB_PASSWORD --db-name $DB_NAME \ + --db-host $DB_HOST --db-port $DB_PORT --db-write $DB_WRITE --dir "$TMPDIR" --address $ADDRESS \ + --db-type $DB_TYPE --db-driver $DB_DRIVER --db-waitforsync $DB_WAIT_FOR_SYNC & +echo "sleeping 90 sec" +# give it a few secs to start up +sleep 90 + +#read -r ACC BAL <<< "$(seth ls --keystore "$TMPDIR/8545/keystore")" +#echo $ACC +#echo $BAL +# +# +## Deploy a contract: +#solc --bin --bin-runtime docker/stateful.sol -o "$TMPDIR" +#A_ADDR=$(seth send --create "$(<"$TMPDIR"/A.bin)" "constructor(uint y)" 1 --from "$ACC" --keystore "$TMPDIR"/8545/keystore --password /dev/null --gas 0xfffffff) +# +#echo $A_ADDR +# +## Call transaction +# +#TX=$(seth send "$A_ADDR" "off()" --gas 0xffff --password /dev/null --from "$ACC" --keystore "$TMPDIR"/8545/keystore --async) +#echo $TX +#RESULT=$(seth run-tx "$TX") +#echo $RESULT + +# Run forever +tail -f /dev/null \ No newline at end of file