6

I implemented a PoA system successfully. But after the initial setup (eg two nodes), how are new nodes added? I understand that the acceptance of a new node is a voting process but I am not certain how that is implemented.

Here is the link I used for the setup - https://hackernoon.com/setup-your-own-private-proof-of-authority-ethereum-network-with-geth-9a0a3750cda8

Output from machine 2 (which has nodes 3,4). Nodes 1,2 are on machine 1 and they both are signers. It shows on node 3 that the account is unlocked but it is not authorised.

more nohup.out INFO [04-14|17:22:17] Maximum peer count
ETH=25 LES=0 total=25 INFO [04-14|17:22:17] Starting peer-to-peer node instance=Geth/v1.8.2-stable-b8b9f7f4/linux-amd64/go1.9.4 INFO [04-14|17:22:17] Allocated cache and file handles
database=/home/satoshimaca/blockchain2/node3/geth/chaindata cache=7 68 handles=512 INFO [04-14|17:22:18] Initialised chain configuration
config="{ChainID: 1515 Homestead: 1 DAO: DAOSupport: false EI P150: 2 EIP155: 3 EIP158: 3 Byzantium: 4 Constantinople: Engine: clique}" INFO [04-14|17:22:18] Initialising Ethereum protocol
versions="[63 62]" network=1515 INFO [04-14|17:22:18] Loaded most recent local header number=0 hash=fdb68b…8a634f td=1 INFO [04-14|17:22:18] Loaded most recent local full block number=0 hash=fdb68b…8a634f td=1 INFO [04-14|17:22:18] Loaded most recent local fast block number=0 hash=fdb68b…8a634f td=1 INFO [04-14|17:22:18] Loaded local transaction journal transactions=0 dropped=0 INFO [04-14|17:22:18] Regenerated local transaction journal
transactions=0 accounts=0 INFO [04-14|17:22:18] Starting P2P networking INFO [04-14|17:22:20] UDP listener up
self=enode://7b13a6dc2fd5de476b2a579d702a36ec37587dad1cef7f99501835 4928a279a7733635e3cbd3b2fa1a261c2b37638f2aa46195bc7e1ebfa3c1875c84ecbc8087@[::]:30313 INFO [04-14|17:22:20] RLPx listener up
self=enode://7b13a6dc2fd5de476b2a579d702a36ec37587dad1cef7f99501835 4928a279a7733635e3cbd3b2fa1a261c2b37638f2aa46195bc7e1ebfa3c1875c84ecbc8087@[::]:30313 INFO [04-14|17:22:20] IPC endpoint opened
url=/home/satoshimaca/blockchain2/node3/geth.ipc INFO [04-14|17:22:20] HTTP endpoint opened url=http://localhost:8503
cors= vhosts=local host INFO [04-14|17:22:21] Unlocked account
address=0xC08832c6cB6df14340F3866B293a705FB9bc378B INFO [04-14|17:22:21] Transaction pool price threshold updated price=1 INFO [04-14|17:22:21] Etherbase automatically configured
address=0xC08832c6cB6df14340F3866B293a705FB9bc378B INFO [04-14|17:22:21] Starting mining operation INFO [04-14|17:22:21] Commit new mining work number=1 txs=0 uncles=0 elapsed=226.085µs WARN [04-14|17:22:21] Block sealing failed
err=unauthorized

Here is the connection for node 3 -

nohup geth --datadir node3/ --syncmode 'full' --port 30313 --rpc --rpcaddr 'localhost' --rpcport 8503 --rpcapi 'personal,db,eth,ne t,web3,txpool,miner' --bootnodes 'enode://601ade737b81f16abdd0ce9983b63eb12050c4ef89c46b8fdbf3e3e6c951cc02dffe36f87200033107cf8b00 7355e780fba16b67d1d46603b1321f07314ea46b@10.132.0.2:30310' --networkid 1515 --gasprice '1' -unlock 'c08832c6cb6df14340f3866b293a70 5fb9bc378b' --password node3/pwdnode3.txt --mine &

Geth on node 1 gives these peers and this enode -

> admin

