2021-11-12 16:19:16 +03:00
/ *
* Copyright 2021 Fluence Labs Limited
*
* Licensed under the Apache License , Version 2.0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS" BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
* /
2021-12-06 20:17:45 +03:00
import * as tg from "./generated/export" ;
2021-11-12 16:19:16 +03:00
import { Fluence , KeyPair } from "@fluencelabs/fluence" ;
2021-12-06 20:17:45 +03:00
import { krasnodar , Node } from "@fluencelabs/fluence-network-environment" ;
2021-11-12 16:19:16 +03:00
import assert from "assert" ;
const bs58 = require ( 'bs58' ) ;
let local : Node [ ] = [
{
peerId : "12D3KooWHBG9oaVx4i3vi6c1rSBUm7MLBmyGmmbHoZ23pmjDCnvK" ,
multiaddr :
"/ip4/127.0.0.1/tcp/9990/ws/p2p/12D3KooWHBG9oaVx4i3vi6c1rSBUm7MLBmyGmmbHoZ23pmjDCnvK" ,
} ,
{
peerId : "12D3KooWRABanQHUn28dxavN9ZS1zZghqoZVAYtFpoN7FdtoGTFv" ,
multiaddr :
"/ip4/127.0.0.1/tcp/9991/ws/p2p/12D3KooWRABanQHUn28dxavN9ZS1zZghqoZVAYtFpoN7FdtoGTFv" ,
} ,
] ;
2021-12-06 20:17:45 +03:00
async function is_fluence_peer ( relay : string ) {
let result = await tg . isFluencePeer ( relay ) ;
if ( result ) {
console . log ( "Current relay %s identified as Fluence Labs' peer" , relay )
} else {
console . log ( "Current relay %s is not Fluence Labs' peer" , relay )
}
}
async function add_trust_helper ( relay : string , issuer_kp : KeyPair , issuer_peer_id : string , issued_for_peer_id : string , expires_at_sec : number , issued_at_sec : number ) {
let trust_metadata = await tg . get_trust_bytes ( relay , issued_for_peer_id , expires_at_sec , issued_at_sec ) ;
2021-11-12 16:19:16 +03:00
const signed_metadata = await issuer_kp . Libp2pPeerId . privKey . sign ( Uint8Array . from ( trust_metadata . result ) ) ;
2021-12-06 20:17:45 +03:00
let trust = await tg . issue_trust ( relay , issued_for_peer_id , expires_at_sec , issued_at_sec , Array . from ( signed_metadata ) ) ;
assert ( trust . success )
2021-11-12 16:19:16 +03:00
2021-12-06 20:17:45 +03:00
let result = await tg . verify_trust ( relay , trust . trust , issuer_peer_id ) ;
assert ( result . success )
2021-11-12 16:19:16 +03:00
2021-12-06 20:17:45 +03:00
let result_add = await tg . add_trust ( relay , trust . trust , issuer_peer_id ) ;
assert ( result_add . success )
2021-11-12 16:19:16 +03:00
}
async function revoke_helper ( node : string , issuer_kp : KeyPair , revoked_by_peer_id : string , revoked_peer_id : string , revoked_at_sec : number ) {
2021-12-06 20:17:45 +03:00
let trust_metadata = await tg . get_revoke_bytes ( node , revoked_peer_id , revoked_at_sec ) ;
2021-11-12 16:19:16 +03:00
const signed_metadata = await issuer_kp . Libp2pPeerId . privKey . sign ( Uint8Array . from ( trust_metadata . result ) ) ;
2021-12-06 20:17:45 +03:00
let revocation = await tg . issue_revocation ( node , revoked_peer_id , revoked_by_peer_id , revoked_at_sec , Array . from ( signed_metadata ) ) ;
assert ( revocation . success )
2021-11-12 16:19:16 +03:00
2021-12-13 19:40:16 +03:00
let result_add = await tg . revoke ( node , revocation . revocation ) ;
2021-12-06 20:17:45 +03:00
assert ( result_add . success )
2021-11-12 16:19:16 +03:00
}
async function main() {
console . log ( "📘 Will connect to local nodes" ) ;
// key from local-network/builtins_secret_key.ed25519 to connect as builtins owner
let sk = bs58 . decode ( "5FwE32bDcphFzuMca7Y2qW1gdR64fTBYoRNvD4MLE1hecDGhCMQGKn8aseMr5wRo4Xo2CRFdrEAawUNLYkgQD78K" ) . slice ( 0 , 32 ) ; // first 32 bytes - secret key, second - public key
let builtins_keypair = await KeyPair . fromEd25519SK ( sk ) ;
2021-12-06 20:17:45 +03:00
2021-11-12 16:19:16 +03:00
await Fluence . start ( { connectTo : local [ 0 ] , KeyPair : builtins_keypair } ) ;
console . log (
"📗 created a fluence peer %s with relay %s" ,
Fluence . getStatus ( ) . peerId ,
Fluence . getStatus ( ) . relayPeerId
) ;
2021-12-06 20:17:45 +03:00
let relay = local [ 0 ] . peerId
let nodeA = local [ 0 ] . peerId
let nodeB = local [ 1 ] . peerId
// keypair if nodeA specified in local-network/docker-compose.yml
2021-11-12 16:19:16 +03:00
const issuer_kp = await KeyPair . fromEd25519SK ( bs58 . decode ( "29Apzfedhw2Jxh94Jj4rNSmavQ1TkNe8ALYRA7bMegobwp423aLrURxLk32WtXgXHDqoSz7GAT9fQfoMhVd1e5Ww" ) ) ;
2021-12-06 20:17:45 +03:00
// set nodeA as a root
let add_root_result = await tg . add_root ( relay , nodeA , 2 ) ;
assert ( add_root_result . success )
2021-11-12 16:19:16 +03:00
2021-12-06 20:17:45 +03:00
// add self-signed root trust
const issued_timestamp_sec = await tg . timestamp_sec ( relay ) ;
const expires_at_sec = issued_timestamp_sec + 999999999 ;
await add_trust_helper ( relay , issuer_kp , nodeA , nodeB , expires_at_sec , issued_timestamp_sec ) ;
2021-11-12 16:19:16 +03:00
2021-12-06 20:17:45 +03:00
let root_weight_result = await tg . get_weight ( relay , nodeA ) ;
assert ( root_weight_result . success )
console . log ( "Root weight (nodeA) is: %s" , root_weight_result . weight ) ;
2021-11-12 16:19:16 +03:00
2021-12-06 20:17:45 +03:00
// issue trust by nodeA to nodeB and add to tg
await add_trust_helper ( relay , issuer_kp , nodeA , nodeB , expires_at_sec , issued_timestamp_sec ) ;
let weight_result = await tg . get_weight ( relay , nodeB ) ;
console . log ( "Weight of nodeB: is %s" , weight_result . weight ) ;
2021-11-12 16:19:16 +03:00
assert ( root_weight_result . weight / 2 === weight_result . weight ) ;
2021-12-06 20:17:45 +03:00
let certs = await tg . get_all_certs ( relay , nodeB ) ;
2021-11-12 16:19:16 +03:00
assert ( certs . certificates . length === 1 ) ;
2021-12-06 20:17:45 +03:00
console . log ( "There is one cert for nodeB with chain len %s" , certs . certificates [ 0 ] . chain . length ) ;
console . log ( "It contains self-signed nodeA root trust and nodeA->nodeB trust" ) ;
2021-11-12 16:19:16 +03:00
// wait to create revoke after trust (because timestamp in secs)
await new Promise ( f = > setTimeout ( f , 1000 ) ) ;
2021-12-06 20:17:45 +03:00
console . log ( "Now we will revoke trust for nodeB" )
// revoke nodeB by nodeA
await revoke_helper ( relay , issuer_kp , nodeA , nodeB , await tg . timestamp_sec ( relay ) ) ;
2021-11-12 16:19:16 +03:00
2021-12-06 20:17:45 +03:00
let empty_certs = await tg . get_all_certs ( relay , nodeB ) ;
2021-11-12 16:19:16 +03:00
assert ( empty_certs . certificates . length === 0 ) ;
2021-12-06 20:17:45 +03:00
console . log ( "Now there is no certs for nodeB" ) ;
console . log ( "Let's check if our node is Fluence Labs peer" ) ;
await is_fluence_peer ( relay ) ;
console . log ( "Now let's check some krasnodar's node" ) ;
await is_fluence_peer ( krasnodar [ 0 ] . peerId ) ;
2021-11-12 16:19:16 +03:00
return ;
}
main ( )
. then ( ( ) = > process . exit ( 0 ) )
. catch ( ( error ) = > {
console . error ( error ) ;
process . exit ( 1 ) ;
} ) ;