diff --git a/cmd/network/show.go b/cmd/network/show.go index 3f13ad16..85cdbf8b 100644 --- a/cmd/network/show.go +++ b/cmd/network/show.go @@ -14,6 +14,7 @@ import ( consensusPretty "github.com/oasisprotocol/oasis-core/go/common/prettyprint" "github.com/oasisprotocol/oasis-core/go/consensus/api/transaction" registry "github.com/oasisprotocol/oasis-core/go/registry/api" + roothash "github.com/oasisprotocol/oasis-core/go/roothash/api" staking "github.com/oasisprotocol/oasis-core/go/staking/api" "github.com/oasisprotocol/oasis-core/go/staking/api/token" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/connection" @@ -33,10 +34,11 @@ const ( selValidators selNativeToken selGasCosts + selCommittee ) var showCmd = &cobra.Command{ - Use: "show { | entities | nodes | paratimes | validators | native-token | gas-costs }", + Use: "show { | entities | nodes | paratimes | validators | native-token | gas-costs | committee }", Short: "Show network properties", Long: "Show network property stored in the registry, scheduler, genesis document or chain. Query by ID, hash or a specified kind.", Args: cobra.ExactArgs(1), @@ -56,6 +58,11 @@ var showCmd = &cobra.Command{ consensusConn := conn.Consensus() registryConn := consensusConn.Registry() + ctrlConn := conn.Control() + nodeStatus, err := ctrlConn.GetStatus(ctx) + cobra.CheckErr(err) + roothashConn := consensusConn.RootHash() + // Figure out the height to use if "latest". height, err := common.GetActualHeight( ctx, @@ -195,6 +202,39 @@ var showCmd = &cobra.Command{ fmt.Println() } return + case selCommittee: + for _, runtime := range nodeStatus.Runtimes { + descriptor := runtime.Descriptor + if descriptor != nil { + runtimeID := descriptor.ID + paratimeName := getParatimeName(cfg, runtimeID.String()) + + fmt.Println("=== COMMITTEE ===") + fmt.Printf("Paratime: %s(%s)\n", paratimeName, runtimeID) + fmt.Printf("Height: %d\n", height) + fmt.Println() + state, err := roothashConn.GetRuntimeState(ctx, &roothash.RuntimeRequest{ + Height: height, + RuntimeID: runtimeID, + }) + cobra.CheckErr(err) + + for i, member := range state.Committee.Members { + nodeQuery := ®istry.IDQuery{ + Height: height, + ID: member.PublicKey, + } + + node, err := consensusConn.Registry().GetNode(ctx, nodeQuery) + cobra.CheckErr(err) + + fmt.Printf("%2d, entityID: %s, nodeID: %s, role: %s\n", i, node.EntityID, member.PublicKey.String(), member.Role.String()) + } + } + fmt.Println() + } + return + default: // Should never happen. } @@ -242,6 +282,8 @@ func selectorFromString(s string) propertySelector { return selNativeToken case "gas-costs": return selGasCosts + case "committee": + return selCommittee } return selInvalid } diff --git a/docs/network.md b/docs/network.md index 74f829c3..d15b1f46 100644 --- a/docs/network.md +++ b/docs/network.md @@ -324,6 +324,14 @@ Above, we can see that the [maximum amount of gas](./account.md#gas-limit) our transaction can spend must be set to at least 1000 **gas units**, otherwise it will be rejected by the network. +#### `committee` {#committee} + +Shows runtime committees. + +![code shell](../examples/network-show/committee.in.static) + +![code](../examples/network-show/committee.out.static) + #### `` {#show-id} The provided ID can be one of the following: diff --git a/examples/network-show/committee.in.static b/examples/network-show/committee.in.static new file mode 100644 index 00000000..7fee7562 --- /dev/null +++ b/examples/network-show/committee.in.static @@ -0,0 +1 @@ +oasis network show committee diff --git a/examples/network-show/committee.out.static b/examples/network-show/committee.out.static new file mode 100644 index 00000000..5e3d6de0 --- /dev/null +++ b/examples/network-show/committee.out.static @@ -0,0 +1,96 @@ +=== COMMITTEE === +Paratime: cipher(000000000000000000000000000000000000000000000000e199119c992377cb) +Height: 19183812 + + 0, entityID: 6reBpCKHsqMX1Y26o3p5V+95in5ka16I969CWyiRudY=, nodeID: J4KhkfzhgQA+IibrTqq9Uh19COxoOy+5fWvtvOfIo9w=, role: worker + 1, entityID: hNBVs2ay1IWvufQwX0TbYA6X4ocKaMpzpyaMTHggi6Q=, nodeID: bKvnByvx8qwF41EqOG6wdmatGzz/qT2nbHC8i8VM65k=, role: worker + 2, entityID: p1VsfSsedbKn/5GzkPsr15XD+/AOIfbPda1/2yT84N4=, nodeID: a/BCcmjawMU5EHQk+mGSb1GMFpU4YCze3IyOziEWihY=, role: worker + 3, entityID: AX8zJsi0DnrrdwCi/8JJptXSy62kZgQcAYKlCYD4oN8=, nodeID: BqCqG8wuMVdnONN5bysITf0mYQD5FD+TEF5wrJttsSQ=, role: worker + 4, entityID: T5k7PtOR01oZrdnZveDpO9AFpMUhEREZk7WSSfm8Gtg=, nodeID: RT7JKF5T1hlKXTYZsp4SL07f4IHG6O0SQppf8wnfr+Y=, role: worker + 5, entityID: g9UqzvW6JvfKrflRKbCPBpm41rH/O+4apCK+KkD2tG4=, nodeID: 4wqhqp5wDAfvQxNZUUSDmM2fVYrkxKq/tqjnnCe72Uw=, role: backup-worker + 6, entityID: N+3/m12DoAqzFS0yF3R/kXSkSj7pZnWhq8nRCo/MKwk=, nodeID: 82isbQ3iZxvzgBGhk9kqOuyO87h6VXkXma8dDdBkHCM=, role: backup-worker + 7, entityID: iGs5cCGos/I5KQv82MwgGMNENaxy3bhuWdFXtINcu0U=, nodeID: HH/jnBO0AqHocNg4aS7MiMjiKmta1VP0ceRc0iILMAw=, role: backup-worker + 8, entityID: p1VsfSsedbKn/5GzkPsr15XD+/AOIfbPda1/2yT84N4=, nodeID: a/BCcmjawMU5EHQk+mGSb1GMFpU4YCze3IyOziEWihY=, role: backup-worker + 9, entityID: 1YeMK0NAZtE1ZK8u6KWddkKGZoD5VLfG9EAZI3b8HzE=, nodeID: /dBEDGDBCu6TF5w9crktZ9aloTBpOGGSa6A8uVNunAo=, role: backup-worker +10, entityID: 4gbOOU09bcyvM53Up1lTnP+sLb0feniJu0OcUUPCBSs=, nodeID: +zVbgQqOdY90Z2NQKXFByNT0OwLxj/Ho4j4qT5u2yKM=, role: backup-worker +11, entityID: bTok0el8GbmUzTAAgcQ78uww/TsgeWwXpM3N2S49qBQ=, nodeID: LI48Ol5Is045ijOAjiCiKFHKOyzwuGL6mMTr3F5cMdM=, role: backup-worker +12, entityID: 7nCBfl1vRS4kn7G2yJZeZdwE8OFA4avUphWdCRrFhJM=, nodeID: 5KIv4/zhPGYQIY3YCmjQjGbZ6TVShxEgGzU++43P+t4=, role: backup-worker +13, entityID: WXs7ElBlm30la2fG4oZDpubeFu5sKkjDVeflWo+YuIA=, nodeID: ST2B7aeKSspiFNy325rIh8alQIRVCDyZ5t8f2NKN3PU=, role: backup-worker +14, entityID: RMa2ER0wvraR+4u5QOGOrRTwmMVOYNcOot7sFppPRP0=, nodeID: k0g6YN7CFSgjaPU1EjVWXhzPVmEset+3sQ3c3NJ8Ys4=, role: backup-worker +15, entityID: T5k7PtOR01oZrdnZveDpO9AFpMUhEREZk7WSSfm8Gtg=, nodeID: RT7JKF5T1hlKXTYZsp4SL07f4IHG6O0SQppf8wnfr+Y=, role: backup-worker + +=== COMMITTEE === +Paratime: emerald(000000000000000000000000000000000000000000000000e2eaa99fc008f87f) +Height: 19183812 + + 0, entityID: 7nCBfl1vRS4kn7G2yJZeZdwE8OFA4avUphWdCRrFhJM=, nodeID: 3i26uutrxeIk3rK00gzlA+aHME/+k4t4PtOGwdrqPt8=, role: worker + 1, entityID: PrCDIA3uyoLqNOZJ1PrRWdyviFn6K0PWFz91qQ9QyTw=, nodeID: o8p0FlVg1Wlv+ZLKojWS7c0P4xZHklFt9frLW4B4QlE=, role: worker + 2, entityID: L4OY/0mNEduAS9z6jh2xLp72b8gZURgcrd76AOiRIXk=, nodeID: fGqOEIbBxaM2YmMcKq4PbpUOd9+s3TcS4AxaTChGuz0=, role: worker + 3, entityID: 9+lM5vQ1g+cVzjaNM78gxw1yUegVj57tHDbpN7DKIvw=, nodeID: 6VWWzDQRONki6x2z5XAWH2+a5zZ04ljaw6aGLbnEAJ0=, role: worker + 4, entityID: AX8zJsi0DnrrdwCi/8JJptXSy62kZgQcAYKlCYD4oN8=, nodeID: BqCqG8wuMVdnONN5bysITf0mYQD5FD+TEF5wrJttsSQ=, role: worker + 5, entityID: tcon38rBr3dHmURuXOTUFpDPKwE4eOU82F121rX9esE=, nodeID: ZbybO0JMEkwg1+LdEUTh8Vmx0d9u7RUZHZnD73gWpIs=, role: worker + 6, entityID: /Foi5kZdBc70HPmlguvY6AzBILNrNiPDgKQLOITuIEI=, nodeID: +KKK2dlxTHDcRpjdn6JJLk4gy+33Au0ihh8y2r5VA4Y=, role: worker + 7, entityID: XSQLBoubhOq/X86vKIj4Xzouo1Fhe39+kLF/2PDgKpM=, nodeID: r5d6MxZK8vMb1P5y5NSzi4uiofaUk3rfAwvYw6sV3ms=, role: worker + 8, entityID: FDqRmM1FyhaGas+lquWmGAKgMsU2rj7UESAlnOHtxco=, nodeID: qnRAoObwndP/P9otTzQ/9Z2+vmSQ1Pch7G4tGBSTxCo=, role: worker + 9, entityID: iNKCs9v4NJCuApCLPD4bRBoqTs/5DBxS0hourBkhxQo=, nodeID: wUwFhNRaqtIxt+rilTsggYm4Thwk8e6lxAUmWtYAyvY=, role: worker +10, entityID: TWLcdgEfahwyFPTC7nN3rZacPO2aXlLfZIDt7uXbzEI=, nodeID: 5uD3zbTZGhivYt1ZQw/Yr/Bcg2t6zEdyR9Ogg5ipkho=, role: backup-worker +11, entityID: aiTgGyYB2l4uAMG93Ajq5S4EXPIRkYDg1ICLjWD45Ck=, nodeID: pGkBYly79y2gJUEOau8XN04ErcfwrObO+W5+CYXJW5k=, role: backup-worker +12, entityID: /AI8TCLc1a5U98yBoxOji5bheVT1pc75v+tGDdM6se4=, nodeID: wdxW8Bk1hZvQANQHRCO8MzbgRsdC5c7mpLjsNYLM82I=, role: backup-worker +13, entityID: ko5wr5SMqhKb+P1kimM1EF/T4SqvW/WjSOwPHigQl+k=, nodeID: aJFHeID4Q7qUfMa42dRwaa9PQrZ/cVDiE3WNt4bQjo0=, role: backup-worker +14, entityID: 7nCBfl1vRS4kn7G2yJZeZdwE8OFA4avUphWdCRrFhJM=, nodeID: 3i26uutrxeIk3rK00gzlA+aHME/+k4t4PtOGwdrqPt8=, role: backup-worker +15, entityID: RMa2ER0wvraR+4u5QOGOrRTwmMVOYNcOot7sFppPRP0=, nodeID: 4mcgJKfEa6RqWh9NqSJ+/yfs6X8dU0tG1dI1L0lFNzM=, role: backup-worker +16, entityID: wCGlLKUiTNr9Ba49YA6dDuqm9rdtPcKKsKzHqMBn+rc=, nodeID: vlG7mUtP7s2PsnARfyrI3mW/q4pcqRi3SHk2GxmQ2NM=, role: backup-worker +17, entityID: PrCDIA3uyoLqNOZJ1PrRWdyviFn6K0PWFz91qQ9QyTw=, nodeID: o8p0FlVg1Wlv+ZLKojWS7c0P4xZHklFt9frLW4B4QlE=, role: backup-worker +18, entityID: F5eduX4m4O/ot3UcFs3iQk1ZPUuG43kuxGI9sZz95uU=, nodeID: 626SgurEHc2EeeJ/nvxV/YNM1PrIkaCyeHB6DBsimXg=, role: backup-worker +19, entityID: 1JttHp0rBBBHDOpPl8fAiLTcN9tUzxJGjk7llFcvhZQ=, nodeID: dN/aIe69HWFUHtOy/oqWdp1jw4fzOIljXLbMI79ilTo=, role: backup-worker +20, entityID: p1VsfSsedbKn/5GzkPsr15XD+/AOIfbPda1/2yT84N4=, nodeID: S2eoEMq6Qzms5Yd/fIOhSEacHp7Pym0BfgBEmsijEDw=, role: backup-worker +21, entityID: XSQLBoubhOq/X86vKIj4Xzouo1Fhe39+kLF/2PDgKpM=, nodeID: r5d6MxZK8vMb1P5y5NSzi4uiofaUk3rfAwvYw6sV3ms=, role: backup-worker +22, entityID: LaKJUKndAqH57DVExspTjdRTRNGJOSqArzM0pm8REZw=, nodeID: MDRdg2CAm8zmal3EJgzZJAJcj5ouKiSxu17o2pUuog0=, role: backup-worker +23, entityID: UkwjS1YvEfHx9b6MMT5Q1WvCY3aWn2lxRDsB/Pw+zGk=, nodeID: CdkWAAnsdYg0g6yl90Eiqdwqer6NK9yIxWWvPR3fwD8=, role: backup-worker +24, entityID: oOVxTw2hEYgYvSrTjjKODCt/Soy3OLcQV9YBy/PF/xY=, nodeID: jVPUq8aUDKe9jawIs7wPB4NBml27ft5kICIY7SBh/yQ=, role: backup-worker +25, entityID: 9+lM5vQ1g+cVzjaNM78gxw1yUegVj57tHDbpN7DKIvw=, nodeID: 6VWWzDQRONki6x2z5XAWH2+a5zZ04ljaw6aGLbnEAJ0=, role: backup-worker +26, entityID: RZowTXmfT+b6H6Vuz97VECIy2cq8tytTilv8AxbtvO8=, nodeID: QZIlX6n68y2iGuLleKPd+9bXxOs0LUhfcRDJqiJiw7s=, role: backup-worker +27, entityID: hNBVs2ay1IWvufQwX0TbYA6X4ocKaMpzpyaMTHggi6Q=, nodeID: bKvnByvx8qwF41EqOG6wdmatGzz/qT2nbHC8i8VM65k=, role: backup-worker +28, entityID: L4OY/0mNEduAS9z6jh2xLp72b8gZURgcrd76AOiRIXk=, nodeID: fGqOEIbBxaM2YmMcKq4PbpUOd9+s3TcS4AxaTChGuz0=, role: backup-worker +29, entityID: 21+iPu/omYBN7X5cUY4QnD4b9VVuAiW/u8uABqt2VjM=, nodeID: x8DFPc8E9BZxLJKbh51xj41es3R53AkJERfMEyRCrbk=, role: backup-worker +30, entityID: iGs5cCGos/I5KQv82MwgGMNENaxy3bhuWdFXtINcu0U=, nodeID: B6dFsY7qeLAL9PaWPqsMUrZGA9cxH/Tpy9BqXfyGSII=, role: backup-worker +31, entityID: uxSkvFu6x4MIYV+M1VrDu3m/qbADs/1Ae3mWAcEmnaQ=, nodeID: 0qOmNfZvPDnjyzPU/97x1FWsl0d3UsImNiSNXd7lE/0=, role: backup-worker +32, entityID: a4OjOCh3W8gDV15t2a1VQ2Nz7PABO262435/89jo8pE=, nodeID: MOf3jVciWclSp+gzqMcHa8cnKyodVZVMS6puYQNnfS4=, role: backup-worker +33, entityID: kupW3Pt0XMeERSkdDWyZMU4oZrk0wGysVXVyqX3rylc=, nodeID: BZvhmvc1YZpXteI2nPhBDyC2jxi04MHEbKXB1DpTM1w=, role: backup-worker +34, entityID: WazI78lMcmjyCH5+5RKkkfOTUR+XheHIohlqMu+a9As=, nodeID: LuIdtuiEPLBJefXVieVruy4kf04jjp5CBJFWVes0ZuE=, role: backup-worker +35, entityID: 1aTTEfSIcVxsPS86uIA7rSD2Jmb+aIVj1grCEjyzlzQ=, nodeID: UkkubHbsH4ptdieTlL2qbki94Ff6xp5RNz08hIGx4ow=, role: backup-worker +36, entityID: BdSzNycR8Y3MdHooxU0vtOEPr3ZG9KD5p8wxHtvueUU=, nodeID: CZgE+WU9T8YpTnPRosJYFqos9S8W53jGQKeRrRxMeQc=, role: backup-worker +37, entityID: cgXH87+sYoe2mXsdDKWCyRvWZ8JqnVnxJkCq09LlBoI=, nodeID: 6ioksdd5uKtlNnPmCpu1NYohfamlb/QHiD8EhMuTbfw=, role: backup-worker +38, entityID: UDV5FoaIkssdSFWC4asZtxvsyagoyrIS5rPX8p/np2U=, nodeID: AQwpL6BZwWxh7A2xciTayuT4NjEG1DnGUpmVTR3eP7M=, role: backup-worker +39, entityID: T5k7PtOR01oZrdnZveDpO9AFpMUhEREZk7WSSfm8Gtg=, nodeID: 9IS980R5iPJ7J/YYqnNH+O7x80bggQFqBpPg4QQOUHE=, role: backup-worker + +=== COMMITTEE === +Paratime: sapphire(000000000000000000000000000000000000000000000000f80306c9858e7279) +Height: 19183812 + + 0, entityID: J2nwlXuYEPNZ0mMH2Phg5RofbZzj65xDvQMNdy9Ji0E=, nodeID: ITrwEekdZNqXrEzvw3GT6Q3AtHDd51f19nD2nVU/f0c=, role: worker + 1, entityID: kupW3Pt0XMeERSkdDWyZMU4oZrk0wGysVXVyqX3rylc=, nodeID: jLOqojA6c57BmepLlYN91hiYYRUZ2JjdwhF0xeb1asI=, role: worker + 2, entityID: PrCDIA3uyoLqNOZJ1PrRWdyviFn6K0PWFz91qQ9QyTw=, nodeID: aUWd3B3JH+ixfplKiKKPhU+MQ866u246PT2LZd8MADI=, role: worker + 3, entityID: hNBVs2ay1IWvufQwX0TbYA6X4ocKaMpzpyaMTHggi6Q=, nodeID: bKvnByvx8qwF41EqOG6wdmatGzz/qT2nbHC8i8VM65k=, role: worker + 4, entityID: bTok0el8GbmUzTAAgcQ78uww/TsgeWwXpM3N2S49qBQ=, nodeID: LI48Ol5Is045ijOAjiCiKFHKOyzwuGL6mMTr3F5cMdM=, role: worker + 5, entityID: aiTgGyYB2l4uAMG93Ajq5S4EXPIRkYDg1ICLjWD45Ck=, nodeID: V1e0MLFxqQo79+Y9HL8EBao8oPsifyyTHlOlhVh6XaY=, role: worker + 6, entityID: zAhtGrpk1L3bBLaP5enm3natUTCoj7MEFryq9+MG4tE=, nodeID: PsfFUQrXqGoFtowWZcoc8ilh8xHP94LvNYHvqQHpw1E=, role: worker + 7, entityID: cgXH87+sYoe2mXsdDKWCyRvWZ8JqnVnxJkCq09LlBoI=, nodeID: 6ioksdd5uKtlNnPmCpu1NYohfamlb/QHiD8EhMuTbfw=, role: worker + 8, entityID: iGs5cCGos/I5KQv82MwgGMNENaxy3bhuWdFXtINcu0U=, nodeID: HH/jnBO0AqHocNg4aS7MiMjiKmta1VP0ceRc0iILMAw=, role: worker + 9, entityID: ko5wr5SMqhKb+P1kimM1EF/T4SqvW/WjSOwPHigQl+k=, nodeID: aJFHeID4Q7qUfMa42dRwaa9PQrZ/cVDiE3WNt4bQjo0=, role: worker +10, entityID: 1YeMK0NAZtE1ZK8u6KWddkKGZoD5VLfG9EAZI3b8HzE=, nodeID: AySowGLXBs4izUmpeGHnYydnp4UMWH3x7Do0bX0bjqE=, role: backup-worker +11, entityID: 6reBpCKHsqMX1Y26o3p5V+95in5ka16I969CWyiRudY=, nodeID: oRD03RHqa9X1jAT9msAQJBSrC0B5bYaBJmxsTqLPos4=, role: backup-worker +12, entityID: WazI78lMcmjyCH5+5RKkkfOTUR+XheHIohlqMu+a9As=, nodeID: BNrjfCT5j7203ozOIsx0G6ORHptO/I4iR26g+eArw4g=, role: backup-worker +13, entityID: 6XvrCu3wqMKYc5a0d5UZzG7ZGeb3j//MzcqUMUHkMCk=, nodeID: C+AWG4iXz590kCdbO/DAb4sBZr+umjyp683ucmawdM4=, role: backup-worker +14, entityID: cgXH87+sYoe2mXsdDKWCyRvWZ8JqnVnxJkCq09LlBoI=, nodeID: 6ioksdd5uKtlNnPmCpu1NYohfamlb/QHiD8EhMuTbfw=, role: backup-worker +15, entityID: UDV5FoaIkssdSFWC4asZtxvsyagoyrIS5rPX8p/np2U=, nodeID: 86y1tHzH9GlxvS0Bneh5l2AUDXYO6VMrzx75JvJViNE=, role: backup-worker +16, entityID: a4OjOCh3W8gDV15t2a1VQ2Nz7PABO262435/89jo8pE=, nodeID: uA35AfxxCsr1HEJiQVj65V+uT5636CUxJua+0y5QcQw=, role: backup-worker +17, entityID: RMa2ER0wvraR+4u5QOGOrRTwmMVOYNcOot7sFppPRP0=, nodeID: DW4/7kVEumpZV1CmntaQBncSV36t6QoE0QwQd5pLIZU=, role: backup-worker +18, entityID: WXs7ElBlm30la2fG4oZDpubeFu5sKkjDVeflWo+YuIA=, nodeID: ST2B7aeKSspiFNy325rIh8alQIRVCDyZ5t8f2NKN3PU=, role: backup-worker +19, entityID: N+3/m12DoAqzFS0yF3R/kXSkSj7pZnWhq8nRCo/MKwk=, nodeID: 82isbQ3iZxvzgBGhk9kqOuyO87h6VXkXma8dDdBkHCM=, role: backup-worker +20, entityID: PrCDIA3uyoLqNOZJ1PrRWdyviFn6K0PWFz91qQ9QyTw=, nodeID: aUWd3B3JH+ixfplKiKKPhU+MQ866u246PT2LZd8MADI=, role: backup-worker +21, entityID: 7nCBfl1vRS4kn7G2yJZeZdwE8OFA4avUphWdCRrFhJM=, nodeID: drsZxbpqG5h+4tq/JKWqmoVGXmQUirVCjD8GLBuNj9M=, role: backup-worker +22, entityID: kupW3Pt0XMeERSkdDWyZMU4oZrk0wGysVXVyqX3rylc=, nodeID: jLOqojA6c57BmepLlYN91hiYYRUZ2JjdwhF0xeb1asI=, role: backup-worker +23, entityID: 9yOiPY3NnNMpEzB+6XS/OqahzFwwX8mFhmT2fvbxlVI=, nodeID: mIKW8IEDWZZxCRtDTvWQLpslvfUBwWxVAxLakwq25C8=, role: backup-worker +24, entityID: BdSzNycR8Y3MdHooxU0vtOEPr3ZG9KD5p8wxHtvueUU=, nodeID: +JOOp6OMmzldm9Dy7Cnbl/FE66bNkU0TJquOYnQIv7s=, role: backup-worker +