lightstreams-network / lightchain

Fast proof-of-authority blockchain based on go-ethereum and tendermint
https://lightstreams.network
GNU General Public License v3.0
55 stars 16 forks source link

how to lightchain Start multi-node ??? #197

Open liuqihang opened 5 years ago

liuqihang commented 5 years ago

I would like to ask how to start lightchain multi-node I start mainnet or Sirius, the console will appear err="dial TCP 88.198.36.61:26656: I /o timeout" Or err="auth failure:secret conn failed: EOF"

ggarri commented 5 years ago

Hi @liuqihang

You can run as many local nodes as you wish but you have to manually specify different ports for each of the connectivities across inner services and across peers. You can see more about which ports are being used here.

You can try to run two nodes using the following flags.

// Launch Node 1
$> lightchain run --rpc --rpcport 8545 --ws --wsport 8556 --tmt_rpc_port=26657 --tmt_p2p_port=26656

// Launch Node 2
$> lightchain run --rpc --rpcport 9545 --ws --wsport 9556 --tmt_rpc_port=26757 --tmt_p2p_port=26756
liuqihang commented 5 years ago

@ggarri ,Thank you for your answer。 I want to achieve synchronization between two nodes. such as: ethereum :Ether's admin.addPeers("nodeinfo") module,I tried it through the "geth" and "leth" in the lightchain, but, Viewed by net.peers(), did not see an increase in the number of nodes。 How can lightchain achieve synchronization between nodes? thanks

ggarri commented 5 years ago

Hi @liuqihang

I am not sure of what is your issue. Are you trying to create a private network using lightchain? If so, you need to create your own:

To do that you could initialize two new nodes using:

$ lightchain init --datadir=${DATADIR_NODE1} --standalone
$ lightchain init --datadir=${DATADIR_NODE2} --standalone

Then you have to copy those two genesis files from node1 to node2 (or in the other way around):

$> cp ${DATADIR_NODE1}/database/genesis.json ${DATADIR_NODE2}/database/genesis.json
$> cp ${DATADIR_NODE1}/consensus/config/genesis.json ${DATADIR_NODE2}/consensus/config/genesis.json

And at last you need to edit the consensus config of both nodes to add the peer ids by editing ${DATADIR}/consensus/config/config.json as follow:

...
persistent_peers = ${CONSENSUS_NODE_ID}@localhost:26656
...

To know which is the CONSENSUS_NODE_ID, having the lightchain node running($lightchain run...) you can run the following curl request