{ datadir: "/home/satoshimaca/blockchain/node1", nodeInfo: { enode: "enode://64793e6e791115d315550d651cda00342b688ba36728b3d8070b04f4513ff65eb15ffb8f66387f1733340d8732e6ca956f0825cd3fc4e67686e04f63c5d0abc4@[::]:30311", id: "64793e6e791115d315550d651cda00342b688ba36728b3d8070b04f4513ff65eb15ffb8f66387f1733340d8732e6ca956f0825cd3fc4e67686e04f63c5d0abc4", ip: "::", listenAddr: "[::]:30311", name: "Geth/v1.8.2-stable-b8b9f7f4/linux-amd64/go1.9.4", ports: { discovery: 30311, listener: 30311 }, protocols: { eth: { config: {...}, difficulty: 15290, genesis: "0x702d8ca9647d171a6596a775888f71c7c0f3ddb011fbffcb921be685b2ef33b7", head: "0x574671023088dd06c2127cee4e2a70e30782ed3f525d28b537294ac0f3297099", network: 1515 } } }, peers: [{ caps: ["eth/62", "eth/63"], id: "d889d565b3ddc37491d131aed1c23d0a7b30a185bb925f325c7830b2ae710bc127010487f39f32d889afd1284ea31aa893adddda2197f2763485926970620381", name: "Geth/v1.8.2-stable-b8b9f7f4/linux-amd64/go1.9.4", network: { inbound: true, localAddress: "127.0.0.1:30311", remoteAddress: "127.0.0.1:54108", static: false, trusted: false }, protocols: {

From node 1 - acct 1 is definitely a signer and it is unlocked but then is not authorised.

> clique.getSigners()

["0xc08832c6cb6df14340f3866b293a705fb9bc378b", "0xfc1bdf06d1150e6eeeb229a8500b09df8ccdcbbd", "0xfcad53c780a4f6c66b3daca331fe72fc6559c367"]

Trevor Oakley
  • 777
  • 9
  • 20
  • 1
    I did more checking and found that votes are needed which appears to be a manual process. But I am unsure once the decision is made about who will have a new master node or mining node then how that is implemented. – Trevor Oakley Apr 13 '18 at 14:18

1 Answers1

4

Adding a new node as sealer is simple as calling:

clique.propose(<NEWSEALER>, true)

You will need 50% + 1 votes.

See How to add new Sealer in Geth 1.6 Proof of Authority? for more details.

For the details on the specification see EIP 225 - https://github.com/ethereum/EIPs/issues/225

ivicaa
  • 7,519
  • 1
  • 20
  • 50
  • 1
    If the nodes are on different machines in google cloud, how can the signing node know about the other accounts? I had the issue before when the listAccounts only showed some of the accounts under PoW. Will the signer know about all the accounts due to the bootnode? – Trevor Oakley Apr 14 '18 at 04:37
  • 1
    He doesn't need to know if the proposed sealer account actually exists. It's simply proposing an address. – ivicaa Apr 14 '18 at 04:45
  • 1
    I added clique.propose and it shows in clique.proposals. It just sits in proposals. I did the proposal on the two signing nodes. How is the proposal now approved? Is there a clique.approve equivalent? – Trevor Oakley Apr 14 '18 at 06:22
  • 1
    After your both sealers have called the function than you habe to wait few blocks till it takes effect. – ivicaa Apr 14 '18 at 08:57
  • 1
    I can connect now from the remote node but it states unauthorised when I attempt to mine. I can use the initial machine which has nodes1,2 but node3 remotely does not work. Is there any diagnostics tool to use? Geth on the initial machine shows 2 peers. – Trevor Oakley Apr 14 '18 at 17:34
  • 1
    Your sealer account has to be eth.coinbase and it has to be unlocked. Moreover, you should query via clique object who the sealers are. – ivicaa Apr 14 '18 at 17:55
  • 1
    I added some geth output in the question as an edit. I added clique and then the address and the proposals were cleared (I assume accepted). There must be a way to check what proposals were accepted. – Trevor Oakley Apr 14 '18 at 18:28
  • 1
    I think I have it - clique.getSigners. I am just checking now. – Trevor Oakley Apr 14 '18 at 18:32