# EOS self-build testnet
## reference
1. [4.5. 啟動 EOS 節點](http://netkiller.sourceforge.net/blockchain/eos/eos.launch.html)
2. [CryptoLions/EOS-MainNet](https://github.com/CryptoLions/EOS-MainNet)
3. [EOSIO dawn4.0 节点部署方案](https://github.com/eosstore/eosio-dawn4.0/wiki/EOSIO-dawn4.0-%E8%8A%82%E7%82%B9%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88)
---
```shell=
docker run -d -it -p 8881:8080/tcp -p 8891:8888/tcp --name eos1 tony92151/eos_lab:v3
```
```shell=
docker run -d -it -p 8882:8080/tcp -p 8892:8888/tcp --name eos2 tony92151/eos_lab:v3
```
Go to web env (http://localhost:8881) and continue.
```shell=
mkdir -p ~/.local/share/eosio/nodeos/config
cd ~/.local/share/eosio/nodeos/config
wget https://gist.githubusercontent.com/tony92151/bf303abffd06f11d296e02b99da4bf91/raw/c1cc2158648f630c1212e186cf8d998febc10770/config.inii
wget https://genesis.testnet.eos.io/genesis.json
nodeos -e -p eosio --genesis-json /root/.local/share/eosio/nodeos/config/genesis.json
nodeos -e -p eosio \
--plugin eosio::producer_plugin \
--plugin eosio::producer_api_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::net_api_plugin \
--plugin eosio::http_plugin \
--plugin eosio::history_plugin \
--plugin eosio::history_api_plugin \
--filter-on="*" \
--access-control-allow-origin='*' \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors \
--http-server-address=0.0.0.0:8888 \
--genesis-json /root/.local/share/eosio/nodeos/config/genesis.json \
--config-dir=/root/.local/share/eosio/nodeos
nodeos --producer-name inita \
--plugin eosio::chain_api_plugin \
--plugin eosio::net_api_plugin \
--http-server-address 0.0.0.0:8888 \
--p2p-listen-endpoint 172.17.0.2:8888 \
--p2p-peer-address 00.0.0.0:9876
```
```shell=
nodeos -e -p eosio \
--plugin eosio::producer_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--plugin eosio::history_plugin \
--plugin eosio::history_api_plugin \
--filter-on="*" \
--access-control-allow-origin='*' \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors \
--http-server-address=0.0.0.0:8888
```
Done!

## Set accounts for Vote
Reference
[How to Vote for an EOS Block Producer | Step-by-Step Instructions](https://coincentral.com/how-to-vote-for-an-eos-block-producer/)
```shell=
cleos -u http://172.17.0.2:8888 wallet create -n tony --to-console
cleos -u http://172.17.0.2:8888 wallet import -n tony
# 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
cleos -u http://172.17.0.2:8888 wallet create_key -n tony
# this command create one key pair (public & private key. Remember this)
cleos -u http://172.17.0.2:8888 create account eosio john {public key} -p eosio@active
cleos -u http://172.17.0.2:8888 wallet private_keys -n tony
# wallet key
```
## Use Anchor (EOS wallet GUI manager)
Github : [Anchor](https://github.com/greymass/anchor)
Remember these two informations and `Endpoint`

Open Anchor app and click `Setup New Wallet` > `Custom Blockchain`


Enter the information mentioned above and `save`

`Select` and `Enable`

Go to `eosio testnet` > `Import account`

click `Import Private key`

:::warning
You need to set wallet password when init wallet
:::
Use `john` private key to import account

Done!

## other monitor
https://eosauthority.com/?network=eos#recentBlocks
https://medium.com/@auroraeos/eos-voting-guide-3bf4e0be251b
## `nodeos` note
:::info
```shell=
nodeos \
-e -p eosio \
--data-dir /users/mydir/eosio/data \
--config-dir /users/mydir/eosio/config \
--plugin eosio::producer_plugin \
--plugin eosio::chain_plugin \
--plugin eosio::http_plugin \
--plugin eosio::state_history_plugin \
--contracts-console \
--disable-replay-opts \
--access-control-allow-origin='*' \
--http-validate-host=false \
--verbose-http-errors \
--state-history-dir /shpdata \
--trace-history \
--chain-state-history
```
enabling block production (-e)
identifying itself as block producer "eosio" (-p)
setting the blockchain data directory (--data-dir)
setting the config.ini directory (--config-dir)
loading plugins **producer_plugin**, chain_plugin, http_plugin, state_history_plugin (--plugin)
passing chain_plugin options (--contracts-console, --disable-replay-opts)
passing http-plugin options (--access-control-allow-origin, --http-validate-host, --verbose-http-errors)
passing state_history options (--state-history-dir, --trace-history, --chain-state-history)
redirecting both stdout and stderr to the nodeos.log file
returning to the shell by running in the background (&)
:::
### node have two type
* Producing Node
* Non-Producing Node
`Producing Nodes`配置用於塊生產。他們連接到對等網絡並積極產生新的區塊。鬆散的交易也將得到驗證和轉發。在主網上,`Producing Nodes`僅當分配的塊生產者是活動計劃的一部分時才產生塊。 :+1:
`Non-Producing Nodes`連接到對等網絡,但不主動產生新的區塊;它們可用作代理節點,**中繼API調用**,驗證交易,向其他節點廣播信息等,`Non-Producing Nodes`也可用於監視區塊鏈狀態。
### Producing node :+1:
**Steps**
Please follow the steps below to set up a producing node:
1. Register your account as a producer
2. Set Producer Name
3. Set the Producer's signature-provider
4. Define a peers list
5. Load the Required Plugins
:::info
```shell=
cleos system regproducer accountname1 EOS1234534... http://producer.site Antarctica
```
`account` TEXT - The account to register as a producer
`producer_key` TEXT - The producer's public key
`url` TEXT - URL where info about producer can be found
`location` UINT - Relative location for purpose of nearest neighbor scheduling
usage [System Regproducer](https://developers.eos.io/manuals/eos/latest/cleos/command-reference/system/system-regproducer)
:::
```shell=
cleos -u http://172.17.0.2:8888 system regproducer sally2 EOS8mJTwm9keuYiuzzwpvFch8y2skuPnJGhjwbwTXHCtP9UPo9rJ6 -p sally2@active
```
## Node2
```shell=
nodeos -e -p eosio \
--plugin eosio::producer_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--plugin eosio::history_plugin \
--plugin eosio::history_api_plugin \
--filter-on="*" \
--access-control-allow-origin='*' \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors \
--http-server-address=0.0.0.0:8888
```
## Init node contract
[EOS V2.0.x 部署eosio.bios合约,需先激活 WTMSIG_BLOCK_SIGNATURES 共识](https://www.bcskill.com/index.php/archives/884.html)
```shell=
git clone --branch add-boot-contract https://github.com/EOSIO/eosio.contracts.git
cd eosio.contracts
./build.sh && cd
curl -X POST http://172.17.0.2:8888/v1/chain/get_activated_protocol_features -d '{}' | jq
curl -X POST http://172.17.0.2:8888/v1/producer/schedule_protocol_feature_activations -d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}' | jq
curl -X POST http://172.17.0.2:8888/v1/chain/get_activated_protocol_features -d '{}' | jq
cleos -u http://172.17.0.2:8888 set contract eosio eosio.contracts/build/contracts/eosio.boot -p eosio@active
cleos -u http://172.17.0.2:8888 set contract eosio eosio.contracts/build/contracts/eosio.bios -p eosio@active
cleos -u http://172.17.0.2:8888 set contract eosio eosio.contracts/build/contracts/eosio.system -p eosio@active
```
see [here](https://developers.eos.io/manuals/eos/latest/nodeos/usage/development-environment/local-multi-node-testnet)
```shell=
export node_name=john
export noden_key=EOS56sE3Xx7vtaQazDPj3ExEVjGm7G5iXT3CH6ezkKsovp6XyFjW4
export noden_pkey=5Kgp1QswMvDuXbgZNiRiCzhTA7hecaRbKgytgZyFFfYAPR1n8jH
```
```shell=
nodeos --producer-name $node_name \
--plugin eosio::chain_api_plugin \
--plugin eosio::net_api_plugin \
--http-server-address 0.0.0.0.0:8889 \
--p2p-listen-endpoint 0.0.0.0:9877 \
--p2p-peer-address 172.17.0.2:9876 \
--private-key [\"$noden_key\",\"$noden_pkey\"]
```
註冊為生產者 :X:
```shell=
cleos -u http://172.17.0.2:8888 push action eosio setprods "{ \"schedule\": [{\"producer_name\": \"inita\",\"block_signing_key\": \"EOS56sE3Xx7vtaQazDPj3ExEVjGm7G5iXT3CH6ezkKsovp6XyFjW4\", \"authority\": [\"EOS56sE3Xx7vtaQazDPj3ExEVjGm7G5iXT3CH6ezkKsovp6XyFjW4\"]}]}" -p eosio@active
cleos -u http://172.17.0.2:8888 push action eosio setprods "{ \"schedule\": [{\"authority\": [{\"producer_name\": \"inita\",\"block_signing_key\": \"EOS56sE3Xx7vtaQazDPj3ExEVjGm7G5iXT3CH6ezkKsovp6XyFjW4\"}]}]}" -p eosio@active
cleos -u http://172.17.0.2:8888 push action eosio setprods '{"schedule": [{"producer_name": "inita","block_signing_key": "EOS56sE3Xx7vtaQazDPj3ExEVjGm7G5iXT3CH6ezkKsovp6XyFjW4"}]}' -p eosio@active
```
### FIX
[see](https://eosio.stackexchange.com/questions/5234/action-setprods-on-eosio-v2-0-private-chain)
```shell=
cleos -u http://localnetwork.com:8888 push action eosio setprods "testnetprods.json" -p eosio@active
```
```json=
{
"schedule": [
{
"producer_name": "eosio",
"authority": [
"block_signing_authority_v0",
{
"threshold": 1,
"keys": [
{
"key": "EOS8xxxx",
"weight": 1
}
]
}
]
}
]
}
```

## web GUI tool
https://eosauthority.com/wallet/stake?network=localtest&endpoint=http:%2F%2Flocalhost:8891&token_symbol=QAQ

## READ EOS解读--配置文件
[EOS解读--配置文件](https://www.jianshu.com/p/02e2db11d152)
```ini=
http-server-address = 0.0.0.0:8888 #这里设置四个0代表本地可以通过localhost或者127.0.0.1调用http接口,同时外部可以通过本机固定ip访问。
p2p-listen-endpoint = 0.0.0.0:9876 #p2p网络本机监听端口,监听外部接入的p2p节点,这里的四个0的ip配置意义同上。
bnet-endpoint = 0.0.0.0:4321 #bnet是使用一个非常简单的算法来同步两条区块链。主要工作是两条链上的确权,共识,广播,同步区块,保持默认配置即可。
p2p-peer-address = ip:port #对端p2p节点地址,可以设置多个。
enable-stale-production = true #意思是可以不经过确权直接出块,单节点时要配置为true,多节点出块由于需要各方确权共识,要配置为false。
producer-name = eosio #出块者,创世块,默认eosio账户
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 ,密钥对,公钥加私钥,对应eosio账户,这对秘钥是写死的,不可改变。
```