├── testnet-2 ├── gentx │ └── README.md └── tasks.md ├── images └── webapp-publishing-workflow.jpg ├── templates ├── dns-record-bob.yml ├── dns-record.yml ├── application-deployment-removal-request.yml ├── application-deployment-record.yml ├── application-deployment-record-bob.yml ├── application-record -bob.yml ├── application-deployment-request.yml ├── application-deployment-request-bob.yml ├── application-record.yml └── package.json ├── docs ├── stage-0-requirements.md ├── publishing-webapps.md ├── validator-setup.md ├── instructions.md ├── tasks.md └── service-provider-setup.md ├── updates ├── ALL-update-13-09-2024.md ├── SP-update-26-11-2024.md └── SP-update-13-09-2024.md ├── results ├── stage0-tally-202408190226.csv ├── stage1-tally-202408301853.csv └── final-tally-2024091400.csv ├── README.md └── LICENSE /testnet-2/gentx/README.md: -------------------------------------------------------------------------------- 1 | # New chain 2 | -------------------------------------------------------------------------------- /images/webapp-publishing-workflow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LaconicNetwork/loro-testnet/HEAD/images/webapp-publishing-workflow.jpg -------------------------------------------------------------------------------- /templates/dns-record-bob.yml: -------------------------------------------------------------------------------- 1 | record: 2 | type: DnsRecord 3 | version: 1.0.0 4 | name: "https://fries-13r8rdasg.pwa.bob.tech" 5 | resource_type: "A" 6 | -------------------------------------------------------------------------------- /templates/dns-record.yml: -------------------------------------------------------------------------------- 1 | record: 2 | type: DnsRecord 3 | version: 0.0.1 4 | name: "https://my-demo-deployment.app.xyz" 5 | resource_type: "A" 6 | value: "myapp" 7 | meta: 8 | foo: bar -------------------------------------------------------------------------------- /templates/application-deployment-removal-request.yml: -------------------------------------------------------------------------------- 1 | record: 2 | type: ApplicationDeploymentRemovalRequest 3 | deployment: bafyreieow4oybr5spo6imwtegd24t26obqhlnq5tl2mw3cvpbdq4prst7e 4 | version: 1.0.0 5 | -------------------------------------------------------------------------------- /templates/application-deployment-record.yml: -------------------------------------------------------------------------------- 1 | record: 2 | type: ApplicationDeploymentRecord 3 | version: 1.2.3 4 | name: my-demo-app 5 | description: description 6 | application: application 7 | url: url 8 | dns: dns 9 | request: request 10 | meta: 11 | foo: bar 12 | tags: 13 | - a 14 | - b -------------------------------------------------------------------------------- /templates/application-deployment-record-bob.yml: -------------------------------------------------------------------------------- 1 | record: 2 | type: ApplicationDeploymentRecord 3 | version: 1.0.0 4 | url: https://fries-13r8rdasg.pwa.bob.tech 5 | name: "@bob/fries" 6 | application: bafyreibln2qgnj4swmqnpzfqyryylovei64xglma6euufr4rs3gghu6xe4 7 | dns: bafyreiefnnnwbvd2hpmxkhhgx432t4l45su3ipqgrsmqlgvwgz7ztg3l6y 8 | -------------------------------------------------------------------------------- /templates/application-record -bob.yml: -------------------------------------------------------------------------------- 1 | record: 2 | type: ApplicationRecord 3 | version: 1.0.0 4 | name: "@bob/fries" 5 | repository: 6 | - "https://github.com/bobby/fries" 7 | repository_ref: "be15ad5492699aj4c85810fa5c10a28e1f8b8725" 8 | app_version: "0.0.1" 9 | app_type: "webapp" 10 | tags: 11 | - example -------------------------------------------------------------------------------- /templates/application-deployment-request.yml: -------------------------------------------------------------------------------- 1 | record: 2 | type: ApplicationDeploymentRequest 3 | version: 1.2.3 4 | application: application 5 | dns: dns 6 | config: 7 | env: 8 | ENV_VAR_A: A 9 | ENV_VAR_B: B 10 | lrn: 11 | - lrn://loro/applications/my-demo-app 12 | meta: 13 | foo: bar 14 | tags: 15 | - a 16 | - b -------------------------------------------------------------------------------- /templates/application-deployment-request-bob.yml: -------------------------------------------------------------------------------- 1 | record: 2 | type: ApplicationDeploymentRequest 3 | version: 1.0.0 4 | name: "bob/fries@0.0.1" 5 | application: "lrn://bob/applications/fries@0.0.1" 6 | config: 7 | env: 8 | CERC_WEBAPP_DEBUG: "0.0.1" 9 | meta: 10 | repository: "https://github.com/bob/fries" 11 | repository_ref: "be15ad5492699aj4c85810fa5c10a28e1f8b8725" -------------------------------------------------------------------------------- /templates/application-record.yml: -------------------------------------------------------------------------------- 1 | record: 2 | type: ApplicationRecord 3 | version: 0.0.1 4 | name: my-demo-app 5 | description: "An example app" 6 | homepage: http://demo.app.xyz 7 | license: license 8 | author: author 9 | repository: 10 | - "https://github.com/demo-app" 11 | repository_ref: "v0.1.0" 12 | app_version: "0.1.0" 13 | app_type: "webapp" 14 | meta: 15 | foo: bar 16 | tags: 17 | - a 18 | - b -------------------------------------------------------------------------------- /templates/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@bob/fries", 3 | "version": "0.1.0", 4 | "repository": "https://github.com/bobby/fries", 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "dependencies": { 11 | "next": "latest", 12 | "next-pwa": "^5.6.0", 13 | "react": "^18.2.0", 14 | "react-dom": "^18.2.0" 15 | }, 16 | "devDependencies": { 17 | "@types/node": "17.0.4", 18 | "@types/react": "17.0.38", 19 | "typescript": "^5" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /docs/stage-0-requirements.md: -------------------------------------------------------------------------------- 1 | # Stage 0 Requirements 2 | 3 | You must complete tasks 11 (publish an app) and 13 (deploy an app) during Stage 0 to be eligible for the Validator/Service Provider role in Stage 1. 4 | * See the [How to Publish a Webapp](/docs/publishing-webapps.md) page for reference: you will complete this workflow as part of Stage 0. 5 | 6 | ## Steps 7 | 8 | * Set up a [fork of this repo](https://github.com/LaconicNetwork/loro-testnet-example-pwa/blob/main/.github/workflows/publish.yaml#L11) with your wallet's private key (exported from the Laconic Wallet). 9 | * Change the `name` and `repository` fields in `package.json`. 10 | * Set up Service Provider Infrastructure 11 | * Use the bond ID and authority created in the previous steps. 12 | * [Instructions](/docs/service-provider-setup.md) 13 | * Publish an app 14 | * [Instructions](/docs/service-provider-setup.md#deploy-a-test-webapp) 15 | * Modify the following variables in the `.env` file before requesting the deployment: 16 | * Set `CERC_TEST_WEBAPP_CONFIG1` to your Laconic address (`laconic...` from the wallet app) 17 | * Set `CERC_TEST_WEBAPP_CONFIG2` to your Public Key (`0x...` from the wallet app) 18 | * Verify the deployment using the URL listed in the [deployer UI](/docs/service-provider-setup.md#deploy-frontend). 19 | * Verify your registry records are onchain here: https://loro-console.laconic.com/#/registry 20 | 21 | ## Stage 0 Chain Details 22 | 23 | * Chain ID: `laconic_9000-1` 24 | * RPC endpoint: `https://laconicd.laconic.com` 25 | * GraphQL endpoint: `https://laconicd.laconic.com/api` 26 | -------------------------------------------------------------------------------- /updates/ALL-update-13-09-2024.md: -------------------------------------------------------------------------------- 1 | A huge thank you to all the participants in the LORO testnet; it was a great success with 127 participants earning points and becoming eligible for LNT allocation. The main goal of this testnet was to identify qualified Service Providers and begin onboarding them ahead of mainnet launch. 2 | 3 | This process has begun and all participants that successfully completed Task 13 have been invited to complete KYC and continue with onboarding activities. **For participants that earned points but didn’t complete Task 13, you will receive an email to KYC in the coming weeks.** 4 | 5 | Today we also announce the proposed token allocation formula for all testnet participants. This formula was created to reflect the goals of the testnet and reward active participants fairly. It allows participants to calculate their proposed LNT allocation. 6 | 7 | With a fixed total supply of 129,600 LNT, we’ve reserved 1/10th (12,960 LNT) for incentivized testnets. 8 | 9 | The LORO testnet allocates a total of 4320 LNT. Individual allocations were based on the role you qualified for – through the tasks completed – and a performance multiplier based on the total testnet points earned: 10 | 11 | Overall, 12 | 13 | * 3720 LNT is allocated to 45 Service Providers (completed Task 13\) 14 | * 600 LNT is allocated to 82 App Publishers (did not complete Task 13\) 15 | 16 | Baseline allocations were set at 17 | 18 | * 60 LNT for each Service Provider (total 2700 LNT) 19 | * 2 LNT for each App Publisher (total 164 LNT) 20 | 21 | The remaining LNT for each role (1020 LNT for Service Providers, 436 LNT for App Publishers) was distributed based on performance. We calculated a performance multiplier for each role by dividing the remaining LNT by the total points earned in that role: 22 | 23 | * Service Providers: 0.010284227825894100 LNT per point 24 | * App Publishers: 0.01957966588827020 LNT per point 25 | 26 | Your individual allocation is the sum of your baseline amount plus your performance bonus (your points multiplied by the relevant multiplier). 27 | 28 | **PLEASE NOTE:** These are initial plans only, which may change at any time for any reason. This proposed formula is not binding in any way, to any party, including participants, service providers, or administrators of the LORO testnet. 29 | -------------------------------------------------------------------------------- /updates/SP-update-26-11-2024.md: -------------------------------------------------------------------------------- 1 | # Testnet Update - November 26th 2024 2 | 3 | Since the last update, we’ve progressed with development in preparation for the launch of a user facing product that will simplify publishing webapps to the Laconic Network. In service of launching this product, we’re focused on testing and bug fixes for the foreseeable future. 4 | 5 | Following successful KYC of most Service Providers, we’ve met individually with all those that filled out [this form](https://forms.gle/NE5y9KiS3wnicdH7A). Testnets will remain open to everyone, however, these select Service Providers will be invited to contract with the Laconic Foundation. In doing so, they will earn additional LNT and provide SLA uptime guarantees to users of the Laconic Network. 6 | 7 | Note: Over 10 SPs were excluded for Sybil activity. Several others are unresolved for various reasons and we are committed to address those individually in the future. 8 | 9 | For simplicity, we are transitioning to a new testnet that was initialized with state from the old testnet. Those that wish to continue participating should follow these steps. 10 | 11 | ## Sunset the LORO testnet 12 | The following things can be shutdown: 13 | - All webapp deployments 14 | - Webapp deployer api 15 | - Validator 16 | - Sepolia nodes 17 | - These will be needed in the future when testing the Eth → Laconic bridge 18 | - Points were allocated in testnet 2 for having completed this task 19 | 20 | Note: If you maintained uptime via your k8s cluster on these deployments for significant time past the end of testnet 1, and consider that this isn’t reflected in the points tally (for testnet 2), please submit evidence and a case for allocation in testnet 2. New Task 9 will address these contributions. 21 | 22 | ## Migrate to SAPO testnet 23 | - [Join as Validator](https://git.vdb.to/cerc-io/testnet-laconicd-stack/src/branch/main/testnet-onboarding-validator.md#upgrade-to-sapo-testnet) 24 | - With 1000000000000000000 alnt (1 LNT) self-delegated 25 | - [Update Service Provider infrastructure](https://git.vdb.to/cerc-io/testnet-laconicd-stack/src/branch/main/service-provider.md#update-service-provider-for-sapo-testnet) 26 | - Currently, the low amount of SPs would bottleneck any influx of active users to the Laconic Deployer. 27 | 28 | ## New Tasks 29 | Additional tasks for testnet 2 are [now available](https://github.com/LaconicNetwork/loro-testnet/pull/61). 30 | 31 | ## New place for issue reporting 32 | For any issues with setting up infrastructure or using any component of the Laconic Network stack, please open an issue in this repo: [https://github.com/LaconicNetwork/issues](https://github.com/LaconicNetwork/issues) 33 | -------------------------------------------------------------------------------- /testnet-2/tasks.md: -------------------------------------------------------------------------------- 1 | # Tasks for Laconic Testnet 2 2 | 3 | The second incentivized testnet offically begins on Monday September 23rd @ 17:00 UTC. Select validators that are still running will receive additional funds that they should bond, to even out voting power. 4 | 5 | ## Task 1 - Maintain webapp deployer uptime 6 | 7 | * Following the first testnet, some SPs kept their infra running. However, as of September 20th, there are no longer SPs deploying webapps; we'd like to see a handful get back in action. 8 | * 500 points will be allocated to SPs that maintain uptime for the foreseable future. 9 | 10 | ## Task 2 - Deploy Sepolia stack 11 | 12 | * The nitro bridge that will be tested in the third testnet will use Sepolia. To begin testing, it will be helpful to have several Sepolia nodes available. 13 | * See the stack instructions [here](https://git.vdb.to/cerc-io/eth-stack/src/branch/main/stack-orchestrator/stacks/eth/README.md). 14 | * Deploy it to your k8s cluster or use compose. 15 | * Publish an RpcNodeDeploymentRecord. 16 | * 500 points to each SP that completes this task in a timely manner. 17 | 18 | ## Task 3 - Enhanced app store 19 | 20 | * Improve upon the app store made by Silent. 21 | * For example, the card for each ApplicationRecord should include a link to the git repo. 22 | * Or, integrate Laconic Wallet to sign in to the app store, require payment to view deployments, etc. 23 | * Up to 200 points based on the complexity of the contribution. 24 | 25 | ## Task 4 - New deployer APIs 26 | 27 | * There are many options, coordinate with @cerebralbosons on Discord. 28 | * Up to 800 points based on the thoroughness of the contribution. 29 | 30 | ## Task 5 - Wishlist apps to publish 31 | 32 | * Identical to Task 21 from the first testnet. 33 | * 50-100 points depending on the complexity of the app. 34 | 35 | ### Wishlist 36 | 37 | * Deploy ping-pub with a fix to see all transactions - [link](https://git.vdb.to/cerc-io/cosmos-explorer) 38 | 39 | ## Task 6 - Host additional services 40 | 41 | * 100 points for an explorer (claimed) 42 | * 500 points for Blast (allocated, transfered to Task 7) 43 | 44 | ## Task 7 - Host DIN Services 45 | 46 | * Deploy and register an “RpcNodeDeploymentRecord” for: 47 | * [Blast](https://docs.blast.io/tools/node-providers#how-to-run-your-own-nodes) - 500 points 48 | * [zkSync](https://docs.zksync.io/zksync-node/running-node) - 500 points 49 | * This task may be eligible for recurring USD payment (in addition to LNT) 50 | * Bonus points for making a “stack” for each service to contracted Service Providers 51 | * Until our decentralized solution to load balancing is completed (i.e., “Watcher Parties”), we will run caddy proxies at blast.rpc.laconic.com and zksync.rpc.laconic.com 52 | * Laconic is a founding member of DIN. We would like to announce that “Laconic Network Service Providers are running RPC infrastructure for DIN” 53 | 54 | ## Task 8 - Host Ollama 55 | 56 | * Deploy and register an "LLMDeploymentRecord" for: 57 | * [Ollama](https://github.com/ollama/ollama) 58 | * Bonus: create a stack that allows for two modes of usage: 59 | * 1-to-1 usage a single user connects to a single ollama instance 60 | * 1-to-many: multiple user connect to the same ollama instance 61 | * Use the [default Ollama docker image](https://hub.docker.com/r/ollama/ollama) 62 | * 500 points 63 | 64 | Note: functionality for payment to your Ollama node when service is requested by users will soon be implemented via the Laconic Store → Deployer workflow that is used for deploying webapps. 65 | 66 | ## Task 9 - Leaderboard Accounting 67 | 68 | * The current testnet 2 tally was created manually and does not necessarily include all contributions / efforts since the end of testnet 1. 69 | * This task is to provide an automated script to tally any and all outstanding contributions that are not accounted for [here](https://github.com/LaconicNetwork/loro-testnet/pull/60). 70 | * 500 points 71 | 72 | 73 | ## Bonus points 74 | 75 | * Arbitrary bonuses will be allocated for outstanding contributions and rapid turnaround on Tasks 1 & 2. 76 | * If you are reading this, the second testnet has unofficially begun ;) 77 | -------------------------------------------------------------------------------- /updates/SP-update-13-09-2024.md: -------------------------------------------------------------------------------- 1 | # Service Provider Overview 2 | 3 | Laconic Network is a web3 services and data marketplace that gives users and developers a robust alternative to existing centralized web and RPC services. It matches these users and developers with Service Providers (SPs) via mutually agreed upon preferences (e.g., jurisdiction, type of service, duration). 4 | 5 | In traditional Proof of Stake chains, the operator business model is running a validator and earning commission from staking rewards. Laconic Network is instead a Proof of Authority chain, where every validator has an equal stake[^1] and there are no staking rewards. Validators earn 4% of the total Network Fees. The genesis validator set will be selected from a jurisdictionally diverse set of LORO Testnet top-performing participants. 6 | 7 | A core value proposition of Laconic Network is supporting the business activities of SPs. SPs earn the remaining 96% of Network Fees, and in return provide reliable services to customers of the marketplace. Laconic Network aggregates a variety of available compute across many jurisdictions, and supports SP business activities with seamless payments and a legal framework for compliance in any jurisdiction[^2]. 8 | 9 | For end users and developers, the Laconic Network provides high quality, attributable, and auditable web3 services for their entire application stack. From source code to RPC nodes to DeFi front ends, our hypothesis is that these features will generate strong network effects and ultimately benefit all users of web3. 10 | 11 | ## Business Status and Opportunity 12 | 13 | - We have existing customers for RPC traffic and the goal is to transition this and other traffic (e.g., Snowball) to SPs, ahead of network launch. 14 | - The Laconic Foundation would like to contract with select SPs that have completed KYC and are keen to continue participating in ongoing testnet and mainnet. 15 | - These contracts would be for additional LNT separate from any testnet allocations. **Please fill out [this form](https://forms.gle/cvXLvohvFteLH45LA) to provide us with more information about your setup.** 16 | - For SPs with rackspace available, we have numerous machines that are currently being provisioned to support workloads for the Laconic Network. We are seeking interested SPs to rack this hardware in a variety of jurisdictions. 17 | 18 | ## SPs’ Revenue Overview 19 | 20 | SPs earn fees in two ways: 21 | 22 | 1. Deploying and hosting DeploymentRequests. 23 | a) Auctions for service is another feature in development; SPs will also be able to easily configure the parameters for which requests they want to deploy 24 | 2. For every byte served from a hosted deployment. 25 | b) Using nitro payment channels, deployed services can be configured to require payment per byte of traffic served. 26 | c) This allows SPs to effectively monetize traffic to any service they are hosting. 27 | 28 | ## Feature Roadmap 29 | 30 | 1. [Blind Insight](https://www.blindinsight.com) for end user KYC 31 | a) Users can attest that they are from a certain jurisdiction. 32 | b) With FOAM/OWL they can even attest that they are *in* a certain jurisdiction. 33 | 2. Auctions for service 34 | a) SP set their preferences and (automatically) submit bids based on the information in an ApplicationDeploymentRequest. 35 | 3. New deployer APIs for services other then webapps 36 | a) The webapp deployer API addressed the low hanging fruit. New APIs are planned (but not being actively worked on). 37 | 38 | Note: the Laconic Registry is very flexible, it is possible to publish any new (correctly formatted) record type. 39 | 40 | ## Snowball, Caddy, Watcher Parties 41 | 42 | - Snowball works on the testnet ([link](https://staging.snowball.build)); it can quickly deploy ApplicationRecords and ApplicationDeploymentRequests. However, it doesn’t return correct deployment URLs or logs, as it is designed for a single known Service Provider. 43 | - This is actually the correct implementation because the solution to load balancing services on the Laconic Network involves caddy and watcher parties; this development work is ongoing. 44 | - We welcome an open source version of Snowball that allows users to connect via Laconic Wallet and easily submit ApplicationDeploymentRequests. 45 | 46 | ## Upcoming testnets 47 | 48 | - LNT total supply is 129,600, of which 10% (12,960 LNT) is allocated for incentivized testnets. The LORO testnet allocates 3.33% (4320 LNT) with the majority (3720 LNT) going to SPs. 49 | - The second testnet will involve bespoke tasks (see below). 50 | - We will keep this current testnet going and rebalance the stake to validators that have completed KYC. 51 | - The third testnet will test: 52 | - Snowball, caddy, watcher parties 53 | - Features on the roadmap (see above) 54 | - Nitro bridge and payment channels (try [here](https://git.vdb.to/cerc-io/testnet-laconicd-stack/src/branch/main/testnet-nitro-node.md)) 55 | 56 | ## Second Testnet Tasks 57 | 58 | Contributions for these tasks will be judged on a case by case basis; submit evidence of task completion in Discord. More tasks to come. 59 | 60 | 1. Deploy a Sepolia node and register an RpcDeploymentRecord 61 | a) 500 points 62 | 2. Enhanced app store 63 | a) 200 points 64 | 3. Develop additional deployer APIs with cryptographic integrity checks 65 | a) 800 points 66 | 67 | ### Examples of Task 3 68 | 69 | 1. Deploy Gitea: [link to stack instructions](https://git.vdb.to/cerc-io/stack-orchestrator/src/branch/main/stack_orchestrator/data/stacks/package-registry) 70 | a) RepositoryDeploymentRequest 71 | b) NpmPackageDeploymentRequest (with [LavaMoat](https://lavamoat.github.io) integration) 72 | 73 | c) DockerImageDeploymentRequest 74 | d) ActRunnerDeploymentRequest 75 | - [Link to act stack instructions](https://git.vdb.to/cerc-io/stack-orchestrator/src/branch/main/stack_orchestrator/data/stacks/act-runner) 76 | 2. IPFS Deployment 77 | a) FileHostingRequest 78 | 3. Other interesting services, e.g., 79 | a) MinecraftServerDeploymentRequest 80 | 81 | [^1]: For governance; each validator gets one equally weighted vote. 82 | 83 | [^2]: KYC/KYB provides a baseline; Proof of Location improves attestability. For illegal content, we make it simple to comply with a takedown notice. 84 | 85 | -------------------------------------------------------------------------------- /results/stage0-tally-202408190226.csv: -------------------------------------------------------------------------------- 1 | Moniker,Address,Total,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 2 | -,laconic17rzfujtx66ewy3l645ynj7hpc74aux9jhl8ur8,1727,0,0,8,30,60,60,45,60,60,0,50,0,600,754,0,0,0,0,0,0 3 | -,laconic16v0lazxvmccs0893g58fqa65m6344dlcpxrvs0,1444,0,0,4,50,60,57,51,60,60,0,50,0,600,452,0,0,0,0,0,0 4 | -,laconic1f7tursd29yrk3mnys3javqngraj5ls7k5h3vvv,1402,0,0,4,50,60,51,33,60,60,0,50,0,600,434,0,0,0,0,0,0 5 | -,laconic1gqzpr9k22navgzreyfsze32p03mjz0j6evjuj0,1280,0,0,8,40,60,42,18,60,60,0,50,0,600,342,0,0,0,0,0,0 6 | -,laconic1xhaypaj6w2etkxkdaxvkurkrvhghq7upzs50vj,1096,0,0,4,10,60,3,3,60,60,0,10,0,600,286,0,0,0,0,0,0 7 | -,laconic1ylkv9ymdacumhnr6f7xdhrcvn7vxmgk4qk6adh,1074,0,0,4,15,60,6,3,60,60,0,10,0,600,256,0,0,0,0,0,0 8 | -,laconic1256aqyag45x84usd6xj053musfcql74j4j3ll3,1068,0,0,4,5,60,15,6,60,60,0,10,0,600,248,0,0,0,0,0,0 9 | -,laconic1rs2s2wz2mgtur3fsu9wlnmsf0zvrcm63cmqmsg,1107,0,0,40,50,60,33,24,60,60,0,50,0,600,130,0,0,0,0,0,0 10 | -,laconic1f9j8n9rqsekzp0rffe3298pytms4hfz20khge3,1083,0,0,4,5,60,12,6,60,60,0,20,0,600,256,0,0,0,0,0,0 11 | -,laconic1mjzrgc8ucspjz98g76c8pce026l5newrujetx0,1057,0,0,40,10,60,27,24,60,60,0,50,0,600,126,0,0,0,0,0,0 12 | -,laconic1s8fqsj548sr86n4mwmdahyzyduxf5f9tkav9e7,1054,0,0,4,10,60,3,3,60,60,0,10,0,600,244,0,0,0,0,0,0 13 | -,laconic15twrppy7udkzd5vnd5cxghe0stddrs0ndd4mv0,1022,0,0,4,10,60,3,3,60,60,0,10,0,600,212,0,0,0,0,0,0 14 | -,laconic195fw5924wajlg4u54m7y9z52dv906qhqtaayrs,1009,0,0,4,35,60,39,24,60,57,0,50,0,600,80,0,0,0,0,0,0 15 | -,laconic1jyvf988g3mgelqw3snw5ukjgvewfkvrfq24tdz,1006,0,0,4,5,60,30,27,60,60,0,40,0,600,120,0,0,0,0,0,0 16 | -,laconic1zmzezvhlkhccvvej2sekvhyqseh6vhhqldeahm,983,0,0,4,15,60,3,3,60,60,0,10,0,600,168,0,0,0,0,0,0 17 | -,laconic1wrwl5557yxgqkwq4djlrz33x5nd5f0j9vh42jg,968,0,0,4,10,60,3,3,60,60,0,10,0,600,158,0,0,0,0,0,0 18 | -,laconic1x0rgcutlsqpnza9c3xn94mcxjmuc3ta05cyq32,968,0,0,4,10,60,3,3,60,60,0,10,0,600,158,0,0,0,0,0,0 19 | -,laconic1360txwdlk4z0604vd22dcarxt9w3ddj8d8mz8m,966,0,0,4,10,60,3,3,60,60,0,10,0,600,156,0,0,0,0,0,0 20 | -,laconic1g3yjumrf2kwp7ds2zvc4v856mewtpqfwykzq87,960,0,0,4,10,60,3,3,60,60,0,10,0,600,150,0,0,0,0,0,0 21 | -,laconic160vn8j8shg3htv4tzfftgny7m43nau8c7upxyk,958,0,0,4,10,60,3,3,60,60,0,10,0,600,148,0,0,0,0,0,0 22 | -,laconic1f9zsthuj8xywft0f6ukk92pa8t2sremyczcwk3,942,0,0,4,10,60,3,3,60,60,0,10,0,600,132,0,0,0,0,0,0 23 | -,laconic150apfepxmmkz0ncmpjwrjzm6p8r5ae7vtdkm62,930,0,0,4,10,60,3,3,60,60,0,10,0,600,120,0,0,0,0,0,0 24 | -,laconic18vyuwuzukgcmdqxpgk5zpra2whfq4gwys0n2rl,930,0,0,4,10,60,3,3,60,60,0,10,0,600,120,0,0,0,0,0,0 25 | -,laconic1ka6xtcejersljsmslc6tw9uxvfmans476v98r0,924,0,0,4,5,60,18,15,60,60,0,10,0,600,92,0,0,0,0,0,0 26 | -,laconic14vzrlac5zte5nju9fm0ktzfz7e4zss74f6lpzx,916,0,0,4,5,60,21,12,60,60,0,10,0,600,84,0,0,0,0,0,0 27 | -,laconic1jmxg7dzyhcdya2j4heum8us62hf7s800m3vd80,908,0,0,4,10,60,3,3,60,60,0,10,0,600,98,0,0,0,0,0,0 28 | -,laconic1l3gca0c6ccmecncy9ld359yfpa09840y6pmcf0,896,0,0,4,10,60,3,3,60,60,0,10,0,600,86,0,0,0,0,0,0 29 | -,laconic195s2w429xuxqagkz54n55dcpfz4nwl0k62qnet,892,0,0,28,25,60,42,51,24,18,0,20,0,600,24,0,0,0,0,0,0 30 | -,laconic1xm7vrga9df0uehmq7yld7sk2zsxmu8ay54kup7,874,0,0,4,15,60,6,6,60,45,0,20,0,600,58,0,0,0,0,0,0 31 | -,laconic13t5gzchl0x3vg28nff7h2f5myvdgxjnn67khmr,860,0,0,4,15,60,9,6,60,42,0,10,0,600,54,0,0,0,0,0,0 32 | -,laconic1nmuxuz3z2xj5fqf2sz5nn0u2r2al7mutsl8pm7,855,0,0,4,5,60,0,0,60,54,0,0,0,600,72,0,0,0,0,0,0 33 | -,laconic1zrk7h7629td9r0tm946ll94mdpzq6cmgvjytz9,853,0,0,4,15,60,6,6,60,36,0,20,0,600,46,0,0,0,0,0,0 34 | -,laconic19prpqnvrmmuyxr2vs7udl2fuqmzlln7239r4ak,827,0,0,4,10,60,3,3,60,33,0,10,0,600,44,0,0,0,0,0,0 35 | -,laconic10vuf74jng58az05pmwrhxxjhzu9q2q27stzq5v,820,0,0,4,10,60,3,3,60,30,0,10,0,600,40,0,0,0,0,0,0 36 | -,laconic1fnstpxgfmj0nrr9werc8vufvlh3wxcd3lfuq2y,820,0,0,4,10,60,3,3,60,30,0,10,0,600,40,0,0,0,0,0,0 37 | -,laconic1g54ls9mk7qjnwycd8dnww6g7t4qecthp90wpf5,818,0,0,4,10,60,3,3,60,30,0,10,0,600,38,0,0,0,0,0,0 38 | -,laconic15n9e0ffypdd80eayekzj5a7zr0c0ptj6efs88e,813,0,0,4,10,60,3,3,60,27,0,10,0,600,36,0,0,0,0,0,0 39 | -,laconic128vt4we3s044zycwydz9f6amzrlp7r6lnputdg,808,0,0,4,5,60,48,39,18,6,0,20,0,600,8,0,0,0,0,0,0 40 | -,laconic164ec25vwgln6fsmmerpazx5mwtxxvsmfegxdch,806,0,0,4,5,60,0,0,60,33,0,0,0,600,44,0,0,0,0,0,0 41 | -,laconic1vfs90x57ufs87tn9h6zs3xylnzh97f03qy0ggz,793,0,0,4,15,60,6,3,60,15,0,10,0,600,20,0,0,0,0,0,0 42 | -,laconic1ljwtpta6xfgtnk0e03h4t77chjygv399pr6utz,763,0,0,4,10,45,3,3,60,12,0,10,0,600,16,0,0,0,0,0,0 43 | -,laconic1axg567nvu92un33z6z547n7klkeq6ud37pwz35,743,0,0,4,5,45,36,12,9,6,0,20,0,600,6,0,0,0,0,0,0 44 | -,laconic15t9kahzjza50772k7s2j78f0ptndqfwvfgrgq9,180,0,0,24,10,33,18,15,60,0,0,20,0,0,0,0,0,0,0,0,0 45 | -,laconic1j7mrlxech8qad2whzal6te73m4rsh59uwg0pdt,172,0,0,40,35,36,36,15,0,0,0,10,0,0,0,0,0,0,0,0,0 46 | -,laconic1yfv4v439ykjzjfrc9363an579k2tkdnwkv34jg,156,0,0,28,20,30,30,12,3,3,0,30,0,0,0,0,0,0,0,0,0 47 | -,laconic1dx3jyjfpcwdwufj5uuufk84f5ugm5h4wf3jsl2,150,0,0,4,20,27,15,9,45,0,0,30,0,0,0,0,0,0,0,0,0 48 | -,laconic1qsvrehuchjquanwm7gsx7cvze8t959l7zf0zpw,106,0,0,40,5,12,33,6,0,0,0,10,0,0,0,0,0,0,0,0,0 49 | -,laconic1vwyxdndfv6e3gw0m9w06xah2m3x6qhznn9ypjx,88,0,0,4,30,9,12,3,0,0,0,30,0,0,0,0,0,0,0,0,0 50 | -,laconic1yavpc0fjk3ze33kfuuc5fra5x3nzs20ajhpef5,74,0,0,40,10,15,6,3,0,0,0,0,0,0,0,0,0,0,0,0,0 51 | -,laconic18mrkvn2au2d7kawpdjdazn3l3lla4jv9jdfmdf,73,0,0,40,30,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 52 | -,laconic1ff55lvklhd2y3p56c70gkyjjdxr5srnyrtj253,61,0,0,16,5,12,12,6,0,0,0,10,0,0,0,0,0,0,0,0,0 53 | -,laconic1xwwy9944lgu3djvgmk4l4x59x5cjzczcxuj9f5,60,0,0,40,5,0,12,3,0,0,0,0,0,0,0,0,0,0,0,0,0 54 | -,laconic1w78xscjjjp4ygm7y0tkz5frqrhks5gw9r7hqqu,39,0,0,4,10,9,3,3,0,0,0,10,0,0,0,0,0,0,0,0,0 55 | -,laconic10mrtxypx3rzamn46xezsjtfwat3yyjp9kyaf9t,38,0,0,8,5,9,3,3,0,0,0,10,0,0,0,0,0,0,0,0,0 56 | -,laconic14dzwrzdfgln6z2vuu0jncvwjt2l7e4yl7slmjq,38,0,0,8,5,9,3,3,0,0,0,10,0,0,0,0,0,0,0,0,0 57 | -,laconic1l70nl4xswhdv4vxfemnrqmpee8kzavst7w4k7a,34,0,0,4,5,9,3,3,0,0,0,10,0,0,0,0,0,0,0,0,0 58 | -,laconic18uc9h349nd0w62vnleu8ywu3sur7ly0kdsgmg3,24,0,0,4,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 59 | -,laconic18cd03t0zvaxuv5vz0tdyyxctw5jffrj7mggk6n,14,0,0,4,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 60 | -,laconic19w5x0ck6tlppcwn7hg2ww7kuhycsjw37fpwur9,9,0,0,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 61 | -,laconic1pepnj5z8nzd7c27trg56wt2p9yzya2g9paen39,9,0,0,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 62 | -,laconic1p87hvu9szlc5ek4ggrk0yr9wfd9503h2z8j0f6,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 63 | -,laconic1krddttfs6qnrjxnaza85jnpnlx6jn2w0l2qha2,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 64 | -------------------------------------------------------------------------------- /docs/publishing-webapps.md: -------------------------------------------------------------------------------- 1 | # How to Publish a Webapp 2 | 3 | ## Getting Started 4 | 5 | 1. Fork [this repo](https://github.com/LaconicNetwork/loro-testnet-example-pwa). 6 | 2. Set your private key as the env `CICD_LACONIC_USER_KEY` in Settings -> Secrets -> Actions 7 | 3. Register and set a name authority; see these [instructions](./instructions.md#register-an-authority). 8 | 4. Modify the `"name":` and `"repository":` fields, then commit. 9 | 5. The commit should trigger an Action and publish an ApplicationRecord and ApplicationDeploymentRequest to the chain. 10 | 11 | ## Reference Workflow 12 | 13 | This is a reference workflow for publishing and deploying a webapp using the Laconic Registry: 14 | 15 | [![Webapp publishing workflow diagram](/images/webapp-publishing-workflow.jpg)](/images/webapp-publishing-workflow.jpg) 16 | 17 | ### For app publishers 18 | 19 | 1. Upload the code to the webapp to a public repo. 20 | 2. [On-chain] Register an Authority. 21 | 3. [On-chain] Register an Application Record and corresponding name. 22 | 4. [On-chain] Register an Application Deployment Request. 23 | 24 | ### For service providers 25 | 26 | 1. Set up Service Provider infrastructure. 27 | 2. Deploy the app using the data from the Application Deployment Request. 28 | 3. [On-chain] Register a DNS Record and corresponding name. 29 | 4. [On-chain] Register an Application Deployment Record and corresponding name. 30 | 31 | 32 | ## Example of the entire workflow 33 | 34 | The following steps will provide sample commands and records for an example app being published: 35 | 36 | * Our organization is Bob Inc. 37 | * The authority will be set to `bob`. 38 | 39 | #### Prerequisites 40 | 41 | You must have a `laconic` address and a [bond ID](/docs/instructions.md#create-a-bond) in order to register authorities, names, and records on chain. 42 | 43 | * Bond ID: `a742489e5817ef274187611dadb0e4284a49c087608b545ab6bd990905fb61f3` 44 | 45 | To create a bond, 46 | 47 | ### 1. Upload webapp code to a public repo 48 | 49 | Our (fictional) webapp repo is `github.com/bobby/fries`. It includes a `package.json` file that looks [like this]. 50 | 51 | * The app name is `fries` 52 | * The app version is `0.0.1` 53 | * The git commit is `be15ad5492699aj4c85810fa5c10a28e1f8b8725` 54 | 55 | ### 2. Set up Service Provider (SP) infrastructure 56 | 57 | We set up the SP infrastructure to monitor the chain registry and deploy apps as required using [this guide](/docs/service-provider-setup.md). 58 | * The `DEPLOYMENT_RECORD_NAMESPACE` must be set to `bob`. 59 | 60 | ### 3. Register an Authority 61 | 62 | We follow the steps in [here](/docs/instructions.md#register-an-authority) to set the `bob` authority. 63 | 64 | ### 4. Register an Application Record 65 | 66 | > This should take place automatically after pushing a commit to the relevant branch in the webapp repo. 67 | 68 | We can register an ApplicationRecord that looks like [this](/templates/application-record%20-bob.yml) using the commands shown [here](/docs/instructions.md#register-an-application-deployment-record). 69 | 70 | * Application record ID: `bafyreibln2qgnj4swmqnpzfqyryylovei64xglma6euufr4rs3gghu6xe4` 71 | 72 | #### 4.1. Register Names for Application Record 73 | 74 | We can register the relevant names now using the application record ID: 75 | 76 | * `lrn://bob/applications/fries` 77 | * `lrn://bob/applications/fries@0.0.1` 78 | * `lrn://bob/applications/fries@be15ad5492699aj4c85810fa5c10a28e1f8b8725` 79 | 80 | ``` 81 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry name set lrn://bob/applications/fries bafyreibln2qgnj4swmqnpzfqyryylovei64xglma6euufr4rs3gghu6xe4" 82 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry name set lrn://bob/applications/fries@0.0.1 bafyreibln2qgnj4swmqnpzfqyryylovei64xglma6euufr4rs3gghu6xe4" 83 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry name set lrn://bob/applications/fries@be15ad5492699aj4c85810fa5c10a28e1f8b8725 bafyreibln2qgnj4swmqnpzfqyryylovei64xglma6euufr4rs3gghu6xe4" 84 | ``` 85 | 86 | ### 5. Register an Application Deployment Request 87 | 88 | > This should take place automatically after pushing a commit to the relevant branch in the webapp repo. 89 | 90 | We can register an ApplicationDeploymenRequest that looks like [this](/templates/application-deployment-request-bob.yml) using the commands shown [here](/docs/instructions.md#register-an-application-deployment-request-record). 91 | 92 | ### 6. Deploy the app 93 | 94 | > If your SP setup is operational, it should deploy the app and register the relevant DNS and ApplicationDeployment Records automatically after it detects the deployment request. 95 | 96 | In this example, the app is deployed at `https://fries-13r8rdasg.pwa.bob.tech`. 97 | 98 | ### 7. Register a DNS Record 99 | 100 | > This should take place automatically through your SP setup. 101 | 102 | We can register a DnsRecord that looks like [this](/templates/dns-record-bob.yml) using the commands shown [here](/docs/instructions.md#register-a-dns-record). 103 | 104 | * Dns record ID: `bafyreiefnnnwbvd2hpmxkhhgx432t4l45su3ipqgrsmqlgvwgz7ztg3l6y` 105 | 106 | #### 7.1. Register Name for DNS Record 107 | 108 | We can register the relevant name using the Dns record ID: 109 | 110 | * `lrn://bob/dns/fries-13r8rdasg.pwa.bob.tech` 111 | 112 | ``` 113 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry name set lrn://bob/dns/fries-13r8rdasg.pwa.bob.tech bafyreiefnnnwbvd2hpmxkhhgx432t4l45su3ipqgrsmqlgvwgz7ztg3l6y" 114 | ``` 115 | 116 | ### 8. Register an Application Deployment Record 117 | 118 | > This should take place automatically through your SP setup. 119 | 120 | We can register an ApplicationDeploymentRecord that looks like [this](/templates/application-deployment-record-bob.yml) using the commands shown [here](/docs/instructions.md#register-an-application-deployment-record). 121 | 122 | * Application deployment record ID: `bafyreiape3qbsljhybvgstv6bqlspxqghd7rlxhghcxi5u524mfdyodesq` 123 | 124 | #### 8.1. Register Name for Applicaton Deployment Record 125 | 126 | We can register the relevant name using the Dns record ID: 127 | 128 | * `lrn://bob/deployments/fries-13r8rdasg.pwa.bob.tech` 129 | 130 | ``` 131 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry name set lrn://bob/deployments/fries-13r8rdasg.pwa.bob.tech bafyreiape3qbsljhybvgstv6bqlspxqghd7rlxhghcxi5u524mfdyodesq" 132 | ``` -------------------------------------------------------------------------------- /docs/validator-setup.md: -------------------------------------------------------------------------------- 1 | # Validator Setup 2 | 3 | ## Chain Details 4 | 5 | * Binary repo: https://git.vdb.to/cerc-io/laconicd 6 | * Binary version: [v0.1.7](https://git.vdb.to/cerc-io/laconicd/src/tag/v0.1.7) 7 | * Genesis file: [genesis.json](./genesis.json) 8 | * Peers: `"545297cafc624e0f10a0fd7c1840854bb293d3b8@laconicd.laconic.com:26656"` 9 | 10 | ## Set up a Validator in Stage 1 11 | 12 | ### Prerequisites 13 | 14 | * Minimum hardware requirements: 15 | ```bash 16 | RAM: 8GB 17 | Disk space: 200GB 18 | CPU: 2 cores 19 | ``` 20 | * Testnet genesis file and peer node address 21 | * Mnemonic from the wallet app 22 | * Participant onboarded in Stage 0 23 | * Stage 1 has started 24 | 25 | ### Setup 26 | 27 | * Clone the stack repo: 28 | 29 | ```bash 30 | laconic-so fetch-stack git.vdb.to/cerc-io/testnet-laconicd-stack 31 | ``` 32 | 33 | * Clone required repositories: 34 | 35 | ```bash 36 | laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd setup-repositories --pull 37 | 38 | # If this throws an error as a result of being already checked out to a branch/tag in a repo, remove the repositories and re-run the command 39 | ``` 40 | 41 | * Build the container images: 42 | 43 | ```bash 44 | laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd build-containers 45 | ``` 46 | 47 | This should create the following docker images locally: 48 | 49 | * `cerc/laconicd` 50 | 51 | ### Create a deployment 52 | 53 | * Create a spec file for the deployment: 54 | 55 | ```bash 56 | laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd deploy init --output testnet-laconicd-spec.yml 57 | ``` 58 | 59 | * Edit `network` in the spec file to map container ports to host ports as required: 60 | 61 | ```bash 62 | # testnet-laconicd-spec.yml 63 | ... 64 | network: 65 | ports: 66 | laconicd: 67 | - '6060:6060' 68 | - '26657:26657' 69 | - '26656:26656' 70 | - '9473:9473' 71 | - '9090:9090' 72 | - '1317:1317' 73 | ``` 74 | 75 | * Create the deployment from the spec file: 76 | 77 | ```bash 78 | laconic-so --stack ~/cerc/testnet-laconicd-stack/stack-orchestrator/stacks/testnet-laconicd deploy create --spec-file testnet-laconicd-spec.yml --deployment-dir testnet-laconicd-deployment 79 | ``` 80 | 81 | * Copy over the published testnet genesis file (`.json`) to data directory in deployment (`testnet-laconicd-deployment/data/laconicd-data/tmp`): 82 | 83 | ```bash 84 | # Example 85 | mkdir -p testnet-laconicd-deployment/data/laconicd-data/tmp 86 | cp genesis.json testnet-laconicd-deployment/data/laconicd-data/tmp/genesis.json 87 | ``` 88 | 89 | ### Configuration 90 | 91 | * Inside the `testnet-laconicd-deployment` deployment directory, open `config.env` file and set following env variables: 92 | 93 | ```bash 94 | # Comma separated list of nodes to keep persistent connections to 95 | # Example: "node-1-id@laconicd.laconic.com:26656" 96 | # Use the provided node id 97 | CERC_PEERS="545297cafc624e0f10a0fd7c1840854bb293d3b8@laconicd.laconic.com:26656" 98 | 99 | # A custom human readable name for this node (default: TestnetNode) 100 | CERC_MONIKER= 101 | ``` 102 | 103 | ### Start the deployment 104 | 105 | ```bash 106 | laconic-so deployment --dir testnet-laconicd-deployment start 107 | ``` 108 | 109 | ### Check status 110 | 111 | * To list down and monitor the running containers: 112 | 113 | ```bash 114 | # With status 115 | docker ps -a 116 | 117 | # Follow logs for laconicd container 118 | laconic-so deployment --dir testnet-laconicd-deployment logs laconicd -f 119 | ``` 120 | 121 | * Check the sync status of your node: 122 | 123 | ```bash 124 | laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd status | jq .sync_info" 125 | 126 | # `catching_up: false` indicates that node is completely synced 127 | ``` 128 | 129 | * After the node has caught up, view current list of staking validators: 130 | 131 | ```bash 132 | laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query staking validators" 133 | ``` 134 | 135 | * Confirm that in the list of validators, your node moniker does not exist 136 | 137 | ### Join as testnet validator 138 | 139 | #### Using the `laconicd` CLI 140 | 141 | * Import a key pair: 142 | 143 | ```bash 144 | KEY_NAME=alice 145 | 146 | # Restore existing key with mnemonic seed phrase 147 | # You will be prompted to enter mnemonic seed 148 | laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys add $KEY_NAME --recover" 149 | 150 | # Query the keystore for your account's address 151 | laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys show $KEY_NAME -a" 152 | ``` 153 | 154 | * Check balance for your account: 155 | 156 | ```bash 157 | laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query bank balances " 158 | ``` 159 | 160 | * Create required validator configuration: 161 | 162 | ```bash 163 | # Note: 164 | # Edit the staking amount and other fields as required 165 | # Replace with your node's moniker in command below 166 | 167 | laconic-so deployment --dir testnet-laconicd-deployment exec laconicd 'cat < my-validator.json 168 | { 169 | "pubkey": $(laconicd cometbft show-validator), 170 | "amount": "1000000000000000alnt", 171 | "moniker": "", 172 | "commission-rate": "0.1", 173 | "commission-max-rate": "0.2", 174 | "commission-max-change-rate": "0.01", 175 | "min-self-delegation": "1" 176 | } 177 | EOF' 178 | ``` 179 | 180 | * Create a validator: 181 | 182 | ```bash 183 | laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd tx staking create-validator my-validator.json \ 184 | --fees 500000alnt \ 185 | --chain-id=laconic_9000-1 \ 186 | --from $KEY_NAME" 187 | ``` 188 | 189 | * View staking validators: 190 | 191 | ```bash 192 | laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query staking validators" 193 | ``` 194 | 195 | * Check that in the list of validators `` exists 196 | 197 | * View validator set: 198 | 199 | ```bash 200 | laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd query consensus comet validator-set" 201 | ``` 202 | 203 | ### Clean up (only do this if you need to stop your node) 204 | 205 | * Stop all `testnet-laconicd` services running in the background: 206 | 207 | ```bash 208 | # Stop the docker containers 209 | laconic-so deployment --dir testnet-laconicd-deployment stop 210 | ``` 211 | 212 | * To stop all services and also delete data: 213 | 214 | ```bash 215 | # Stop the docker containers 216 | laconic-so deployment --dir testnet-laconicd-deployment stop --delete-volumes 217 | 218 | # Remove deployment directory (deployment will have to be recreated for a re-run) 219 | rm -r testnet-laconicd-deployment 220 | ``` 221 | -------------------------------------------------------------------------------- /docs/instructions.md: -------------------------------------------------------------------------------- 1 | # LORO Testnet Instructions 2 | 3 | The following is a cheat sheet for all the CLI commands you may need to submit at one point during the LORO testnet. 4 | 5 | ## Export private key 6 | 7 | ``` 8 | laconic-so deployment --dir testnet-laconicd-deployment exec laconicd "laconicd keys export --unarmored-hex --unsafe" 9 | ``` 10 | 11 | ## Create a bond 12 | 13 | Sample command: 14 | ``` 15 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry bond create --type alnt --quantity 100000000000" 16 | ``` 17 | ``` 18 | {"bondId":"a742489e5817ef274187611dadb0e4284a49c087608b545ab6bd990905fb61f3"} 19 | ``` 20 | 21 | ## Register an authority 22 | 23 | > Note that the Stage 0 chain does not have authority auctions enabled, so you can reserve and set an authority without going through the commit/reveal steps. 24 | 25 | ### Reserve authority 26 | 27 | Reserve the name to start the auction. 28 | ``` 29 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry authority reserve loro" 30 | ``` 31 | ``` 32 | {"success": true} 33 | ``` 34 | 35 | ### Obtain the auction ID (not required for Stage 0) 36 | ``` 37 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry authority whois loro" 38 | ``` 39 | ``` 40 | ... 41 | "auction": { 42 | "id": "73e0b082a198c396009ce748804a9060c674a10045365d262c1584f99d2771c1", 43 | ... 44 | ``` 45 | 46 | ### Commit a bid (not required for Stage 0) 47 | 48 | Commit a bid to the auction while its status is listed as `commit` using the auction ID. A reveal file will be generated. 49 | ``` 50 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry auction bid commit 73e0b082a198c396009ce748804a9060c674a10045365d262c1584f99d2771c1 5000000 alnt --chain-id laconic_9000-1" 51 | ``` 52 | ``` 53 | {"reveal_file":"/app/out/bafyreiewi4osqyvrnljwwcb36fn6sr5iidfpuznqkz52gxc5ztt3jt4zmy.json"} 54 | ``` 55 | 56 | ### Reveal a bid (not required for Stage 0) 57 | 58 | Reveal a bid to the auction while its status is listed as `reveal` using the auction ID and the reveal file generated from the bid commit. 59 | ``` 60 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry auction bid reveal 73e0b082a198c396009ce748804a9060c674a10045365d262c1584f99d2771c1 /app/out/bafyreiewi4osqyvrnljwwcb36fn6sr5iidfpuznqkz52gxc5ztt3jt4zmy.json --chain-id laconic_9000-1" 61 | ``` 62 | ``` 63 | {"success": true} 64 | ``` 65 | 66 | ### Verify status after the auction ends (not required for Stage 0) 67 | 68 | Query the auction after the auction ends, it should list a `completed` status and a winner. 69 | ``` 70 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry auction get 73e0b082a198c396009ce748804a9060c674a10045365d262c1584f99d2771c1" 71 | ``` 72 | 73 | ### Set authority 74 | 75 | Set the authority using a bond ID. 76 | ``` 77 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry authority bond set loro fbea5d17b6a8b71c8e8fb971977b6cd2e1900621d8cbb0e463646f21d69b38ef" 78 | ``` 79 | ``` 80 | {"success": true} 81 | ``` 82 | 83 | Verify the authority has been registered. 84 | ``` 85 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry authority whois loro" 86 | ``` 87 | 88 | ## Register a name 89 | 90 | Set the name using a registered authority and an Application Record ID: 91 | ``` 92 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry name set lrn://loro/applications/webapp bafyreibmqxncmt4fuwgtf5jzx2k6zkw2iwxaags7z6wgksuqbnusmrpk24" 93 | ``` 94 | * In this example, `loro` is an active authority and `bafyreibmqxncmt4fuwgtf5jzx2k6zkw2iwxaags7z6wgksuqbnusmrpk24` is the ID of an Application Record. 95 | 96 | 97 | ## Register an Application Record 98 | 99 | Anybody looking to publish an app must register an Application Record that Application Deployment Requests can reference. 100 | 101 | * Copy the application record yaml file ([see this sample](/templates/application-record.yml)) to `laconic-console-deployment/data/laconic-registry-data/application-record.yml`. 102 | * Register the Application Record. 103 | ``` 104 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry record publish --filename /laconic-registry-data/application-record.yml --bond-id --gas 250000" 105 | ``` 106 | ``` 107 | { 108 | "id": "bafyreibmqxncmt4fuwgtf5jzx2k6zkw2iwxaags7z6wgksuqbnusmrpk24" 109 | } 110 | ``` 111 | 112 | ## Register an Application Deployment Request Record 113 | 114 | An Application Deployment Request must be registered to notify Service Providers that an app is waiting to be deployed. 115 | 116 | * Copy the application deployment request yaml file ([see this sample](/templates/application-deployment-request.yml)) to `laconic-console-deployment/data/laconic-registry-data/application-deployment-request.yml`. 117 | * Register the Application Deployment Request. 118 | ``` 119 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry record publish --filename /laconic-registry-data/application-deployment-request.yml --bond-id --gas 250000" 120 | ``` 121 | ``` 122 | { 123 | "id": "bafyreia4skpopfqre3j4romwmbtydgb5d53e2g2pvfd4kedjr7kwtrcb7u" 124 | } 125 | ``` 126 | 127 | ## Register a DNS Record 128 | 129 | A Service Provider must register a DNS Record after a successful application deployment. 130 | 131 | * Copy the DNS record yaml file ([see this sample](/templates/dns-record.yml)) to `laconic-console-deployment/data/laconic-registry-data/dns-record.yml`. 132 | * Register the DNS Record. 133 | ``` 134 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry record publish --filename /laconic-registry-data/dns-record.yml --bond-id --gas 250000" 135 | ``` 136 | ``` 137 | { 138 | "id": "bafyreie2yesktfv2jez5fyvtc2thklpg5suh6ygdy6ggijbeckmohohybm" 139 | } 140 | ``` 141 | 142 | Verify the record: 143 | ``` 144 | laconic-so deployment --dir laconic-console-deployment exec cli "laconicd registry record get --id bafyreie2yesktfv2jez5fyvtc2thklpg5suh6ygdy6ggijbeckmohohybm" 145 | ``` 146 | 147 | ## Register an Application Deployment Record 148 | 149 | A Service Provider must register an Application Deployment Record after a successful deployment. 150 | 151 | * Copy the Application deployment record yaml file ([see this sample](/templates/application-deployment-record.yml)) to `laconic-console-deployment/data/laconic-registry-data/application-deployment-record.yml`. 152 | * Register the Application Deployment Record. 153 | ``` 154 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry record publish --filename /laconic-registry-data/application-deployment-record.yml --bond-id --gas 250000" 155 | ``` 156 | ``` 157 | { 158 | "id": "bafyreieow4oybr5spo6imwtegd24t26obqhlnq5tl2mw3cvpbdq4prst7e" 159 | } 160 | ``` 161 | 162 | Verify the record: 163 | ``` 164 | laconic-so deployment --dir laconic-console-deployment exec cli "laconicd registry record get --id bafyreieow4oybr5spo6imwtegd24t26obqhlnq5tl2mw3cvpbdq4prst7e" 165 | ``` 166 | 167 | ## Register an Application Deployment Removal Request 168 | 169 | An Application Deployment Removal Request can be registered to notify Service Providers that an app deployment should be stopped. 170 | 171 | * Copy the application deployment removal request yaml file ([see this sample](/templates/application-deployment-removal-request.yml)) to `laconic-console-deployment/data/laconic-registry-data/application-deployment-removal-request.yml`. 172 | * Register the Application Deployment Request. 173 | ``` 174 | laconic-so deployment --dir laconic-console-deployment exec cli "laconic registry record publish --filename /laconic-registry-data/application-deployment-removal-request.yml --bond-id --gas 250000" 175 | ``` 176 | ``` 177 | { 178 | "id": "bafyreibwgtf5jzx2bnusmrpk24k6zkw2iwxaags7z6mqxncmt4fuwgksuq" 179 | } 180 | ``` 181 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Summary 2 | 3 | * The Laconic Operational Ranking and Onboarding (LORO) Testnet ran between August 12 and August 30, 2024. 4 | * The LORO Testnet was designed and operated by [Hypha Worker Co-op](https://hypha.coop/) in collaboration with [Laconic](https://www.laconic.com/). 5 | 6 | ### Participation Overview 7 | 8 | | | | 9 | | :---------------------------- | ----: | 10 | | Accounts tracked | 5353 | 11 | | Validators created | 85 | 12 | | Operational Service Providers | 45 | 13 | | Bonds created | 1948 | 14 | | Authorities registered | 975 | 15 | | Records registered | 24865 | 16 | | App URLs registered | 2076 | 17 | | Apps deployed | 1699 | 18 | 19 | # LORO Testnet 🦜 20 | 21 | Welcome to the Laconic Operational Ranking and Onboarding Testnet! This is a three-week incentivized testnet program that will onboard and assess participants interested in joining the [Laconic Network](https://laconic.com/). 22 | 23 | This repo contains the event plan and information on the tasks that must be completed to collect points. 24 | 25 | ## Operator Profile 26 | 27 | The main goal of the LORO testnet is to identify qualified Service Providers to operate in the Laconic Network. 28 | 29 | You should sign up as a Validator/Service Provider if: 30 | * You have experience managing cloud infrastructure and cluster deployments. 31 | * You have experience deploying infrastructure on demand. 32 | * You have experience working with CI/CD app deployment pipelines. 33 | 34 | ## How to Join 35 | 36 | ### Sign up 37 | 38 | You must follow a sign-up process regardless of whether you are participating as a Validator/Service Provider or as an App Publisher. 39 | 40 | Open the [wallet](https://wallet.laconic.com/) and [onboarding](https://loro-signup.laconic.com/) apps in separate tabs and follow the steps below. 41 | 42 | | Wallet app | Onboarding app | 43 | | :----------------------------------- | :------------------------------------------------------------------- | 44 | | Click on `Create wallet`* | | 45 | | | Accept the Terms and Conditions | 46 | | | Verify your email adddress | 47 | | | Click on `Connect wallet` | 48 | | | Click the top-right icon of the WalletConnect dialog to copy the URI | 49 | | Click the top-right icon of the page | | 50 | | Click on `Pair` and paste the URI | | 51 | | | Select the Laconic and Nitro accounts from your wallet | 52 | | | Sign using the Nitro key | 53 | | Approve the sign request | | 54 | | | Select your role | 55 | | | Click the `Request tokens from faucet` button** | 56 | | | Send transaction request to the wallet | 57 | | Approve and send transaction | | 58 | 59 | **\* Save the mnemonic in a safe place.** 60 | \** Ensure the displayed balance is updated. 61 | 62 | ### Set up a Validator Node 63 | 64 | The testnet chain will be started through a two-staged process: 65 | 66 | #### Stage 0 67 | 68 | * A Stage 0 chain is launched as a single-node Proof of Authority network. 69 | * The Stage 0 chain is used to collect all the onboarding app transactions and register account addresses. 70 | * At the end of Stage 0, the following items will be published in this repo: 71 | * Genesis file 72 | * Stage 1 bootstrap node information 73 | * **Participants must complete the sign-up process during this stage.** 74 | 75 | **Stage 0 requirements** 76 | 77 | Participants who have registered as Validator/Service Providers must complete Tasks 11 and 13 during Stage 0 to be eligible for Stage 1. 78 | 79 | Visit the [Stage 0 requirements page](/docs/stage-0-requirements.md) for details. 80 | 81 | #### Stage 1 82 | 83 | Follow [these instructions](/docs/validator-setup.md) to set up a validator node. 84 | 85 | * The Stage 1 chain (the LORO testnet) is launched from a bootstrap node using the genesis file generated at the end of Stage 0. 86 | * Participants sync their nodes to the Stage 1 chain using the published genesis file and Stage 1 bootstrap node peer 87 | * Participants submit a `create-validator` transaction to the chain. 88 | * **Participants must begin signing blocks within 24 hours after Stage 1 begins.** 89 | 90 | ### Set up Service Provider Infrastructure 91 | 92 | Follow [these instructions](/docs/service-provider-setup.md) to set up Service Provider infrastructure. 93 | 94 | ## Testnet Plan Overview 95 | > ⚠️ Please be aware that the schedule, tasks, and point breakdown are subject to change. ⚠️ 96 | 97 | The LORO testnet will focus on: 98 | 1. Onboarding participants to the app publishing workflow afforded by a Laconic chain and 99 | 2. Evaluating their ability to run the relevant infrastructure and maintain a reliable distributed network. 100 | 101 | Participants will be required to demonstrate their proficiency operating as validators and Service Providers. This will be accomplished by performing tasks within a Laconic network. This includes: 102 | * Running a validator node 103 | * Registering records in the Laconic chain 104 | * Publishing apps 105 | * Deploying apps 106 | 107 | Testnet coordinators will provide updates to participants via Discord channels and monitor task completion status throughout the event. 108 | 109 | After the testnet concludes, the participants will be ranked according to the tasks they completed. 110 | 111 | ### The list of tasks and associated points can be found [here](/docs/tasks.md). 112 | 113 | ## Timeline 114 | 115 | ### Week 1 116 | * Testnet launch 117 | * Participants set up Service Provider infrastructure 118 | * Participants begin registering authorities 119 | * Participants begin publishing and deploying apps 120 | 121 | ### Week 2 122 | * Participants continue to publish and deploy apps 123 | * Planned authority auctions take place 124 | 125 | ### Week 3 126 | * Planned authority auctions take place 127 | * Testnet conclusion 128 | 129 | ## Laconic Testnet Software 130 | 131 | This testnet will allow participants to become familiar with the following components: 132 | * [laconicd](https://git.vdb.to/cerc-io/laconicd) 133 | * The binary that validators must run to keep the Laconic chain online. 134 | * [laconic-registry-cli](https://git.vdb.to/cerc-io/laconic-registry-cli) 135 | * A CLI tool to interact with the Laconic chain. 136 | * [laconic-console](https://git.vdb.to/cerc-io/laconic-console) 137 | * A web application to browse records in the chain. 138 | * [stack-orchestrator](https://git.vdb.to/cerc-io/stack-orchestrator) 139 | * A CLI tool to configure and deploy laconicd, laconic-registry-cli, and laconic-console containers in a local host. 140 | * Testnet participants will be expected to use stack-orchestator to run their nodes and interact with the chain. 141 | 142 | A reference workflow for publishing apps through a Laconic chain can be found [here](/docs/publishing-webapps.md). 143 | 144 | ### Service Provider infrastructure 145 | 146 | Participants interested in becoming Service Providers must set up relevant infrastructure: 147 | * Hosts that will run apps requested via the Laconic chain (e.g. Kubernetes clusters) 148 | * Monitoring software to detect application deployment requests 149 | * DNS and Deployment Record registration tools 150 | 151 | A reference guide for setting up Service Provider infrastructure can be found [here](/docs/service-provider-setup.md). 152 | 153 | ## Rules 154 | 155 | The rules for participating in the LORO Testnet can be changed at any time. Changes will be committed here and announced in Discord by the testnet coordinators. 156 | 157 | * Engaging in any prohibited behaviour may result in disqualification. 158 | * The testnet coordinators have sole discretion over whether a behaviour qualifies as ‘prohibited’ or not, using their best judgement. 159 | * Depending on the severity of the incident, a single warning may be given before a participant is disqualified. 160 | 161 | ### Prohibited Behaviour 162 | 163 | * Any attack against a node that violates the acceptable use policy outlined by that node's cloud service provider. Please familiarize yourself with those policies (such as [Google's](https://cloud.google.com/terms/aup), [Amazon's](https://aws.amazon.com/aup/), or [DigitalOcean's](https://www.digitalocean.com/legal/acceptable-use-policy)). 164 | * Social engineering attacks against other validators. This includes but is not limited to phishing, compromising cloud account credentials, malware, and physical security attacks on data centers. 165 | * Causing long-term harm to a validator setup. 166 | * Repeated incidents of any of the ‘[dirty dozen](https://en.wikipedia.org/wiki/The_No_Asshole_Rule#Recognition)’ social behaviours recognized by Sutton’s No Asshole Rule. 167 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /results/stage1-tally-202408301853.csv: -------------------------------------------------------------------------------- 1 | Moniker,Address,Total,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 2 | BlackBlocks,laconic128vt4we3s044zycwydz9f6amzrlp7r6lnputdg,4518,400,30,40,50,40,40,40,40,40,4,50,300,600,1784,60,0,0,0,0,0,1000 3 | silent,laconic1256aqyag45x84usd6xj053musfcql74j4j3ll3,3594,400,0,40,50,40,40,40,40,40,40,50,300,600,1844,70,0,0,0,0,0,0 4 | KenZ,laconic16v0lazxvmccs0893g58fqa65m6344dlcpxrvs0,3322,400,0,28,50,40,40,40,40,40,2,50,300,600,1682,10,0,0,0,0,0,0 5 | stake-machine,laconic195fw5924wajlg4u54m7y9z52dv906qhqtaayrs,2934,400,100,8,40,40,40,36,40,40,0,50,0,600,1490,50,0,0,0,0,0,0 6 | ellipfra,laconic1axg567nvu92un33z6z547n7klkeq6ud37pwz35,2908,400,0,40,10,40,40,28,40,40,0,50,0,600,1550,70,0,0,0,0,0,0 7 | laconicbarg01,laconic1mjzrgc8ucspjz98g76c8pce026l5newrujetx0,2790,400,60,40,20,40,28,24,40,40,0,50,0,600,1368,80,0,0,0,0,0,0 8 | spidey,laconic1a2h0eck0dra2fu9xcama9rrygncjc30ex35ly5,2697,400,0,40,15,40,40,40,40,40,0,50,0,600,882,10,0,0,0,0,0,500 9 | rxpwnz,laconic19h70dln5ktxpc8mcam5nm22glr7h9qtlzvvrtq,2656,400,50,40,50,40,40,40,40,40,40,50,300,600,876,50,0,0,0,0,0,0 10 | DreamGallery,laconic1f9j8n9rqsekzp0rffe3298pytms4hfz20khge3,2620,400,0,40,50,40,40,40,40,40,40,50,300,600,900,40,0,0,0,0,0,0 11 | dragonZ,laconic1f7tursd29yrk3mnys3javqngraj5ls7k5h3vvv,2350,400,70,16,50,40,40,28,40,40,0,50,300,600,676,0,0,0,0,0,0,0 12 | wavefive,laconic1dx3jyjfpcwdwufj5uuufk84f5ugm5h4wf3jsl2,2216,400,90,40,50,40,40,40,40,40,0,50,0,600,346,90,350,0,0,0,0,0 13 | yandc,laconic14vzrlac5zte5nju9fm0ktzfz7e4zss74f6lpzx,1970,400,0,40,50,40,34,28,40,40,0,20,0,600,658,20,0,0,0,0,0,0 14 | Mekong_Labs,laconic195s2w429xuxqagkz54n55dcpfz4nwl0k62qnet,1794,400,0,40,50,40,40,40,40,40,40,50,300,600,24,40,50,0,0,0,0,0 15 | Rysiman,laconic1gqzpr9k22navgzreyfsze32p03mjz0j6evjuj0,1777,400,80,12,45,40,40,18,40,40,2,50,0,600,410,0,0,0,0,0,0,0 16 | hamzak,laconic1ylkv9ymdacumhnr6f7xdhrcvn7vxmgk4qk6adh,1694,400,0,36,50,40,6,4,40,40,0,20,0,600,458,0,0,0,0,0,0,0 17 | Jonygel,laconic1jmxg7dzyhcdya2j4heum8us62hf7s800m3vd80,1591,400,0,40,45,40,4,4,40,40,0,50,0,600,318,10,0,0,0,0,0,0 18 | SilverSurfer,laconic1xhaypaj6w2etkxkdaxvkurkrvhghq7upzs50vj,1587,400,0,32,45,40,30,24,40,40,0,50,0,600,286,0,0,0,0,0,0,0 19 | CalvinJoe,laconic1nmuxuz3z2xj5fqf2sz5nn0u2r2al7mutsl8pm7,1580,400,0,36,50,40,2,2,40,40,0,20,0,600,340,10,0,0,0,0,0,0 20 | TLanderon,laconic1x0rgcutlsqpnza9c3xn94mcxjmuc3ta05cyq32,1551,400,0,32,35,40,4,4,40,40,0,20,0,600,326,10,0,0,0,0,0,0 21 | BlockShield,laconic1fnstpxgfmj0nrr9werc8vufvlh3wxcd3lfuq2y,1534,400,0,32,40,40,4,4,40,40,0,20,0,600,314,0,0,0,0,0,0,0 22 | robsberry,laconic10vuf74jng58az05pmwrhxxjhzu9q2q27stzq5v,1529,400,0,32,35,40,4,4,40,40,0,40,0,600,284,10,0,0,0,0,0,0 23 | Dremling,laconic1zrk7h7629td9r0tm946ll94mdpzq6cmgvjytz9,1528,400,0,32,50,40,6,6,40,40,0,40,0,600,274,0,0,0,0,0,0,0 24 | Oldenzel,laconic1l3gca0c6ccmecncy9ld359yfpa09840y6pmcf0,1507,400,0,32,35,40,4,4,40,40,0,20,0,600,292,0,0,0,0,0,0,0 25 | Nodeify,laconic18uc9h349nd0w62vnleu8ywu3sur7ly0kdsgmg3,1506,400,0,40,50,40,32,24,40,40,0,50,0,600,130,10,50,0,0,0,0,0 26 | JMalone,laconic160vn8j8shg3htv4tzfftgny7m43nau8c7upxyk,1504,400,0,40,50,40,4,4,40,40,0,20,0,600,256,10,0,0,0,0,0,0 27 | kone,laconic1g54ls9mk7qjnwycd8dnww6g7t4qecthp90wpf5,1487,400,0,40,45,40,4,4,40,40,0,30,0,600,244,0,0,0,0,0,0,0 28 | Villarael,laconic1s8fqsj548sr86n4mwmdahyzyduxf5f9tkav9e7,1482,400,0,40,50,40,4,4,40,40,0,20,0,600,244,0,0,0,0,0,0,0 29 | Gonzales,laconic15twrppy7udkzd5vnd5cxghe0stddrs0ndd4mv0,1446,400,0,36,50,40,4,4,40,40,0,20,0,600,212,0,0,0,0,0,0,0 30 | Twaltoner,laconic1360txwdlk4z0604vd22dcarxt9w3ddj8d8mz8m,1440,400,0,40,50,40,4,4,40,40,0,40,0,600,182,0,0,0,0,0,0,0 31 | Cronus,laconic1xm7vrga9df0uehmq7yld7sk2zsxmu8ay54kup7,1429,400,10,36,45,40,40,40,40,40,0,50,0,600,78,10,0,0,0,0,0,0 32 | AndreasV,laconic1wrwl5557yxgqkwq4djlrz33x5nd5f0j9vh42jg,1423,400,0,32,45,40,4,4,40,40,0,50,0,600,158,10,0,0,0,0,0,0 33 | panxinyang,laconic1jyvf988g3mgelqw3snw5ukjgvewfkvrfq24tdz,1422,400,0,8,50,40,40,24,40,40,0,50,0,600,120,10,0,0,0,0,0,0 34 | AndrewNode,laconic19prpqnvrmmuyxr2vs7udl2fuqmzlln7239r4ak,1405,400,0,24,45,40,4,4,40,40,0,20,0,600,188,0,0,0,0,0,0,0 35 | Northtrend,laconic18vyuwuzukgcmdqxpgk5zpra2whfq4gwys0n2rl,1401,400,0,36,35,40,4,4,40,40,0,30,0,600,162,10,0,0,0,0,0,0 36 | NihilS,laconic1g3yjumrf2kwp7ds2zvc4v856mewtpqfwykzq87,1395,400,0,36,45,40,4,4,40,40,0,20,0,600,156,10,0,0,0,0,0,0 37 | Freelander,laconic150apfepxmmkz0ncmpjwrjzm6p8r5ae7vtdkm62,1376,400,0,40,40,40,4,4,40,40,0,30,0,600,138,0,0,0,0,0,0,0 38 | MarkCN,laconic1f9zsthuj8xywft0f6ukk92pa8t2sremyczcwk3,1374,400,0,36,50,40,4,4,40,40,0,20,0,600,140,0,0,0,0,0,0,0 39 | UtherSunlighter,laconic1zmzezvhlkhccvvej2sekvhyqseh6vhhqldeahm,1371,400,0,20,35,40,4,4,40,40,0,20,0,600,168,0,0,0,0,0,0,0 40 | MattWhew,laconic13t5gzchl0x3vg28nff7h2f5myvdgxjnn67khmr,1325,400,0,32,45,40,8,6,40,40,0,40,0,600,74,0,0,0,0,0,0,0 41 | High Stakes 🇨,laconic1vy8tnar3w7zxusnwhp5jdzw97rusr2d6n8ch5c,1322,400,0,8,20,40,40,34,14,2,2,50,0,600,2,60,50,0,0,0,0,0 42 | StarkNode,laconic164ec25vwgln6fsmmerpazx5mwtxxvsmfegxdch,1321,400,40,40,35,40,6,4,40,22,0,40,0,600,44,10,0,0,0,0,0,0 43 | Elf,laconic1ka6xtcejersljsmslc6tw9uxvfmans476v98r0,1283,400,0,24,15,40,12,10,40,40,0,10,0,600,92,0,0,0,0,0,0,0 44 | twelly8,laconic1ljwtpta6xfgtnk0e03h4t77chjygv399pr6utz,1272,400,0,40,50,40,4,4,40,40,0,20,0,600,24,10,0,0,0,0,0,0 45 | Quitlantarah,laconic1vfs90x57ufs87tn9h6zs3xylnzh97f03qy0ggz,1262,400,0,32,50,40,6,4,40,40,0,20,0,600,30,0,0,0,0,0,0,0 46 | DevinHPBR,laconic15n9e0ffypdd80eayekzj5a7zr0c0ptj6efs88e,1205,400,0,8,25,40,4,4,40,18,0,20,0,600,36,10,0,0,0,0,0,0 47 | vinfast,laconic172y0ymstezaqm9n74x42ggskzdwafxdrxhmkfl,772,400,0,40,50,40,40,40,2,40,40,0,0,0,0,80,0,0,0,0,0,0 48 | Swiss Staking,laconic1qw26grwct7xtjdrlseurh9v6g8wu2x3vded63g,702,400,0,40,50,40,40,40,40,2,0,50,0,0,0,0,0,0,0,0,0,0 49 | haihongtran,laconic16p3h7ryd65928e6gp4uexw90s8qz5zzprmssk3,700,400,0,40,50,40,40,40,0,0,40,50,0,0,0,0,0,0,0,0,0,0 50 | StakingCabin,laconic1jcn78f87emzjwgw67y994zmxvytxfm83ulyw8y,666,400,0,40,50,40,26,20,20,20,20,0,0,0,0,30,0,0,0,0,0,0 51 | onepercent-tech,laconic1yfv4v439ykjzjfrc9363an579k2tkdnwkv34jg,666,400,0,40,30,40,40,34,20,2,0,50,0,0,0,10,0,0,0,0,0,0 52 | Simply,laconic17kr7z80p57cptj22gwpnxx9r6zg6re5zkqw8rz,624,400,0,40,50,0,0,40,2,0,12,0,0,0,0,80,0,0,0,0,0,0 53 | CosmosSpaces,laconic1qsvrehuchjquanwm7gsx7cvze8t959l7zf0zpw,620,400,0,40,10,40,40,40,0,0,0,40,0,0,0,10,0,0,0,0,0,0 54 | BVS.Network,laconic1s0xx6djln8f759aqx6drragy9fugxgsyrfvknf,618,400,0,40,50,0,0,40,0,0,8,0,0,0,0,80,0,0,0,0,0,0 55 | BangKong,laconic18cd03t0zvaxuv5vz0tdyyxctw5jffrj7mggk6n,612,400,0,40,20,40,24,18,0,0,0,50,0,0,0,20,0,0,0,0,0,0 56 | zebra,laconic10a36eugqfeyg7tk3yjae2m32q29rqygw5lv99u,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0 57 | Miracle,laconic1d89fdamp75nlez00dkm5yhwlv3hyl9xudnrcnh,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0 58 | Valkyrie,laconic1kgvpkyvdu6xqtnj7wty88tm6hevt8cpj709vhv,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0 59 | Noobitard,laconic1m880g6gce8kqdqrrv0mnl7w9tfaxyffxc05clw,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0 60 | dmvl,laconic1uqjsj90catptyv0zdkpey4xzs9umyt9x6ylpuk,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0 61 | BigJ,laconic1yq8c7a4mt05e6gr00fr4sdm5mnfg5q75np606f,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0 62 | TTD,laconic1h86cd7u5lh6e9ypcfl4nne7rac86sxl3rly7cm,570,400,0,40,50,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0 63 | UwU,laconic1jjyzvt7adjjygznamya9gs0es5m6y5fxdwh2ss,570,400,0,40,50,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0 64 | Weakhand,laconic10vxgzpk6qltu3qaj5k8k3cfjqq0ewc9w4rx3j0,490,400,0,40,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65 | MTnode,laconic1nezjpcfflf8nc5yt2hx5yd20ry6ka066tth38w,490,400,0,40,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 66 | azstake,laconic1r70vhqwvf7dw2twy6m77f34fzeshp9fqxtxace,490,400,0,40,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 67 | CyberG,laconic1xwwy9944lgu3djvgmk4l4x59x5cjzczcxuj9f5,479,400,0,40,5,0,32,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0 68 | polkachu.com,laconic1jt9w26mpxxjsk63mvd4m2ynj0af09cslxaxx7r,420,400,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 69 | Nodes.Guru,laconic1092ltv0fdg6pqdm78cv3dt6zscqsrm5k5fqstc,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 70 | Stake&Relax 🦥,laconic15z2hzhxwyuajk9c94h3wf26u3q2cl3xal6kv6d,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 71 | Piki,laconic17g6l6vhhc4384deu4v6ypxq27cn470hzu5njzt,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 72 | Deni13x,laconic1d0ty07edxs0en760llgqde4t7cpugeswyn0kxa,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 73 | IAmScRay,laconic1ha00usym89adazy7g44njer8mhcpxpzljghz2r,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 74 | DANGGIA,laconic1kkv020aj5z8es9shrylvlcjfextm2srg0085ml,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 75 | PathrockNetwork,laconic1qrss36gx7rx58uffn60lx99fr0d929566mpafj,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 76 | ksalab,laconic1s9wwlmapkvptwmdgus2vlxtwdwsehd5rcpmq2e,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 77 | tarabukinivan,laconic1wy7y65nxcvdjrrzl4wepe6dz7fh8rmgvjmrwmq,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 78 | -,laconic17yaq54gwyeyef3zfy3rtthlncsk7qwu53hz7cy,340,0,0,40,50,40,40,40,0,0,40,50,0,0,0,40,0,0,0,0,0,0 79 | -,laconic1gxfd5zg2mux7zymv7d2y5m08qraq5q8etwxynh,338,0,0,40,50,40,40,40,0,0,38,50,0,0,0,40,0,0,0,0,0,0 80 | -,laconic1g3dugtdlardfg28teljfzftzfeynjheae07ytr,320,0,0,40,50,40,40,40,40,0,40,0,0,0,0,30,0,0,0,0,0,0 81 | -,laconic1s0gs30l3wq7fc6g2c4d0cnxhu9wx94llhhf4l9,300,0,0,40,50,40,40,40,0,0,40,50,0,0,0,0,0,0,0,0,0,0 82 | -,laconic14yy6dwy7ed9778u4f4p8hlavss22ypumtxmdsn,260,0,0,40,50,40,40,40,0,0,0,50,0,0,0,0,0,0,0,0,0,0 83 | -,laconic1mxzwgd0hk6wkpn4dh2g5kv8hyflww8u6xaffs7,260,0,0,40,50,40,40,40,0,0,0,50,0,0,0,0,0,0,0,0,0,0 84 | Bean,laconic1gzlnrw89c8m4lcm8k8gc4ljnaan8gceramss3p,210,0,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0 85 | -,laconic1rcssfrp47s0xmg2vahshmf6zcaadqamjel2a7r,208,0,0,40,50,0,12,38,0,0,38,0,0,0,0,30,0,0,0,0,0,0 86 | Mint,laconic158420c5azujuz5m07n22qe869we20a4czna62d,170,0,0,40,50,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0 87 | Bitboom,laconic17jmz20079jl826v669necgh6cllk9x8aeduveh,170,0,0,40,50,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0 88 | pump,laconic1hu5x653x3062s7snx5pvuzym8mth6zfyu8s99x,170,0,0,40,50,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0 89 | -,laconic1j7mrlxech8qad2whzal6te73m4rsh59uwg0pdt,143,0,0,40,35,24,24,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0 90 | -,laconic15t9kahzjza50772k7s2j78f0ptndqfwvfgrgq9,138,0,0,24,10,22,12,10,40,0,0,20,0,0,0,0,0,0,0,0,0,0 91 | -,laconic19w5x0ck6tlppcwn7hg2ww7kuhycsjw37fpwur9,138,0,0,8,10,40,40,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0 92 | -,laconic12wrfzczt0qgknjv9nle4uczujpqxrkj7p4v9uj,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0 93 | -,laconic17zcxj4fyaef42da7pk0ccqxz2a8fns5fxs2qlr,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0 94 | -,laconic1aahpp8vknsq72vamrfgnn86m4ple5xqnd5dydz,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0 95 | -,laconic1l7tc37faxf9knl9rxmkfzc26dchnrtzvderurf,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0 96 | -,laconic122mal2jwd9x2vfxrpxtd9vdz85ksggeq0tlle5,100,0,0,40,50,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0 97 | -,laconic1z3syuquq0gdhvhtjs75lcsrpplm79ycxjtdge6,100,0,0,40,50,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0 98 | -,laconic1pepnj5z8nzd7c27trg56wt2p9yzya2g9paen39,94,0,0,24,10,40,2,12,0,6,0,0,0,0,0,0,0,0,0,0,0,0 99 | -,laconic15y76s0ml2dfzef3y07x6hmcngtcaw59d8y2sls,82,0,0,12,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0 100 | -,laconic1vwyxdndfv6e3gw0m9w06xah2m3x6qhznn9ypjx,80,0,0,4,30,6,8,2,0,0,0,30,0,0,0,0,0,0,0,0,0,0 101 | -,laconic15mw2gkftx9qjv6qa7acdnl6rj9dc3ldeh39enl,74,0,0,40,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 102 | -,laconic18mrkvn2au2d7kawpdjdazn3l3lla4jv9jdfmdf,72,0,0,40,30,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 103 | -,laconic1qzwl52vns3gecngsh59y5yvg9a8m345dz2qv8x,66,0,0,40,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 104 | -,laconic1yavpc0fjk3ze33kfuuc5fra5x3nzs20ajhpef5,66,0,0,40,10,10,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0 105 | -,laconic17njvfpqxv6nc6ky5yvkk5g2r35tlvkqk4x0as9,60,0,0,40,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0 106 | -,laconic1hw5vr47nl4876nd728vcy4m44j57un67guldlv,60,0,0,40,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0 107 | -,laconic1jeylpuu59d4a5qynj8xm99ssgmk7w5w95n6q00,60,0,0,40,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0 108 | -,laconic1nthmxgdtf58mntuukz4r5v0ry6zctl2ve9aqpe,60,0,0,40,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0 109 | -,laconic1ff55lvklhd2y3p56c70gkyjjdxr5srnyrtj253,51,0,0,16,5,8,8,4,0,0,0,10,0,0,0,0,0,0,0,0,0,0 110 | -,laconic1w78xscjjjp4ygm7y0tkz5frqrhks5gw9r7hqqu,34,0,0,4,10,6,2,2,0,0,0,10,0,0,0,0,0,0,0,0,0,0 111 | -,laconic10mrtxypx3rzamn46xezsjtfwat3yyjp9kyaf9t,33,0,0,8,5,6,2,2,0,0,0,10,0,0,0,0,0,0,0,0,0,0 112 | -,laconic14dzwrzdfgln6z2vuu0jncvwjt2l7e4yl7slmjq,33,0,0,8,5,6,2,2,0,0,0,10,0,0,0,0,0,0,0,0,0,0 113 | -,laconic1l70nl4xswhdv4vxfemnrqmpee8kzavst7w4k7a,29,0,0,4,5,6,2,2,0,0,0,10,0,0,0,0,0,0,0,0,0,0 114 | -,laconic1p87hvu9szlc5ek4ggrk0yr9wfd9503h2z8j0f6,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 115 | -,laconic1krddttfs6qnrjxnaza85jnpnlx6jn2w0l2qha2,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 116 | -------------------------------------------------------------------------------- /docs/tasks.md: -------------------------------------------------------------------------------- 1 | # 📋 LORO Testnet Tasks & Awards 🏅 2 | 3 | This page will be updated if there are any adjustments to the points allocated to each task or the tasks themselves. 4 | 5 | | ID | Task | Max Points | Validator/Service Provider | App Publisher | 6 | | :---------------: | :-------------------------------------------------------- | :--------- | :------------------------: | :-----------: | 7 | | [1](#task-1) | Run a validator | 400 | ✅ | | 8 | | [2](#task-2) | Sign as many blocks as possible | 100 | ✅ | | 9 | | [3](#task-3) | Create a bond | 40 | ✅ | ✅ | 10 | | [4](#task-4) | Register an authority | 50 | ✅ | ✅ | 11 | | [5](#task-5) | Register a name | 60 | ✅ | ✅ | 12 | | [6](#tasks-6-10) | Register an application record | 40 | ✅ | ✅ | 13 | | [7](#tasks-6-10) | Register an application deployment request record | 40 | ✅ | ✅ | 14 | | [8](#tasks-6-10) | Register a DNS record | 40 | ✅ | | 15 | | [9](#tasks-6-10) | Register an application deployment record | 40 | ✅ | | 16 | | [10](#tasks-6-10) | Register an application deployment removal request record | 40 | ✅ | ✅ | 17 | | [11](#task-11) | Publish a webapp | 50 | ✅ | ✅ | 18 | | [12](#task-12) | Publish a non-reference webapp | 300 | ✅ | ✅ | 19 | | [13](#task-13) | Deploy your first webapp | 600 | ✅ | | 20 | | [14](#task-14) | Deploy webapps | 3000 | ✅ | | 21 | | [15](#task-15) | Participate in a planned authority auction | 100 | ✅ | ✅ | 22 | | [16](#task-16) | Win a planned authority auction | 500 | ✅ | ✅ | 23 | | [17](#task-17) | Create or improve deployment tooling | 1000 | ✅ | | 24 | | [18](#task-18) | Create or improve registry monitoring | 1000 | ✅ | | 25 | | [19](#task-19) | Write a new stack for the app publishing pipeline | 2000 | ✅ | ✅ | 26 | | [20](#task-20) | Provide the most assistance to other participants | 1000 | ✅ | ✅ | 27 | | [21](#task-21) | Publish a webapp from the LORO webapp wishlist | 1500 | ✅ | ✅ | 28 | | [22](#task-22) | Create an app store to display available webapps | 1000 | ✅ | ✅ | 29 | 30 | * The two columns on the right show which tasks can be claimed depending on a participant's role. 31 | 32 | ## Task Changelog 33 | 34 | * Aug 22 35 | * Add task 21: publish a webapp from the LORO webapp wishlist 36 | * Bump max points for task 20 to 1000 37 | * Aug 28 38 | * Add otterscan to webapp wishlist 39 | * Bump max points for task 21 to 1500 40 | 41 | ## Prerequisites 42 | 43 | * In order to be eligible for any tasks, you must complete the sign-up process. 44 | * You must use the laconic address registered through the onboarding process for all on-chain tasks: creating a validator, creating a bond, registering records, etc. 45 | 46 | 47 | ## Task 1 48 | Run a validator 49 | * All participants that run a validator node will be awarded 400 points. 50 | * Instructions on how to set up a node will be posted in this repo ahead of the testnet launch. 51 | 52 | 53 | ## Task 2 54 | Sign as many blocks as possible 55 | * You must run a validator node and keep downtime to a minimum. 56 | * Validators will be ranked by blocks signed: the top one will get 100 points, the second place will get 90, third place will get 80, and so on. 57 | * Only the top 10 validators will be awarded points. 58 | 59 | 60 | ## Task 3 61 | Create a bond - [instructions](/docs/instructions.md#create-a-bond) 62 | * A bond will allow you to register records on chain. 63 | * You will be awarded 4 points for each of the first 10 bonds you create, for a maximum of 40 points. 64 | 65 | ## Task 4 66 | Register an authority - [instructions](/docs/instructions.md#register-an-authority) 67 | * Registering a name requires a registered authority. 68 | * You will be awarded 5 points for each of the first 10 authorities you register, for a maximum of 50 points. 69 | * Authorities that contain offensive or language that is deemed inappropriate by the testnet coordinators will not be counted. 70 | 71 | ## Task 5 72 | Register a name - [instructions](/docs/instructions.md#register-a-name) 73 | * Names must be registered for the following: 74 | * Application Record 75 | * Dns Record 76 | * Application Deployment Record 77 | * You will be awarded 3 points for each of the first 20 names you register, for a maximum of 60 points. 78 | * Names that contain offensive or language that is deemed inappropriate by the testnet coordinators will not be counted. 79 | 80 | ## Tasks 6-10 81 | Register a record - [instructions](/docs/instructions.md#register-an-application-record) 82 | * You will be awarded 2 points for each of the first 20 records you register, per record type, for a maximum of 40 points for each of these tasks. 83 | 84 | ## Task 11 85 | Publish an app - [instructions](/docs/service-provider-setup.md#deploy-a-test-webapp) 86 | * You must publish at least one app. You can use [this repo](https://github.com/LaconicNetwork/loro-testnet-example-pwa) as reference. 87 | * This task will be considered complete when it meets the following criteria: 88 | * An Application Deployment Request is registered. 89 | * The application can be verified using the URL from the Application Deployment Record. 90 | * You will be awarded 10 points for each of the first 5 apps you publish for task 11, for a maximum of 50 points. 91 | 92 | ### Reference app 93 | 94 | * https://github.com/LaconicNetwork/loro-testnet-example-pwa 95 | 96 | ## Task 12 97 | Publish a non-reference app - [reference workflow](/docs/publishing-webapps.md) 98 | * You must publish one app that is different from the reference one listed above. 99 | * Each of these tasks will be considered complete when it meets the following criteria: 100 | * An Application Deployment Request is registered. 101 | * The Application Record includes a `non-reference` tag. 102 | * The application can be verified using the URL from the Application Deployment Record. 103 | * Testnet coordinators confirm that the deployed app is different from the reference app. 104 | * Only the first Application Record that is registered with a `non-reference` tag will be evaluated. 105 | * You will be awarded 300 points for the first non-reference app you deploy. 106 | 107 | ## Task 13 108 | Deploy your first app - [reference workflow](/docs/publishing-webapps.md) 109 | * This task will be considered complete when it meets the following criteria: 110 | * A DNS Record is registered. 111 | * An Application Deployment Record is registered. 112 | * The application can be verified using the URL from the Application Deployment Record. 113 | * A reference Service Provider setup guide can be found [here](/docs/service-provider-setup.md). 114 | * You will be awarded 600 points for the first app you deploy. 115 | 116 | ## Task 14 117 | Deploy apps - [reference workflow](/docs/publishing-webapps.md) 118 | * You must deploy multiple apps and keep them online. 119 | * The following criteria must be met for each before each task is considered eligible for points: 120 | * A DNS Record is registered. 121 | * An Application Deployment Record is registered. 122 | * The application can be verified using the URL from the Application Deployment Record. 123 | * A reference Service Provider setup guide can be found [here](/docs/service-provider-setup.md). 124 | * You will be awarded 2 points per app you deploy for each day it remains online, for a maximum of 30 points per app. 125 | * A maximum of 100 apps per Service Provider will be considered. 126 | * A maximum of 3000 points will be awarded for task 13. 127 | * Testnet coordinators will verify deployments at least once a day. If the app is not reachable at that time, that day will not be counted towards the total. 128 | 129 | ## Task 15 130 | Participate in a planned authority auction - [instructions](/docs/instructions.md#register-an-authority) 131 | * You must submit a bid commit and a bid reveal in a planned authority auction. 132 | * Testnet coordinators will announce when a planned authority auction will take place. 133 | * You will be awarded 10 points for each planned auction you participate in, for a maximum of 100 points. 134 | 135 | ## Task 16 136 | Win a planned authority auction - [instructions](/docs/instructions.md#register-an-authority) 137 | * You must win a planned authority auction and register the corresponding authority. 138 | * Testnet coordinators will announce when a planned authority auction will take place. 139 | * This task will be considered complete when the authority is [set with a bond ID](/docs/instructions.md#set-authority). 140 | * You will be awarded 50 points for each auction you win, for a maximum of 500 points. 141 | 142 | ## Task 17 143 | Create or improve deployment tooling. 144 | * You must publish code and a demo for a tool you created or contributed to in order to improve the Service Provider workflow. 145 | * Claims will be evaluated by testnet coordinators and the Laconic team. 146 | * A maximum of 1000 points will be awarded to each participant. 147 | * Open a pull request in this repository to notify testnet coordinators you have a contribution you would like to be considered. 148 | 149 | ### Laconicman 150 | - Code: https://github.com/BlackBlocks-io/laconicman 151 | - Demo: https://github.com/BlackBlocks-io/laconicman?tab=readme-ov-file#screenshots 152 | 153 | ## Task 18 154 | Create or improve registry monitoring. 155 | * You must publish code and a demo for a tool you created or contributed to in order to improve registry monitoring. 156 | * Claims will be evaluated by testnet coordinators and the Laconic team. 157 | * A maximum of 1000 points will be awarded to each participant. 158 | * Open a pull request in this repository to notify testnet coordinators you have a contribution you would like to be considered. 159 | 160 | ### Laconic Registry Leaderboard 161 | - Code: https://github.com/BlackBlocks-io/Laconic-Registry-Leaderboard 162 | - Demo: https://blackblocks.io/laconic-registry-leaderboard/ 163 | - Demo: https://laconic-registry-leaderboard-4667880952.pwa.laconic.blackblocks.io/ 164 | 165 | ## Task 19 166 | Write a new stack for the app publishing pipeline. 167 | * You must publish code and a demo for a deployment stack that does not exist yet: examples include deployer code for non-npm web apps, or an interactive app deployment dashboard. 168 | * Claims will be evaluated by testnet coordinators and the Laconic team. 169 | * A maximum of 2000 points will be awarded to each participant. 170 | * Open a pull request in this repository to notify testnet coordinators you have developed a new working stack. 171 | 172 | ### Celestia-node stack 173 | - Code: https://github.com/BlackBlocks-io/stack-orchestrator/commit/e8b91e601b41192f30733f1b3f60c3fc7eb3e47b 174 | - Demo: https://github.com/BlackBlocks-io/stack-orchestrator/commit/e8b91e601b41192f30733f1b3f60c3fc7eb3e47b#commitcomment-145918265 175 | 176 | ## Task 20 177 | Provide assistance to other participants. 178 | * Providing assistance (e.g. operational guidance and onboarding support) to other participants in Discord will be considered for point awards. 179 | * A maximum of 1000 points will be awarded to each participant that contributes towards making this testnet a smooth and positive experience. 180 | * Notable participation efforts will be evaluated by testnet coordinators and the Laconic team. 181 | 182 | ## Task 21 183 | * Publish a webapp from the LORO webapp wishlist (see below). 184 | * This task will be considered complete when it meets the following criteria: 185 | * An Application Deployment Request is registered. 186 | * The Application Record includes a `wishlist` tag. 187 | * The application can be verified using the URL from the Application Deployment Record. 188 | * Testnet coordinators confirm that the deployed app is in the wishlist. 189 | * For each webapp, the **first participant to publish it** will receive 500 points. 190 | 191 | ### LORO Webapp Wishlist 192 | 193 | 1. ~~https://github.com/osmosis-labs/osmosis-frontend~~ (claimed) 194 | 2. ~~https://github.com/DarkFlorist/Horswap~~ (claimed) 195 | 3. ~~https://github.com/otterscan/otterscan~~ (claimed) 196 | 197 | ## Task 22 198 | * Create and host an app store that displays the available webapps on the Laconic Registry. 199 | * It must display styled ApplicationRecords with relevant app information. 200 | * When an ApplicationRecord is clicked, the site must display a list of URLs deployed by Service Providers. 201 | * Each URL must have passed a health check to be shown. 202 | * Claims will be evaluated by testnet coordinators and the Laconic team. 203 | * A maximum of 1000 points will be awarded to each participant. 204 | * Open a pull request in this repository to notify testnet coordinators your site is ready for review. 205 | ### Laconic-Applications-UI 206 | - Code: https://github.com/silentnoname/Laconic-Applications-UI 207 | - Demo: https://laconic-ui.vercel.app/ or https://laconic-apps-ui-c688e77922.pwa.wavefive.app 208 | 209 | -------------------------------------------------------------------------------- /results/final-tally-2024091400.csv: -------------------------------------------------------------------------------- 1 | Moniker,Address,Total,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 2 | BlackBlocks,laconic128vt4we3s044zycwydz9f6amzrlp7r6lnputdg,10654,400,30,40,50,40,40,40,40,40,40,50,300,600,1984,60,0,1000,1000,2000,900,1000,1000 3 | silent,laconic1256aqyag45x84usd6xj053musfcql74j4j3ll3,5694,400,0,40,50,40,40,40,40,40,40,50,300,600,2044,70,0,0,0,0,900,0,1000 4 | ellipfra,laconic1axg567nvu92un33z6z547n7klkeq6ud37pwz35,4308,400,0,40,10,40,40,28,40,40,0,50,300,600,1750,70,0,0,0,0,900,0,0 5 | KenZ,laconic16v0lazxvmccs0893g58fqa65m6344dlcpxrvs0,4224,400,0,28,50,40,40,40,40,40,2,50,300,600,1684,10,0,0,0,0,900,0,0 6 | laconicbarg01,laconic1mjzrgc8ucspjz98g76c8pce026l5newrujetx0,4180,400,60,40,20,40,28,24,40,40,0,50,300,600,1558,80,0,0,0,0,900,0,0 7 | spidey,laconic1a2h0eck0dra2fu9xcama9rrygncjc30ex35ly5,4040,400,0,40,50,40,40,40,40,40,0,50,300,600,990,10,0,0,0,0,900,500,0 8 | rxpwnz,laconic19h70dln5ktxpc8mcam5nm22glr7h9qtlzvvrtq,3718,400,50,40,50,40,40,40,40,40,40,50,300,600,1038,50,0,0,0,0,900,0,0 9 | wavefive,laconic1dx3jyjfpcwdwufj5uuufk84f5ugm5h4wf3jsl2,3236,400,90,40,50,40,40,40,40,40,0,50,0,600,466,90,350,0,0,0,900,0,0 10 | DreamGallery,laconic1f9j8n9rqsekzp0rffe3298pytms4hfz20khge3,3122,400,0,40,50,40,40,40,40,40,40,50,300,600,1102,40,0,0,0,0,300,0,0 11 | stake-machine,laconic195fw5924wajlg4u54m7y9z52dv906qhqtaayrs,2934,400,100,8,40,40,40,36,40,40,0,50,0,600,1490,50,0,0,0,0,0,0,0 12 | dragonZ,laconic1f7tursd29yrk3mnys3javqngraj5ls7k5h3vvv,2350,400,70,16,50,40,40,28,40,40,0,50,300,600,676,0,0,0,0,0,0,0,0 13 | yandc,laconic14vzrlac5zte5nju9fm0ktzfz7e4zss74f6lpzx,2052,400,0,40,50,40,34,28,40,40,0,20,0,600,740,20,0,0,0,0,0,0,0 14 | Mekong_Labs,laconic195s2w429xuxqagkz54n55dcpfz4nwl0k62qnet,1894,400,0,40,50,40,40,40,40,40,40,50,300,600,24,40,50,0,0,0,100,0,0 15 | Rysiman,laconic1gqzpr9k22navgzreyfsze32p03mjz0j6evjuj0,1787,400,80,12,45,40,40,18,40,40,2,50,0,600,420,0,0,0,0,0,0,0,0 16 | hamzak,laconic1ylkv9ymdacumhnr6f7xdhrcvn7vxmgk4qk6adh,1724,400,0,36,50,40,6,4,40,40,0,20,0,600,488,0,0,0,0,0,0,0,0 17 | Jonygel,laconic1jmxg7dzyhcdya2j4heum8us62hf7s800m3vd80,1625,400,0,40,45,40,4,4,40,40,0,50,0,600,352,10,0,0,0,0,0,0,0 18 | CalvinJoe,laconic1nmuxuz3z2xj5fqf2sz5nn0u2r2al7mutsl8pm7,1622,400,0,36,50,40,2,2,40,40,0,20,0,600,382,10,0,0,0,0,0,0,0 19 | SilverSurfer,laconic1xhaypaj6w2etkxkdaxvkurkrvhghq7upzs50vj,1587,400,0,32,45,40,30,24,40,40,0,50,0,600,286,0,0,0,0,0,0,0,0 20 | TLanderon,laconic1x0rgcutlsqpnza9c3xn94mcxjmuc3ta05cyq32,1581,400,0,32,35,40,4,4,40,40,0,20,0,600,356,10,0,0,0,0,0,0,0 21 | robsberry,laconic10vuf74jng58az05pmwrhxxjhzu9q2q27stzq5v,1563,400,0,32,35,40,4,4,40,40,0,40,0,600,318,10,0,0,0,0,0,0,0 22 | BlockShield,laconic1fnstpxgfmj0nrr9werc8vufvlh3wxcd3lfuq2y,1560,400,0,32,40,40,4,4,40,40,0,20,0,600,340,0,0,0,0,0,0,0,0 23 | Dremling,laconic1zrk7h7629td9r0tm946ll94mdpzq6cmgvjytz9,1550,400,0,32,50,40,6,6,40,40,0,40,0,600,296,0,0,0,0,0,0,0,0 24 | Oldenzel,laconic1l3gca0c6ccmecncy9ld359yfpa09840y6pmcf0,1531,400,0,32,35,40,4,4,40,40,0,20,0,600,316,0,0,0,0,0,0,0,0 25 | JMalone,laconic160vn8j8shg3htv4tzfftgny7m43nau8c7upxyk,1522,400,0,40,50,40,4,4,40,40,0,20,0,600,274,10,0,0,0,0,0,0,0 26 | kone,laconic1g54ls9mk7qjnwycd8dnww6g7t4qecthp90wpf5,1507,400,0,40,45,40,4,4,40,40,0,30,0,600,264,0,0,0,0,0,0,0,0 27 | Nodeify,laconic18uc9h349nd0w62vnleu8ywu3sur7ly0kdsgmg3,1506,400,0,40,50,40,32,24,40,40,0,50,0,600,130,10,50,0,0,0,0,0,0 28 | Villarael,laconic1s8fqsj548sr86n4mwmdahyzyduxf5f9tkav9e7,1482,400,0,40,50,40,4,4,40,40,0,20,0,600,244,0,0,0,0,0,0,0,0 29 | Twaltoner,laconic1360txwdlk4z0604vd22dcarxt9w3ddj8d8mz8m,1446,400,0,40,50,40,4,4,40,40,0,40,0,600,188,0,0,0,0,0,0,0,0 30 | Gonzales,laconic15twrppy7udkzd5vnd5cxghe0stddrs0ndd4mv0,1446,400,0,36,50,40,4,4,40,40,0,20,0,600,212,0,0,0,0,0,0,0,0 31 | Cronus,laconic1xm7vrga9df0uehmq7yld7sk2zsxmu8ay54kup7,1431,400,10,36,45,40,40,40,40,40,0,50,0,600,80,10,0,0,0,0,0,0,0 32 | MattWhew,laconic13t5gzchl0x3vg28nff7h2f5myvdgxjnn67khmr,1427,400,0,32,45,40,8,6,40,40,0,40,0,600,76,0,0,0,0,0,100,0,0 33 | AndreasV,laconic1wrwl5557yxgqkwq4djlrz33x5nd5f0j9vh42jg,1423,400,0,32,45,40,4,4,40,40,0,50,0,600,158,10,0,0,0,0,0,0,0 34 | panxinyang,laconic1jyvf988g3mgelqw3snw5ukjgvewfkvrfq24tdz,1422,400,0,8,50,40,40,24,40,40,0,50,0,600,120,10,0,0,0,0,0,0,0 35 | AndrewNode,laconic19prpqnvrmmuyxr2vs7udl2fuqmzlln7239r4ak,1421,400,0,24,45,40,4,4,40,40,0,20,0,600,204,0,0,0,0,0,0,0,0 36 | Northtrend,laconic18vyuwuzukgcmdqxpgk5zpra2whfq4gwys0n2rl,1407,400,0,36,35,40,4,4,40,40,0,30,0,600,168,10,0,0,0,0,0,0,0 37 | NihilS,laconic1g3yjumrf2kwp7ds2zvc4v856mewtpqfwykzq87,1399,400,0,36,45,40,4,4,40,40,0,20,0,600,160,10,0,0,0,0,0,0,0 38 | Freelander,laconic150apfepxmmkz0ncmpjwrjzm6p8r5ae7vtdkm62,1380,400,0,40,40,40,4,4,40,40,0,30,0,600,142,0,0,0,0,0,0,0,0 39 | MarkCN,laconic1f9zsthuj8xywft0f6ukk92pa8t2sremyczcwk3,1378,400,0,36,50,40,4,4,40,40,0,20,0,600,144,0,0,0,0,0,0,0,0 40 | UtherSunlighter,laconic1zmzezvhlkhccvvej2sekvhyqseh6vhhqldeahm,1371,400,0,20,35,40,4,4,40,40,0,20,0,600,168,0,0,0,0,0,0,0,0 41 | High Stakes 🇨,laconic1vy8tnar3w7zxusnwhp5jdzw97rusr2d6n8ch5c,1324,400,0,8,20,40,40,34,14,2,2,50,0,600,4,60,50,0,0,0,0,0,0 42 | StarkNode,laconic164ec25vwgln6fsmmerpazx5mwtxxvsmfegxdch,1321,400,40,40,35,40,6,4,40,22,0,40,0,600,44,10,0,0,0,0,0,0,0 43 | Elf,laconic1ka6xtcejersljsmslc6tw9uxvfmans476v98r0,1283,400,0,24,15,40,12,10,40,40,0,10,0,600,92,0,0,0,0,0,0,0,0 44 | twelly8,laconic1ljwtpta6xfgtnk0e03h4t77chjygv399pr6utz,1276,400,0,40,50,40,4,4,40,40,0,20,0,600,28,10,0,0,0,0,0,0,0 45 | Quitlantarah,laconic1vfs90x57ufs87tn9h6zs3xylnzh97f03qy0ggz,1268,400,0,32,50,40,6,4,40,40,0,20,0,600,36,0,0,0,0,0,0,0,0 46 | DevinHPBR,laconic15n9e0ffypdd80eayekzj5a7zr0c0ptj6efs88e,1205,400,0,8,25,40,4,4,40,18,0,20,0,600,36,10,0,0,0,0,0,0,0 47 | vinfast,laconic172y0ymstezaqm9n74x42ggskzdwafxdrxhmkfl,772,400,0,40,50,40,40,40,2,40,40,0,0,0,0,80,0,0,0,0,0,0,0 48 | CosmosSpaces,laconic1qsvrehuchjquanwm7gsx7cvze8t959l7zf0zpw,720,400,0,40,10,40,40,40,0,0,0,40,0,0,0,10,0,0,0,0,100,0,0 49 | Swiss Staking,laconic1qw26grwct7xtjdrlseurh9v6g8wu2x3vded63g,702,400,0,40,50,40,40,40,40,2,0,50,0,0,0,0,0,0,0,0,0,0,0 50 | haihongtran,laconic16p3h7ryd65928e6gp4uexw90s8qz5zzprmssk3,700,400,0,40,50,40,40,40,0,0,40,50,0,0,0,0,0,0,0,0,0,0,0 51 | StakingCabin,laconic1jcn78f87emzjwgw67y994zmxvytxfm83ulyw8y,666,400,0,40,50,40,26,20,20,20,20,0,0,0,0,30,0,0,0,0,0,0,0 52 | onepercent-tech,laconic1yfv4v439ykjzjfrc9363an579k2tkdnwkv34jg,666,400,0,40,30,40,40,34,20,2,0,50,0,0,0,10,0,0,0,0,0,0,0 53 | Simply,laconic17kr7z80p57cptj22gwpnxx9r6zg6re5zkqw8rz,624,400,0,40,50,0,0,40,2,0,12,0,0,0,0,80,0,0,0,0,0,0,0 54 | BVS.Network,laconic1s0xx6djln8f759aqx6drragy9fugxgsyrfvknf,618,400,0,40,50,0,0,40,0,0,8,0,0,0,0,80,0,0,0,0,0,0,0 55 | BangKong,laconic18cd03t0zvaxuv5vz0tdyyxctw5jffrj7mggk6n,612,400,0,40,20,40,24,18,0,0,0,50,0,0,0,20,0,0,0,0,0,0,0 56 | zebra,laconic10a36eugqfeyg7tk3yjae2m32q29rqygw5lv99u,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 57 | Miracle,laconic1d89fdamp75nlez00dkm5yhwlv3hyl9xudnrcnh,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 58 | TTD,laconic1h86cd7u5lh6e9ypcfl4nne7rac86sxl3rly7cm,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 59 | UwU,laconic1jjyzvt7adjjygznamya9gs0es5m6y5fxdwh2ss,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 60 | Valkyrie,laconic1kgvpkyvdu6xqtnj7wty88tm6hevt8cpj709vhv,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 61 | Noobitard,laconic1m880g6gce8kqdqrrv0mnl7w9tfaxyffxc05clw,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 62 | dmvl,laconic1uqjsj90catptyv0zdkpey4xzs9umyt9x6ylpuk,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 63 | BigJ,laconic1yq8c7a4mt05e6gr00fr4sdm5mnfg5q75np606f,610,400,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 64 | Weakhand,laconic10vxgzpk6qltu3qaj5k8k3cfjqq0ewc9w4rx3j0,490,400,0,40,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 65 | MTnode,laconic1nezjpcfflf8nc5yt2hx5yd20ry6ka066tth38w,490,400,0,40,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 66 | azstake,laconic1r70vhqwvf7dw2twy6m77f34fzeshp9fqxtxace,490,400,0,40,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 67 | CyberG,laconic1xwwy9944lgu3djvgmk4l4x59x5cjzczcxuj9f5,479,400,0,40,5,0,32,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 68 | polkachu.com,laconic1jt9w26mpxxjsk63mvd4m2ynj0af09cslxaxx7r,420,400,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 69 | Nodes.Guru,laconic1092ltv0fdg6pqdm78cv3dt6zscqsrm5k5fqstc,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 70 | Stake&Relax 🦥,laconic15z2hzhxwyuajk9c94h3wf26u3q2cl3xal6kv6d,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 71 | Piki,laconic17g6l6vhhc4384deu4v6ypxq27cn470hzu5njzt,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 72 | Deni13x,laconic1d0ty07edxs0en760llgqde4t7cpugeswyn0kxa,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 73 | IAmScRay,laconic1ha00usym89adazy7g44njer8mhcpxpzljghz2r,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 74 | DANGGIA,laconic1kkv020aj5z8es9shrylvlcjfextm2srg0085ml,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 75 | PathrockNetwork,laconic1qrss36gx7rx58uffn60lx99fr0d929566mpafj,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 76 | ksalab,laconic1s9wwlmapkvptwmdgus2vlxtwdwsehd5rcpmq2e,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 77 | tarabukinivan,laconic1wy7y65nxcvdjrrzl4wepe6dz7fh8rmgvjmrwmq,400,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 78 | -,laconic17yaq54gwyeyef3zfy3rtthlncsk7qwu53hz7cy,340,0,0,40,50,40,40,40,0,0,40,50,0,0,0,40,0,0,0,0,0,0,0 79 | -,laconic1gxfd5zg2mux7zymv7d2y5m08qraq5q8etwxynh,338,0,0,40,50,40,40,40,0,0,38,50,0,0,0,40,0,0,0,0,0,0,0 80 | -,laconic1g3dugtdlardfg28teljfzftzfeynjheae07ytr,320,0,0,40,50,40,40,40,40,0,40,0,0,0,0,30,0,0,0,0,0,0,0 81 | -,laconic1s0gs30l3wq7fc6g2c4d0cnxhu9wx94llhhf4l9,300,0,0,40,50,40,40,40,0,0,40,50,0,0,0,0,0,0,0,0,0,0,0 82 | -,laconic14yy6dwy7ed9778u4f4p8hlavss22ypumtxmdsn,260,0,0,40,50,40,40,40,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0 83 | -,laconic1mxzwgd0hk6wkpn4dh2g5kv8hyflww8u6xaffs7,260,0,0,40,50,40,40,40,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0 84 | Mint,laconic158420c5azujuz5m07n22qe869we20a4czna62d,210,0,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 85 | Bitboom,laconic17jmz20079jl826v669necgh6cllk9x8aeduveh,210,0,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 86 | Bean,laconic1gzlnrw89c8m4lcm8k8gc4ljnaan8gceramss3p,210,0,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 87 | pump,laconic1hu5x653x3062s7snx5pvuzym8mth6zfyu8s99x,210,0,0,40,50,0,0,40,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0 88 | -,laconic1rcssfrp47s0xmg2vahshmf6zcaadqamjel2a7r,208,0,0,40,50,0,12,38,0,0,38,0,0,0,0,30,0,0,0,0,0,0,0 89 | -,laconic1j7mrlxech8qad2whzal6te73m4rsh59uwg0pdt,143,0,0,40,35,24,24,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0 90 | -,laconic15t9kahzjza50772k7s2j78f0ptndqfwvfgrgq9,138,0,0,24,10,22,12,10,40,0,0,20,0,0,0,0,0,0,0,0,0,0,0 91 | -,laconic19w5x0ck6tlppcwn7hg2ww7kuhycsjw37fpwur9,138,0,0,8,10,40,40,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 92 | -,laconic12wrfzczt0qgknjv9nle4uczujpqxrkj7p4v9uj,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0 93 | -,laconic17njvfpqxv6nc6ky5yvkk5g2r35tlvkqk4x0as9,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0 94 | -,laconic17zcxj4fyaef42da7pk0ccqxz2a8fns5fxs2qlr,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0 95 | -,laconic1aahpp8vknsq72vamrfgnn86m4ple5xqnd5dydz,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0 96 | -,laconic1hw5vr47nl4876nd728vcy4m44j57un67guldlv,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0 97 | -,laconic1jeylpuu59d4a5qynj8xm99ssgmk7w5w95n6q00,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0 98 | -,laconic1l7tc37faxf9knl9rxmkfzc26dchnrtzvderurf,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0 99 | -,laconic1nthmxgdtf58mntuukz4r5v0ry6zctl2ve9aqpe,110,0,0,40,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0 100 | -,laconic122mal2jwd9x2vfxrpxtd9vdz85ksggeq0tlle5,100,0,0,40,50,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0 101 | -,laconic1z3syuquq0gdhvhtjs75lcsrpplm79ycxjtdge6,100,0,0,40,50,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0 102 | -,laconic1pepnj5z8nzd7c27trg56wt2p9yzya2g9paen39,94,0,0,24,10,40,2,12,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0 103 | -,laconic15y76s0ml2dfzef3y07x6hmcngtcaw59d8y2sls,82,0,0,12,50,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0 104 | -,laconic1vwyxdndfv6e3gw0m9w06xah2m3x6qhznn9ypjx,80,0,0,4,30,6,8,2,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0 105 | -,laconic15mw2gkftx9qjv6qa7acdnl6rj9dc3ldeh39enl,74,0,0,40,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 106 | -,laconic18mrkvn2au2d7kawpdjdazn3l3lla4jv9jdfmdf,72,0,0,40,30,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 107 | -,laconic1qzwl52vns3gecngsh59y5yvg9a8m345dz2qv8x,66,0,0,40,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 108 | -,laconic1yavpc0fjk3ze33kfuuc5fra5x3nzs20ajhpef5,66,0,0,40,10,10,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 109 | -,laconic1ff55lvklhd2y3p56c70gkyjjdxr5srnyrtj253,51,0,0,16,5,8,8,4,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0 110 | -,laconic157jy998f0x2m0kms8r6mmfs3zazljpd0svd9ne,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 111 | -,laconic16pxr8lupfcswatynedc76ynw5f74jpcmjt28vs,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 112 | -,laconic17g9ytaauphqv5lawthk2hj9n04eardz28yvnfk,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 113 | -,laconic17uukytqarpu6wsmjcqgfcs2tjhwhfu6eq72cpw,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 114 | -,laconic1def6v3qja77srmkzyvgj2q8hjg587cp70hne5w,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 115 | -,laconic1felvw4a256vul8krvhw5rk49zm24955c0awshw,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 116 | -,laconic1hmpg66gpnfr4a7qw8d0u4n4zuw55mz4t7um3jt,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 117 | -,laconic1hs45zt8q6l3aklmgs7cj8m98ueq2x7faguzvvh,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 118 | -,laconic1mdzgqw7re2fuws0uycpm90nt07d6ntsk5alt4j,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 119 | -,laconic1nr6z78gkf6swk9m02qtdazde7jr9csetv402wr,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 120 | -,laconic1qjjvdwlt2u5cgmaxn6l66nwnqw9fs4vl7g045h,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 121 | -,laconic1qykx88yyy3a6udmqfu3aej40rymklnynfr5cq8,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 122 | -,laconic1rdtz32xsgw7yrjfrue36pglevpymc5aflu4cfy,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 123 | -,laconic1rw5z8squ9quq0d4hszxx28rxqzmnyzst4eknd5,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 124 | -,laconic1xnvd8fdr5zwfa2thdlr2pg22ndg4e0dptqfav9,40,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 125 | -,laconic1w78xscjjjp4ygm7y0tkz5frqrhks5gw9r7hqqu,34,0,0,4,10,6,2,2,0,0,0,10,0,0,0,0,0,,,,,, 126 | -,laconic10mrtxypx3rzamn46xezsjtfwat3yyjp9kyaf9t,33,0,0,8,5,6,2,2,0,0,0,10,0,0,0,0,0,,,,,, 127 | -,laconic14dzwrzdfgln6z2vuu0jncvwjt2l7e4yl7slmjq,33,0,0,8,5,6,2,2,0,0,0,10,0,0,0,0,0,,,,,, 128 | -,laconic1l70nl4xswhdv4vxfemnrqmpee8kzavst7w4k7a,29,0,0,4,5,6,2,2,0,0,0,10,0,0,0,0,0,,,,,, 129 | -,laconic1p87hvu9szlc5ek4ggrk0yr9wfd9503h2z8j0f6,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 130 | -,laconic15ztdmf4hp2rd98z8ng5sg76d7c4u53nk5u88a0,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, 131 | -,laconic1krddttfs6qnrjxnaza85jnpnlx6jn2w0l2qha2,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,,,,,, -------------------------------------------------------------------------------- /docs/service-provider-setup.md: -------------------------------------------------------------------------------- 1 | # Service Provider Setup Guide 2 | 3 | ## Requirements 4 | 5 | Using DigitalOcean's droplets as reference, these are the minimum suggested specifications: 6 | 7 | - daemon (2 vCPUs, 4G RAM) 8 | - This host will run `laconicd`. You can set up a private testnet for testing purposes. 9 | - orchestrator (2 vCPUs, 4G RAM) 10 | - You will manage the entire Service Provider infrastructure from this host. 11 | - control (8vCPUs, 32G RAM) 12 | - This host will run a cluster to deploy all the applications requested from the Laconic chain. 13 | 14 | ## Buy a domain and configure nameservers to DO 15 | 16 | * In this example, we are using laconic.com with [nameservers pointing to DigitalOcean](https://docs.digitalocean.com/products/networking/dns/getting-started/dns-registrars/). You'll need to do the same. Integration with other providers is possible and encouraged, but requires know-how and research. 17 | * Generate a DigitalOcean Access Token, we will need one later. 18 | 19 | ## Configure DNS 20 | 21 | Point your nameservers to DigitalOcean and create the following A and CNAME records from the DigitalOcean Dashboard. 22 | 23 | Like this: 24 | 25 | | Type | Hostname | Value | 26 | |--------|--------------------------------------|--------------------------------------| 27 | | A | lcn-daemon.laconic.com | 23.111.69.218 | 28 | | A | lcn-cad-cluster-control.laconic.com | 23.111.78.179 | 29 | | NS | laconic.com | ns1.digitalocean.com. | 30 | | NS | laconic.com | ns2.digitalocean.com. | 31 | | NS | laconic.com | ns3.digitalocean.com. | 32 | | CNAME | www.laconic.com | laconic.com. | 33 | | CNAME | laconicd.laconic.com | lcn-daemon.laconic.com. | 34 | | CNAME | lcn-backend.laconic.com | lcn-daemon.laconic.com. | 35 | | CNAME | lcn-console.laconic.com | lcn-daemon.laconic.com. | 36 | | CNAME | lcn-cad.laconic.com | lcn-cad-cluster-control.laconic.com. | 37 | | CNAME | *.lcn-cad.laconic.com | lcn-cad-cluster-control.laconic.com. | 38 | | CNAME | pwa.laconic.com | lcn-cad-cluster-control.laconic.com. | 39 | | CNAME | *.pwa.laconic.com | lcn-cad-cluster-control.laconic.com. | 40 | 41 | ## Initial Ubuntu base setup: `control` and `daemon` hosts 42 | 43 | 1. Set unique hostnames. 44 | 45 | ``` 46 | hostnamectl set-hostname changeme 47 | ``` 48 | 49 | In the following example, we've named each machine like so: 50 | ``` 51 | lcn-daemon 23.111.69.218 52 | lcn-cad-cluster-control 23.111.78.182 53 | ``` 54 | 55 | See below for the full list of DNS records to be configured. 56 | 57 | 2. Update base packages. 58 | 59 | ``` 60 | apt update && apt upgrade -y 61 | ``` 62 | 63 | 3. Install additional packages. 64 | 65 | ``` 66 | apt install -y doas zsh tmux git jq acl curl wget netcat-traditional fping rsync htop iotop iftop tar less firewalld sshguard wireguard iproute2 iperf3 zfsutils-linux net-tools ca-certificates gnupg sshpass 67 | ``` 68 | 69 | Select "Yes" when prompted for iperf3. 70 | 71 | 4. Verify status of firewalld and enable sshguard. 72 | 73 | ``` 74 | systemctl enable --now firewalld 75 | systemctl enable --now sshguard 76 | ``` 77 | 78 | 5. Disable and remove snapd. 79 | 80 | ``` 81 | systemctl disable snapd.service 82 | systemctl disable snapd.socket 83 | systemctl disable snapd.seeded 84 | systemctl disable snapd.snap-repair.timer 85 | 86 | apt purge -y snapd 87 | 88 | rm -rf ~/snap /snap /var/snap /var/lib/snapd 89 | ``` 90 | 91 | 6. Create a `so` user. 92 | 93 | We will use the password `so-service-provider` in this example. 94 | ``` 95 | adduser so 96 | ``` 97 | 98 | 7. Give the `so` user sudoer permissions. 99 | ``` 100 | sudo adduser so sudo 101 | ``` 102 | 103 | 8. Run `ssh-keygen` in the `orchestrator` host and copy the pubkey from `~/.ssh/id_d25519.pub`. 104 | 105 | 9. Create a `/home/so/.ssh/authorized_keys` file in both `lcn-daemon` and `lcn-cad-cluster-control`, and paste the pubkey from the previous step in it. 106 | 107 | ## Setup a k8s cluster with Ansible: `orchestrator` host only 108 | 109 | 1. Install stack orchestrator. 110 | 111 | ``` 112 | mkdir ~/bin 113 | curl -L -o ~/bin/laconic-so https://git.vdb.to/cerc-io/stack-orchestrator/releases/download/latest/laconic-so 114 | chmod +x ~/bin/laconic-so 115 | ``` 116 | 117 | 2. Add `export PATH="$HOME/bin:$PATH"` to `~/.bashrc` , log out, and log back in. 118 | 119 | 3. Verify stack orchestrator is in the PATH. 120 | ``` 121 | laconic-so version 122 | ``` 123 | 124 | 4. Install ansible via virtual env. 125 | 126 | ``` 127 | sudo apt install python3-pip python3.12-venv 128 | python3.12 -m venv ~/.local/venv/ansible 129 | source ~/.local/venv/ansible/bin/activate 130 | pip install ansible 131 | ansible --version 132 | ``` 133 | 134 | 5. Install docker and test with `docker run hello-world` afterwards. 135 | 136 | ``` 137 | install -m 0755 -d /etc/apt/keyrings 138 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg 139 | chmod a+r /etc/apt/keyrings/docker.gpg 140 | 141 | echo \ 142 | "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ 143 | "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null 144 | 145 | apt update -y && apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 146 | ``` 147 | 148 | 6. Clone the service provider template repo and enter the directory 149 | 150 | ``` 151 | git clone https://git.vdb.to/cerc-io/service-provider-template.git 152 | cd service-provider-template/ 153 | ``` 154 | 155 | 7. Create a PGP key. You will need to use the passphrase from this step later on. We used `so-service-provider` in this example. 156 | 157 | ``` 158 | gpg --full-generate-key 159 | ``` 160 | 161 | 8. List the secret keys. 162 | ``` 163 | gpg --list-secret-keys --keyid-format=long 164 | ``` 165 | 166 | This will output something like this: 167 | ``` 168 | [keyboxd] 169 | --------- 170 | sec rsa4096/0AFB10B643944C22 2024-05-03 [SC] [expires: 2025-05-03] 171 | 17B3248D6784EC6CB43365A60AFB10B643944C22 172 | uid [ultimate] user 173 | ``` 174 | 175 | Note the `0AFB10B643944C22` sequence of characters. 176 | 177 | 9. Replace the keys listed in `.vault/vault-keys` with the sequence you obtained in the previous step (`0AFB10B643944C22` in this example). 178 | 179 | 10. Start the GPG agent. 180 | 181 | ``` 182 | gpg-agent 183 | ``` 184 | 185 | 11. Run `export VAULT_KEY=password`, where `password` is the passphrase used when generating the PGP key. 186 | 187 | 12. Run `bash .vault/vault-rekey.sh` and enter the GPG passphrase again when prompted. 188 | 189 | 13. Review [this pull request](https://git.vdb.to/cerc-io/service-provider-template/pulls/4) and make the required modifications to match your setup. 190 | * `lcn`/`msp`: This can be replaced a three-letter identifier for your organization. 191 | * `cad`: This can be replaced with a three-letter identifier for the location the host is running in. 192 | * `laconic.com`: Replace this with your equivalent DNS domain. 193 | 194 | 14. Install required Ansible roles. 195 | 196 | ``` 197 | ansible-galaxy install -f -p roles -r roles/requirements.yml 198 | ``` 199 | 200 | 15. Install k8s helper tools. 201 | 202 | ``` 203 | sudo ./roles/k8s/files/scripts/get-kube-tools.sh 204 | ``` 205 | 206 | 16. Update `group_vars/all/vault.yml` as follows, replacing the email address: 207 | 208 | ``` 209 | --- 210 | support_email: hello@laconic.com 211 | ``` 212 | 213 | 17. Base64 encode your DigitalOcean token: 214 | 215 | ``` 216 | echo dop_v1 | base64 -w 0 217 | ``` 218 | 219 | 18. Update `files/manifests/secret-digitalocean-dns.yaml` using the output from the previous step: 220 | 221 | ``` 222 | apiVersion: v1 223 | kind: Namespace 224 | metadata: 225 | name: cert-manager 226 | --- 227 | apiVersion: v1 228 | data: 229 | access-token: 230 | kind: Secret 231 | metadata: 232 | name: digitalocean-dns 233 | namespace: cert-manager 234 | ``` 235 | 236 | 19. Remove the `./group_vars/lcn_cad/k8s-vault.yml` file. 237 | 238 | ``` 239 | rm ./group_vars/lcn_cad/k8s-vault.yml 240 | ``` 241 | 242 | 243 | 20. Generate token for the cluster. 244 | 245 | * Change `lcn_cad` in the command below to the name used for your service provider deployment: 246 | ``` 247 | ./roles/k8s/files/scripts/token-vault.sh ./group_vars/lcn_cad/k8s-vault.yml 248 | ``` 249 | 250 | 21. Configure firewalld and nginx for hosts. 251 | 252 | ``` 253 | ansible-playbook -i hosts site.yml --tags=firewalld,nginx --user so -kK 254 | ``` 255 | When prompted, enter the password for the `so` user that was created both the daemon and control machines (`so-service-provider` in this example). 256 | 257 | 22. Install Stack Orchestrator for hosts. 258 | 259 | ``` 260 | ansible-playbook -i hosts site.yml --tags=so --limit=so --user so -kK 261 | ``` 262 | Enter the `so` user password again (`so-service-provider` in this example). 263 | 264 | 23. Deploy k8s to hosts 265 | 266 | This step creates the cluster and puts `kubeconfig.yml` on your local machine here: `~/.kube/config-default.yaml`. You will need it later. 267 | 268 | ``` 269 | ansible-playbook -i hosts site.yml --tags=k8s --limit=lcn_cad --user so -kK 270 | ``` 271 | Enter the `so` user password again (`so-service-provider` in this example). 272 | 273 | **Note:** For debugging, to undeploy, add `--extra-vars 'k8s_action=destroy'` to the above command. 274 | 275 | 24. Verify cluster creation 276 | 277 | Run these commands to view the various resources that were created by the ansible playbook. Your output form each commmand should look similar. 278 | 279 | ``` 280 | kubie ctx default 281 | # this allows you to run kubectl commands 282 | ``` 283 | 284 | ``` 285 | kubectl get nodes -o wide 286 | 287 | NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME 288 | lnt-cad-cluster-control Ready control-plane,etcd,master 27m v1.29.6+k3s2 147.182.144.6 147.182.144.6 Ubuntu 24.04 LTS 6.8.0-36-generic containerd://1.7.17-k3s1 289 | ``` 290 | ``` 291 | kubectl get secrets --all-namespaces 292 | 293 | NAMESPACE NAME TYPE DATA AGE 294 | cert-manager cert-manager-webhook-ca Opaque 3 3m14s 295 | cert-manager digitalocean-dns Opaque 1 3m30s 296 | cert-manager letsencrypt-prod-prviate-key Opaque 1 3m3s 297 | cert-manager letsencrypt-prod-wild-prviate-key Opaque 1 3m3s 298 | default pwa.laconic.com-lsnz4 Opaque 1 3m3s 299 | ingress-nginx ingress-nginx-admission Opaque 3 3m13s 300 | kube-system k3s-serving kubernetes.io/tls 2 28m 301 | kube-system lcn-cad-cluster-control.node-password.k3s Opaque 1 28m 302 | ``` 303 | 304 | ``` 305 | kubectl get clusterissuer 306 | 307 | NAME READY AGE 308 | letsencrypt-prod True 4m8s 309 | letsencrypt-prod-wild True 4m8s 310 | ``` 311 | 312 | ``` 313 | kubectl get certificates 314 | 315 | NAME READY SECRET AGE 316 | pwa.laconic.com True pwa.laconic.com 4m31s 317 | ``` 318 | 319 | ``` 320 | kubectl get ds --all-namespaces 321 | 322 | NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE 323 | kube-system svclb-ingress-nginx-controller-a766a501 1 1 1 1 1 5m32s 324 | ``` 325 | 326 | ### Ansible Vault Notes 327 | 328 | With `ansible-vault`, files are encrypted this way: 329 | 330 | ``` 331 | ansible-vault encrypt path/to/file.yaml 332 | ``` 333 | 334 | and the result overwrites the original file with the encrypted version. 335 | 336 | To decrypt that file, run: 337 | 338 | ``` 339 | echo 'content-of-the-file' | ansible-vault decrypt 340 | ``` 341 | 342 | and the decrypted file will be output to stdout. 343 | 344 | You can add additional PGP key IDs to the `.vault/vault-keys` file and re-key the vault to give other users access. 345 | 346 | ### Nginx and SSL 347 | 348 | If your initial ansible configuration was modified correctly; nginx and SSL will work. The k8s cluster was created with these features automated. 349 | 350 | ## Deploy docker image (container) registry 351 | 352 | This will be the first test that everything is configured correctly. 353 | 354 | 1. Generate the spec file for the `container-registry` stack. 355 | ``` 356 | laconic-so --stack container-registry deploy init --output container-registry.spec 357 | ``` 358 | 359 | 2. Modify the `container-registry.spec` as shown below. 360 | * Set the `host-name` field according to your configuration. 361 | 362 | ``` 363 | stack: container-registry 364 | deploy-to: k8s 365 | kube-config: /root/.kube/config-default.yaml 366 | network: 367 | ports: 368 | registry: 369 | - '5000' 370 | http-proxy: 371 | - host-name: container-registry.pwa.laconic.com 372 | routes: 373 | - path: '/' 374 | proxy-to: registry:5000 375 | volumes: 376 | registry-data: 377 | configmaps: 378 | config: ./configmaps/config 379 | ``` 380 | 381 | 3. Create the deployment directory for the `container-registry` stack. 382 | ``` 383 | laconic-so --stack container-registry deploy create --deployment-dir container-registry --spec-file container-registry.spec 384 | ``` 385 | 386 | The above commands created a new directory; `container-registry`. It should contain the following: 387 | 388 | ``` 389 | $ ls 390 | compose/ config.env configmaps/ deployment.yml kubeconfig.yml pods/ spec.yml stack.yml 391 | ``` 392 | 393 | ### Configure access to the container registry 394 | 395 | 1. Generate a username and password for the container registry. 396 | * Username: `so-reg-user` 397 | * Password: `pXDwO5zLU7M88x3aA` 398 | 399 | 2. Base64 encode the container registry credentials. 400 | ``` 401 | echo -n "so-reg-user:pXDwO5zLU7M88x3aA" | base64 -w0 402 | c28tcmVnLXVzZXI6cFhEd081ekxVN004OHgzYUE= 403 | ``` 404 | 405 | 3. Encrypt the container registry credentials to create an `htpasswd` file: 406 | 407 | ``` 408 | htpasswd -bB -c container-registry/configmaps/config/htpasswd so-reg-user pXDwO5zLU7M88x3aA 409 | ``` 410 | 411 | The resulting file should look like this: 412 | ``` 413 | so-reg-user:$2y$05$Eds.WkuUgn6XFUL8/NKSt.JTX.gCuXRGQFyJaRit9HhrUTsVrhH.W 414 | ``` 415 | 416 | 4. Using the credentials from the previous steps, create a `container-registry/my_password.json` file. 417 | 418 | ``` 419 | { 420 | "auths": { 421 | "container-registry.pwa.laconic.com": { 422 | "username": "so-reg-user", 423 | "password": "$2y$05$Eds.WkuUgn6XFUL8/NKSt.JTX.gCuXRGQFyJaRit9HhrUTsVrhH.W", 424 | "auth": "c28tcmVnLXVzZXI6cFhEd081ekxVN004OHgzYUE=" 425 | } 426 | } 427 | } 428 | ``` 429 | 430 | 5. Configure the file `container-registry/config.env` as follows: 431 | 432 | ``` 433 | REGISTRY_AUTH=htpasswd 434 | REGISTRY_AUTH_HTPASSWD_REALM="LCN Service Provider Image Registry" 435 | REGISTRY_AUTH_HTPASSWD_PATH="/config/htpasswd" 436 | REGISTRY_HTTP_SECRET='$2y$05$Eds.WkuUgn6XFUL8/NKSt.JTX.gCuXRGQFyJaRit9HhrUTsVrhH.W' 437 | ``` 438 | 439 | 6. Add the container registry credentials as a secret available to the cluster: 440 | 441 | ``` 442 | kubectl create secret generic laconic-registry --from-file=.dockerconfigjson=container-registry/my_password.json --type=kubernetes.io/dockerconfigjson 443 | ``` 444 | 445 | 7. Deploy the container registry. 446 | 447 | ``` 448 | laconic-so deployment --dir container-registry start 449 | ``` 450 | 451 | 6. Check the logs. 452 | 453 | ``` 454 | laconic-so deployment --dir container-registry logs 455 | ``` 456 | 457 | 7. Check status and await succesful deployment: 458 | 459 | ``` 460 | laconic-so deployment --dir container-registry status 461 | ``` 462 | 463 | 8. Confirm deployment by logging in: 464 | 465 | ``` 466 | docker login container-registry.pwa.laconic.com --username so-reg-user --password pXDwO5zLU7M88x3aA 467 | ``` 468 | 469 | All this htpasswd configuration will enable the deployer (below) to build and push images to this docker registry (which is hosted on your k8s cluster). 470 | 471 | ### Set ingress annotations 472 | 473 | 1. Replace `laconic-26cc70be8a3db3f4` with the `cluster-id` found in `container-registry/deployment.yml` then run the following commands: 474 | ``` 475 | kubectl annotate ingress laconic-26cc70be8a3db3f4-ingress nginx.ingress.kubernetes.io/proxy-body-size=0 476 | kubectl annotate ingress laconic-26cc70be8a3db3f4-ingress nginx.ingress.kubernetes.io/proxy-read-timeout=600 477 | kubectl annotate ingress laconic-26cc70be8a3db3f4-ingress nginx.ingress.kubernetes.io/proxy-send-timeout=600 478 | ``` 479 | 480 | Note: this will be handled automatically by stack orchestrator in [this issue](https://git.vdb.to/cerc-io/stack-orchestrator/issues/849). 481 | 482 | ## Connect to laconicd 483 | 484 | For the testnet, this next step will require using the onboarding app. Running a single node fixturenet will allow service providers to test their system e2e prior to the testnet. 485 | 486 | ### Deploy a single laconicd fixturenet and console 487 | 488 | Follow the instructions in [this document](https://git.vdb.to/cerc-io/fixturenet-laconicd-stack/src/branch/main/stack-orchestrator/stacks/fixturenet-laconicd/README.md) from the `daemon` host. 489 | 490 | See the [Perform operations](https://git.vdb.to/cerc-io/fixturenet-laconicd-stack/src/branch/main/stack-orchestrator/stacks/fixturenet-laconicd/README.md#perform-operations) section for instructions on how to collect the following: 491 | * Bond ID 492 | * Private key 493 | 494 | 495 | ### Set a name authority 496 | 497 | Follow [these steps](https://github.com/hyphacoop/loro-testnet/blob/main/docs/instructions.md#register-an-authority) to create an authority. 498 | * This authority needs to be added to the `package.json` of any application deployed under this namespace 499 | * This authority will be set as the variable `DEPLOYMENT_RECORD_NAMESPACE="my-org-name"` in the next section. 500 | 501 | ## Deploy backend 502 | 503 | This service listens for `ApplicationDeploymentRequest`'s in the Laconic Registry and automatically deploys an application to the k8s cluster. 504 | 505 | 1. Initialize a spec file for the deployer backend. 506 | 507 | ``` 508 | laconic-so --stack webapp-deployer-backend setup-repositories 509 | laconic-so --stack webapp-deployer-backend build-containers 510 | laconic-so --stack webapp-deployer-backend deploy init --output webapp-deployer.spec 511 | ``` 512 | 513 | 2. Modify the contents of `webapp-deployer.spec`: 514 | 515 | ``` 516 | stack: webapp-deployer-backend 517 | deploy-to: k8s 518 | kube-config: /root/.kube/config-default.yaml 519 | image-registry: container-registry.pwa.laconic.com/laconic-registry 520 | network: 521 | ports: 522 | server: 523 | - '9555' 524 | http-proxy: 525 | - host-name: webapp-deployer-api.pwa.laconic.com 526 | routes: 527 | - path: '/' 528 | proxy-to: server:9555 529 | volumes: 530 | srv: 531 | configmaps: 532 | config: ./data/config 533 | annotations: 534 | container.apparmor.security.beta.kubernetes.io/{name}: unconfined 535 | labels: 536 | container.kubeaudit.io/{name}.allow-disabled-apparmor: "podman" 537 | security: 538 | privileged: true 539 | 540 | resources: 541 | containers: 542 | reservations: 543 | cpus: 4 544 | memory: 8G 545 | limits: 546 | cpus: 6 547 | memory: 16G 548 | volumes: 549 | reservations: 550 | storage: 200G 551 | ``` 552 | 553 | 3. Create the deployment directory from the spec file. 554 | ``` 555 | laconic-so --stack webapp-deployer-backend deploy create --deployment-dir webapp-deployer --spec-file webapp-deployer.spec 556 | ``` 557 | 4. Modify the contents of `webapp-deployer/config.env`: 558 | 559 | ``` 560 | DEPLOYMENT_DNS_SUFFIX="pwa.laconic.com" 561 | 562 | # this should match the name authority reserved above 563 | DEPLOYMENT_RECORD_NAMESPACE="my-org-name" 564 | 565 | # url of the deployed docker image registry 566 | IMAGE_REGISTRY="container-registry.pwa.laconic.com" 567 | 568 | # credentials from the htpasswd section above 569 | IMAGE_REGISTRY_USER="so-reg-user" 570 | IMAGE_REGISTRY_CREDS="pXDwO5zLU7M88x3aA" 571 | 572 | # configs 573 | CLEAN_DEPLOYMENTS=false 574 | CLEAN_LOGS=false 575 | CLEAN_CONTAINERS=false 576 | SYSTEM_PRUNE=false 577 | WEBAPP_IMAGE_PRUNE=true 578 | CHECK_INTERVAL=5 579 | FQDN_POLICY="allow" 580 | ``` 581 | 582 | 5. Copy `~/.kube/config-default.yaml` from the k8s cluster creation step to `webapp-deployer/data/config/kube.yml` 583 | 6. Create `webapp-deployer/data/config/laconic.yml`, it should look like this: 584 | ``` 585 | services: 586 | registry: 587 | rpcEndpoint: 'https://lcn-daemon.laconic.com:26657' 588 | gqlEndpoint: 'https://lcn-daemon.laconic.com:9473/api' 589 | userKey: e64ae9d07b21c62081b3d6d48e78bf44275ffe0575f788ea7b36f71ea559724b 590 | bondId: ad9c977f4a641c2cf26ce37dcc9d9eb95325e9f317aee6c9f33388cdd8f2abb8 591 | chainId: lorotestnet-1 592 | gas: 995000 593 | fees: 500000alnt 594 | ``` 595 | Modify the endpoints, user key, and bond ID according to your configuration. 596 | 597 | 7. Push the image to the container registry. 598 | ``` 599 | laconic-so deployment --dir webapp-deployer push-images 600 | ``` 601 | 602 | 8. Start the deployer. 603 | ``` 604 | laconic-so deployment --dir webapp-deployer start 605 | ``` 606 | 607 | Publishing records to the Laconic Registry will trigger deployments in your backend now. 608 | 609 | ## Deploy frontend 610 | 611 | 1. Clone and build the deployer UI 612 | 613 | ``` 614 | git clone https://git.vdb.to/cerc-io/webapp-deployment-status-ui.git ~/cerc/webapp-deployment-status-ui 615 | laconic-so build-webapp --source-repo ~/cerc/webapp-deployment-status-ui 616 | ``` 617 | 618 | 2. Create a deployment 619 | 620 | ``` 621 | laconic-so deploy-webapp create --kube-config /root/.kube/config-default.yaml --image-registry container-registry.pwa.laconic.com --deployment-dir webapp-ui --image cerc/webapp-deployment-status-ui:local --url https://webapp-deployer-ui.pwa.laconic.com --env-file ~/cerc/webapp-deployment-status-ui/.env 622 | ``` 623 | 624 | 3. Push the image to the container registry. 625 | ``` 626 | laconic-so deployment --dir webapp-ui push-images 627 | ``` 628 | 629 | 4. Modify `webapp-ui/config.env` like [this Pull Request](https://git.vdb.to/cerc-io/webapp-deployment-status-ui/pulls/6) but with your host details. 630 | 631 | 5. Start the deployer UI 632 | ``` 633 | laconic-so deployment --dir webapp-ui start 634 | ``` 635 | 636 | 6. Wait a moment, then go to https://webapp-deployer-ui.pwa.laconic.com for the status and logs of each deployment. 637 | 638 | ## Deploy a test webapp 639 | 640 | 1. Fork this repo: https://github.com/LaconicNetwork/loro-testnet-example-pwa 641 | 2. Review this file: `.github/workflows/publish.yaml`. 642 | 3. Update `scripts/publish-app-record.sh` with relevant endpoints (or set the environment variables). 643 | 4. Update `package.json` fields: `"name": "@my-org-name/app-name` and `"repository": "url_to_your_fork_must_be_public"` 644 | 5. Add the envs referenced in `.github/workflows/publish.yaml`, i.e., for `privKey` and `bondId` as Secrets in GitHub Actions. 645 | 646 | Now, anytime a release is created, a new set of records will be published to the Laconic Registry, and eventually picked up by the `deployer`, which will target the k8s cluster that was setup. 647 | 648 | **Note:** to override the default webapp build process, put a file named `build-webapp.sh` in the root of the repo. 649 | 650 | ## Result 651 | 652 | We now have: 653 | 654 | - https://lcn-console.laconic.com displays registry records (webapp deployments) 655 | - https://container-registry.pwa.laconic.com hosts docker images used by webapp deployments 656 | - https://webapp-deployer-api.pwa.laconic.com listens for ApplicationDeploymentRequest and runs `laconic-so deploy-webapp-from-registry` behind the scenes 657 | - https://webapp-deployer-ui.pwa.laconic.com displays status and logs for webapps deployed via the Laconic Registry 658 | - https://app-name-45wjhbhef.pwa.laconic.com is the webapp deployed above 659 | 660 | --------------------------------------------------------------------------------