$> curl -s localhost:26657/status
{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "node_info": {
      "protocol_version": {
        "p2p": "7",
        "block": "9",
        "app": "0"
      },
      "id": "33aae239346419a3e57ff7119ecf8eb53b7fa2cc",
...

Then, at the output you have the "id", which corresponds to the CONSENSUS_NODE_ID. Remember that you need to repeat that process for both nodes and the ports might change depending on your lightchain run command

liuqihang commented 5 years ago

I follow this method, starting the standalone mode。 ` ./lightchain init --datadir ${DATADIR_NODE1}/lightchain --standalone ./lightchain run --datadir= ${DATADIR_NODE1}/lightchain --rpc --rpcaddr=0.0.0.0 --ws --rpcport 8545 --wsport 8546 --tmt_p2p_port 26656 --tmt_rpc_port 26657

./lightchain init --datadir ${DATADIR_NODE2}/lightchain2 --standalone` ./lightchain run --datadir= ${DATADIR_NODE2}/lightchain2 --rpc --rpcaddr=0.0.0.0 --ws --rpcport 7545 --wsport 7546 --tmt_p2p_port 46656 --tmt_rpc_port 46657

Guaranteed the same genesis.json。 update ${DATADIR_NODE1}lightchain/consensus/config/config.toml --> curl -s localhost:26657/status { "jsonrpc": "2.0", "id": "", "result": { "node_info": { "protocol_version": { "p2p": "7", "block": "9", "app": "0" }, "id": "f4fef2b81aab2cf08001a4bc88ba4c225f9db34e", "listen_addr": "tcp://0.0.0.0:26656", "network": "lightstreams-sirius-testnet", persistent_peers="f4fef2b81aab2cf08001a4bc88ba4c225f9db34e@0.0.0.0:26656"

update ${DATADIR_NODE2}lightchain2/consensus/config/config.toml --> curl -s localhost:46657/status { "jsonrpc": "2.0", "id": "", "result": { "node_info": { "protocol_version": { "p2p": "7", "block": "9", "app": "0" }, "id": "16c7db43491b9becf37783bb363798395df33038", "listen_addr": "tcp://0.0.0.0:46656", "network": "lightstreams-sirius-testnet",

persistent_peers="16c7db43491b9becf37783bb363798395df33038@0.0.0.0:46656"

Then enter the "geth" console: ${DATADIR_NODE1}lightchain/database/geth.ipc `admin { datadir: "/home/lqh/lightchain/database", nodeInfo: { enode: "enode://f953909de4806eabaa0e2a85a3793ec445dd68d7a7b0a6793d000e98e3b5727fd8dd10b961c23c6854bc07b7c7bb527f6459de49a62eb324b8e6d7113fc7a0bb@121.71.185.114:30303?discport=0", enr: "0xf889b84047c6d4a9dfdc920877c9f570d0364b5d55e3aec5904bb1348f4aeeb6b20e971425304f8bc875889b175a166f3dbf9bc4c24f3805f91ddbc294631c4b3550629a0383636170c0826964827634826970847947b97289736563703235366b31a103f953909de4806eabaa0e2a85a3793ec445dd68d7a7b0a6793d000e98e3b5727f8374637082765f", id: "9edfe04a28bdf5d5c08275b718d9293009e176a1ae5d2d31fb542467f23684bc", ip: "121.71.185.114", listenAddr: "[::]:30303", name: "./v1.8.27/linux-amd64/go1.12.5", ports: { discovery: 0, listener: 30303 }, protocols: {} },

admin.addPeer("enode://550481d4f08c7d6ea7bf1acd3c4ea84c04d89e36d78942e5f3c5c56feba65394f52367e34d44be6c042bbd32529bd4c2ef271fd1e13e380550875ef69f0fd4f4@121.71.185.114:30303?discport=0") true

net { listening: true, peerCount: 0, version: "162", getListening: function(callback), getPeerCount: function(callback), getVersion: function(callback) }

`net.peerCount is 0

${DATADIR_NODE2}lightchain2/database/geth.ipc

admin { datadir: "/home/lqh/lightchain2/database", nodeInfo: { enode: "enode://550481d4f08c7d6ea7bf1acd3c4ea84c04d89e36d78942e5f3c5c56feba65394f52367e34d44be6c042bbd32529bd4c2ef271fd1e13e380550875ef69f0fd4f4@121.71.185.114:30303?discport=0", enr: "0xf889b840d775ae737a5aa2f419fc3d059d304358e512ba545ba1b3f07b298ec3dbad145027537dbc1dbcc8be9518b642d902aee8600805512c835e8464aae1aea1a21cd50383636170c0826964827634826970847947b97289736563703235366b31a102550481d4f08c7d6ea7bf1acd3c4ea84c04d89e36d78942e5f3c5c56feba653948374637082765f", id: "63958a38d24f6833143be0911bf4c45405da35aea4302a26b4a9f68456f589ec", ip: "121.71.185.114", listenAddr: "[::]:30303", name: "./v1.8.27/linux-amd64/go1.12.5", ports: { discovery: 0, listener: 30303 }, protocols: {} },

Where can I operate incorrectly? ggarri。I want to see each other's information in two nodes. For example, node1 can query the account balance of node2. Ethereum can be queried after synchronization of two private chain nodes, I think lightchain is also possible

ggarri commented 5 years ago

as fas as I can see there is only one incorrect step, when you added the persistent_peers at the consensus/config/config.toml you have to cross the peers in order to find each, I mean.

  1. At ${DATADIR_NODE1}lightchain/consensus/config/config.toml you should have:

    persistent_peers="16c7db43491b9becf37783bb363798395df33038@127.0.0.1:46656"
  2. At ${DATADIR_NODE2}lightchain/consensus/config/config.toml you should have:

    persistent_peers="f4fef2b81aab2cf08001a4bc88ba4c225f9db34e@127.0.0.1:46656"

In addition, just to mention that the method admin.addPeer() is not operative for now in our network because we replaced the original ethereum PoW by the tendermint PoC and we didn't have time to implement that integration (https://github.com/lightstreams-network/lightchain/issues/198) and the call to net.peers was implemented very recently https://github.com/lightstreams-network/lightchain/commit/1209e6e831ec57b468a63e577f324723fb17b3e0 so please ensure you are using the latest version available at the master branch