From fda6cdc063ef73eab8ff43b6c75e500fb4bdc4ba Mon Sep 17 00:00:00 2001 From: Anja Miscevic Date: Mon, 22 Jul 2024 15:43:09 +0200 Subject: [PATCH] feat: edit content --- docs/contribute/contribute.mdx | 78 +++++ docs/contribute/overview.mdx | 7 - docs/faq/faq.md | 111 +++--- docs/index.mdx | 9 +- docs/introduction/ai-factory.mdx | 8 +- docs/introduction/consume-resources-quiz.json | 66 ---- docs/introduction/overview.mdx | 22 -- docs/introduction/protocol-concepts.md | 2 - docs/introduction/resources-quiz.json | 98 ------ docs/introduction/resources.mdx | 46 +-- docs/introduction/rules-quiz.json | 66 ---- docs/introduction/rules.mdx | 169 +-------- docs/introduction/who-is-it-for.mdx | 2 - .../{consume-resources.mdx => workflows.mdx} | 17 +- .../decentralized-identity.mdx | 91 +++-- .../describe-resource.mdx | 270 +++++++-------- .../describe-zone.mdx | 173 +++++----- .../resource-governance.mdx | 321 ++++++++++-------- .../verifiable-claims.mdx | 40 ++- .../zone-governance.mdx | 297 ++++++++-------- docs/tutorials/_category_.json | 2 +- docs/tutorials/cli-1.mdx | 6 +- docs/tutorials/explorer-sc.md | 4 +- docs/tutorials/keplr-1.mdx | 47 +-- docs/tutorials/nonos-tuto-1.md | 11 - docs/tutorials/nonos-tuto-2.md | 11 - docs/tutorials/nonos-tuto-3.md | 11 - docs/tutorials/overview.md | 22 -- docs/tutorials/prolog-1.mdx | 5 +- docusaurus.config.js | 2 +- sidebars.js | 2 +- .../img/content/tutorials/overview-tutos.webp | Bin 70610 -> 0 bytes 32 files changed, 816 insertions(+), 1200 deletions(-) create mode 100644 docs/contribute/contribute.mdx delete mode 100644 docs/contribute/overview.mdx delete mode 100644 docs/introduction/consume-resources-quiz.json delete mode 100644 docs/introduction/overview.mdx delete mode 100644 docs/introduction/resources-quiz.json delete mode 100644 docs/introduction/rules-quiz.json rename docs/introduction/{consume-resources.mdx => workflows.mdx} (96%) delete mode 100644 docs/tutorials/nonos-tuto-1.md delete mode 100644 docs/tutorials/nonos-tuto-2.md delete mode 100644 docs/tutorials/nonos-tuto-3.md delete mode 100644 docs/tutorials/overview.md delete mode 100644 static/img/content/tutorials/overview-tutos.webp diff --git a/docs/contribute/contribute.mdx b/docs/contribute/contribute.mdx new file mode 100644 index 00000000000..c414ca2af63 --- /dev/null +++ b/docs/contribute/contribute.mdx @@ -0,0 +1,78 @@ +--- +sidebar_position: 1 +--- + +# Contribute + +## Everyone is welcome to join Axone community! + +To join the community and contribute, follow one of the links below: + +import IconGithub from '/img/socials/github.inline.svg' +import IconLinkedin from '/img/socials/linkedin.inline.svg' +import IconDiscord from '/img/socials/discord.inline.svg' +import IconMedium from '/img/socials/medium.inline.svg' +import IconTwitter from '/img/socials/twitter.inline.svg' +import IconTelegram from '/img/socials/telegram.inline.svg' +import IconOKP4 from '/img/socials/logo-okp4-round.svg' + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/docs/contribute/overview.mdx b/docs/contribute/overview.mdx deleted file mode 100644 index 98dff88705c..00000000000 --- a/docs/contribute/overview.mdx +++ /dev/null @@ -1,7 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Contribute - -links diff --git a/docs/faq/faq.md b/docs/faq/faq.md index 8f752d2ce9e..a650113ffdd 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -4,52 +4,23 @@ sidebar_position: 1 # Frequently Asked Questions -## Overview - -### Can you sum up Axone in a few sentences? - -Axone is the first settlement layer for off-chain workflows using shared resources. In other words, it is an open-source and public protocol that enables the sharing and orchestration of digital off-chain resources (datasets, algorithms, storage, computation resources…) while enforcing their associated governance rules. - -### How does Axone work in a few words? - -Axone is a custom blockchain facilitating digital resource sharing with auditability and adherence to consent rules. It establishes trust through decentralization, offers a flexible incentive system, and reduces digital ecosystem fragmentation by enabling 'Anything as a Service'. The protocol introduces Zones for resource orchestration and utilizes an on-chain ontology for standardized interpretation of diverse elements. With smart contracts and modules, it is the orchestrator of workflows running on shared resources for any applications. - -### What makes Axone a protocol? - -Axone serves as a set of rules and conventions that facilitate interoperability and coordination among diverse digital resources, systems, and entities. It allows for the establishment of rules, consents, and conditions for resource sharing, yet it doesn't focus on any specific use case. These are agnostic, trustless primitives that form the foundation for numerous other application and layer that can be built on top. Axone stands as the base settlement layer for off-chain workflows involving shared resources - -### What makes Axone so groundbreaking? - -Axone does not aim to be the next 'Ethereum Killer.' Instead, Axone plays a pivotal role in facilitating the transition to a new digital revolution, one centered around harnessing the power of data. In today's landscape, we recognize that trust and technical complexities often pose significant limitations. - -Axone is a meticulously designed protocol that fuels the expansion of this digital revolution by simplifying the sharing of data and digital resources. It places a profound emphasis on respecting consent and the proper utilization of everyone's assets, thereby fostering a more equitable and secure digital ecosystem - -### What problem is Axone solving? +## What problem is Axone solving? Today's datasets are stored in silos, their potential and value stay untapped. This situation exists because of a substantial lack of trust and incentives to share data. -Many companies' products and crypto projects tried to tackle these issues through a similar approach: data marketplaces. But this approach is highly limiting because 1. The exchanged data is accessible to the buyer, resulting in risks, and 2. Pricing mechanisms are disconnected from how data is used, resulting in poor incentives. +Many companies' products and crypto projects tried to tackle these issues through a similar approach: data marketplaces. But this approach is highly limiting because the exchanged data is accessible to the buyer, resulting in risks, and pricing mechanisms are disconnected from how data is used, which results in poor incentives. Today, there's no infrastructure, centralized or decentralized, to easily share any resource and agree on rules to enable these resources to interact with each other. -### What solution is Axone providing? +## What solution is Axone providing? -Axone is a Cosmos-based layer-1 for anyone to build applications based on shared data & services. Axone blockchain and no-code interfaces allows individuals and companies to build and join ecosystems where they can (1) share anything (datasets, algorithms, software, computation...) (2) define any rules (business models, workflow management...) and (3) build applications on top of everything shared in the ecosystem. Axone aims to become the IBC-connected hub to value any existing web2 system. +Axone is a Cosmos-based layer-1 for anyone to build applications based on shared data & services. Axone blockchain and no-code interfaces allows individuals and companies to build and join ecosystems where they can share anything (datasets, algorithms, software, computation...), define any rules (business models, workflow management...), and build applications on top of everything shared in the ecosystem. Axone aims to become the IBC-connected hub to value any existing web2 system. -### What is trust-minimized data sharing? +## What is trust-minimized data sharing? It is the ability to let data contribute to valuable knowledge and applications without ever exposing the data itself to other participants. Through a trustless network and privacy-preserving techniques, other parties never access the raw data that has been shared. End-users will access only the output (the indicator, the graph, the application...), not the data itself. Enabling value creation, value sharing, without the risks associated to exposing data. -### What is the market for Axone? What is Axone's ambition in this market? - -Data intermediaries will be key players in the trillion-dollar data economy of tomorrow. Decentralized data intermediaries will dominate centralized alternatives because of reduced trust assumptions, and better composability and incentives. -PwC estimates that global GDP will increase by up to 14% (the equivalent of US$15.7 trillion) by 2030 due to the accelerating development and take-up of data-powered AI. More specifically, we develop an alternative (and complementary) model to data marketplaces, which is a 1 billion market in 2022. "We" (more specifically, our community-owned digital commons) aim to claim at least 5% of this market in the next five years and expand many new opportunities enabled by trust-minimized data sharing. - -Axone's goal is to be the leading decentralized data intermediary by enabling a new wave of innovation & use cases through unique coordination features. - -## General Questions - -### What is a Zone? +## What is a Zone? A Zone is a conceptual framework defined by a set of rules, within which the recognized digital resources are compatible with these rules, considering the associated consents. Thus, the recognition of resources within a Zone relies on the dynamic evaluation of the conformity of the rules and consents of the resources. @@ -57,7 +28,7 @@ The primary objective of Zones is to facilitate the coordination of heterogeneou More information [here](https://docs.okp4.network/whitepaper/solution#protocol-overview) -### What types of resources can be shared? +## What types of resources can be shared? As an agnostic infrastructure, Axone has no limitations on the types of resources it can be referenced, it opens doors to a wide range of possibilities. @@ -70,7 +41,7 @@ For clarity, we categorize resources and services into different types: For more in-depth information, you can refer to our dedicated documentation [here](https://docs.okp4.network/whitepaper/solution#the-dataverse). -### Why do you distinguish Zones and digital resources? +## Why do you distinguish Zones and digital resources? The distinction between Zones and resources is crucial to enable the flexibility and adaptability of the Axone ecosystem. Zones are conceptual frameworks defined by a set of rules. They determine the parameters and boundaries that define the territory of a given Zone. Zone rules can be either open, allowing broad interaction, or restrictive, limiting access and resource usage. By evaluating the compatibility of resources with Zone rules, the scope and coverage of that Zone are defined. Multiple Zones can share common resources and nest within each other based on the rules associated with each resource and Zone. @@ -79,16 +50,16 @@ The absence of a direct link between Zones and resources allows for significant In summary, the distinction between Zones and resources enables the Axone ecosystem to be dynamic, scalable, and capable of accommodating a variety of rules and conditions for each Zone, thereby fostering value creation and free interaction among participants and digital resources. -### What is the Dataverse? +## What is the Dataverse? The Dataverse is an ever-expanding universe comprised of all the digital resources, such as datasets, and digital services such as infrastructure services, processing services or any other digital service referenced in the Axone Blockchain. All resources, services and Zones are found within the same universe, the Dataverse. The on-chain Ontology is the semantic representation of the Dataverse. -### How does Axone store the resources and services? +## How does Axone store the resources and services? As a protocol, Axone doesn't store them. It only references the resource/services where it is (wherever it is) and make it available to the network according to the permissions granted by the provider. It can be stored anywhere, with any kind of storage solution, either centralized or decentralized. -### How does the referencing process work in Axone? +## How does the referencing process work in Axone? Provider's Consent Rules: The provider defines the consent rules associated with the resource they wish to share. These rules could specify who can access and use the resource and under what conditions. @@ -98,9 +69,9 @@ Metadata On-Chain: Importantly, the actual resource data itself is not stored on Resource Utilization: When a digital resource is referenced within the Axone protocol, consumers can leverage this resource if their request aligns with the consent rules enforced on-chain. This mechanism ensures that resource usage complies with the agreed-upon conditions set by the provider. -### Euh Wait… What is an ontology? +## What is an ontology? -Don't worry, an ontology, in the context of Axone, refers to a structured representation of knowledge that defines the relationships between various terms or concepts. It's like a map that helps us understand how different referenced resources (datasets, algorithms, services…) are related to each other. +An ontology, in the context of Axone, refers to a structured representation of knowledge that defines the relationships between various terms or concepts. It's like a map that helps us understand how different referenced resources (datasets, algorithms, services…) are related to each other. In Axone, this ontology is used to describe the metadata or characteristics of resources and services. Think of it as the "data about the data." This structured information makes it easier for users and systems to understand and interact with resources and services within the Axone network. It ensures that everyone speaks the same language when it comes to sharing and accessing digital resources. @@ -108,15 +79,15 @@ Dedicated documentation [here](https://docs.okp4.network/whitepaper/solution#ont And deep-dive article [here](https://blog.okp4.network/okp4-knowledge-sharing-through-ontology-driven-dataverse-a-new-approach-to-knowledge-description-f9b81d4484c8) -### Who can share and consume these resources? +## Who can share and consume these resources? Anyone can share resources and define associated consent rules. As an open and public protocol, everyone has access to the resources referenced in the protocol and can use them, according to the access rights and conditions defined in the rules of the concerned Zone and resources. -### Is Axone private by design? +## Is Axone private by design? No, Axone is agnostic by design. It provides the flexibility for privacy-focused applications to be built on top of it. This means that privacy-enhancing features and services can be implemented within Axone, allowing developers to tailor privacy settings to their specific needs and use cases. It's a versatile foundation that can support a wide range of applications, whether they prioritize privacy or other aspects of data sharing and orchestration. -### Axone + AI? +## Axone + AI? Axone does indeed have a unique relationship with the field of Artificial Intelligence. Axone's purpose is to provide an on-chain governance layer for off-chain digital resources. AI models are undoubtedly promising digital services and providing a "law framework" or a "framework for intervention" for AI models appears to be an inevitable step in their progress. @@ -124,11 +95,11 @@ Furthermore, to enhance their capabilities, AI models require data and computati Imagine an AI trained, owned and governed by a DAO with governance rules, like data requirements and contribution quantification mechanisms, inscribed on-chain. -### What is the web2 alternative today? +## What is the web2 alternative today? The alternative to such a protocol is a set of trusted technical, legal, and financial intermediaries. That's what we've seen being built in various use cases over the last few years, and it's also very complex and creates a lot of friction. -### Who are Axone web3 competitors? +## Who are Axone web3 competitors? Axone doesn't have direct competitors for several reasons, but let's focus on the most significant one to keep in mind: no one else is currently focused on building a decentralized governance layer for off-chain resources. Axone enables the orchestration of digital resources through their associated governance rules and consents. @@ -139,7 +110,7 @@ As a governance layer for off-chain resources, Axone introduces a strong logical If you want to delve into the Governance aspect, this series of 3 articles is a must-read [Part 1](https://blog.okp4.network/beyond-traditional-governance-embracing-on-chain-with-okp4-1-3-bb925ea4e1b2) – [Part 2](https://blog.okp4.network/beyond-traditional-governance-embracing-on-chain-with-okp4-2-3-17237d68033c) – [Part 3](https://blog.okp4.network/beyond-traditional-governance-embracing-on-chain-with-okp4-3-3-424f7a8eb2fc) -### I'm still struggling to understand what makes Axone different. How is it different from Ocean Protocol, for example? +## I'm still struggling to understand what makes Axone different. How is it different from Ocean Protocol, for example? Ocean Protocol enables decentralized data exchange and monetization solutions through a marketplace. It's a great solution if you want to sell datasets. @@ -147,7 +118,7 @@ Axone enables custom governance for complex workflows and applications powered b While Ocean Protocol focuses on tokenizing datasets, we're focused on building the right infrastructure and tools to enforce customized rules/permissions on any data or service. It goes way beyond what Ocean does as it has new primitives to build anything on top. Axone will leverage data from Ocean Protocol but will not be limited to that at all. -### Is Axone limited to web2 B2B applications? +## Is Axone limited to web2 B2B applications? Not at all! The protocol we've developed introduces innovative primitives suitable for a wide range of applications. Initially, we targeted B2B ones. While these have notable usage volume, they're not seamless and pose bootstrapping challenges. @@ -157,9 +128,7 @@ These templates detail rules for data, algorithms, and infrastructure contributi The ultimate outcome is a collectively trained, owned, and governed AI, fueled by a network of incentivized contributors. At its core, Axone is more than a tool for businesses. It's a protocol for collective innovation and coordination, inviting individuals from all backgrounds to contribute and add value. -## Architecture - -### Why does Axone need a blockchain infrastructure to do that? +## Why does Axone need a blockchain infrastructure to do that? As a decentralized orchestrator of digital resources, Axone needs a blockchain infrastructure for essential reasons: @@ -169,7 +138,7 @@ As a decentralized orchestrator of digital resources, Axone needs a blockchain i As the basis of the architecture, the blockchain act as a source of truth in the protocol. -### Why did you create Axone as a new blockchain instead of using an existing one? +## Why did you create Axone as a new blockchain instead of using an existing one? We established Axone as a new blockchain for several strategic reasons: @@ -187,7 +156,7 @@ Decentralization Over L2s: Unlike Layer 2 solutions, where components might be c Innovative Features: With our own blockchain, we can implement features that are unattainable on existing networks. This includes innovations like mempool encryption, native oracles, and validator-secured bridges, further differentiating us from other solutions. -### Why choose Cosmos as an underlying technology? +## Why choose Cosmos as an underlying technology? Choosing Cosmos as the underlying technology aligns with our core values of interoperability and sovereignty. Cosmos provides the stack for Axone to serve as both an orchestration layer for off-chain resources and a governance layer for off-chain resources. @@ -199,13 +168,13 @@ In summary, Axone shares and works on the same vision than Cosmos. - Sovereignty - Specific Design and Modularity -### Why would someone want to build an application on Axone when there are many other blockchains available? +## Why would someone want to build an application on Axone when there are many other blockchains available? We don't claim that Axone can be a one-size-fits-all solution for every use case. Our primary objective is to create an infrastructure that facilitates the sharing of digital resources. Axone's architecture is optimized for this purpose and doesn't compete for block space with other types of applications. In essence, Axone is designed for its specialization in resource sharing and its ability to provide a dedicated governance layer for such applications without the need to contend with other blockchain use cases as DeFi Apps or NFT Apps. -### There's many ongoing disputes and risks surrounding Cosmos, is it a risk for OKP4? +## There's many ongoing disputes and risks surrounding Cosmos, is it a risk for OKP4? As we mentioned previously, the number one reason to build a Cosmos chain is sovereignty, more precisely, interoperable sovereignty. @@ -218,15 +187,15 @@ We definitely think this trend will accelerate as interoperability becomes seaml ## Smart contracts and modules -### What is the Objectarium smart contract in a few words? +## What is the Objectarium smart contract in a few words? The Objectarium smart contract enables the storage of arbitrary unstructured Objects in any Cosmos blockchain. It provides a flexible solution for storing data without imposing strict schemas or predefined structures, accommodating various data formats and types. -### What is the Cognitarium smart contract in a few words? +## What is the Cognitarium smart contract in a few words? The Cognitarium smart contract facilitates the storage and querying of semantic data using RDF (Resource Description Framework), which represents information as semantic triples. In essence, it serves as a repository for knowledge, providing a dedicated space for storing and retrieving semantic information within any Cosmos blockchains. -### What is the Law-Stone smart contract in a few words? +## What is the Law-Stone smart contract in a few words? The Law-Stone is a highly versatile smart contract designed to apply and enforce legislative rules, including Zone rules, Consents, and Agreements. It offers extraordinary adaptability and can be utilized in any blockchain within the Cosmos ecosystem that seeks to establish robust and flexible on-chain governance systems. With its exceptional proficiency in evaluating logical rules, Law-Stone can be applied across various use cases. @@ -236,19 +205,19 @@ The side of the "Law": Indeed, the smart contract interprets the law, i.e. makes The side of the "Stone": The instantiation of the smart contract engraves in stone the rules to be interpreted, and these are immutable, irrevocable, and indisputable unless the stone is broken. -### What is the Pactum smart contract in a few words? +## What is the Pactum smart contract in a few words? The Pactum smart contract is designed to streamline and automate the execution of agreements involving multiple parties. In contrast to the Law-Stone, which primarily focuses on expressing or stating the law, the Pactum's core function is to actively execute the law by the predefined terms outlined in the agreement. By leveraging the power of Prolog provided by the Law-Stone smart contract, the Pactum facilitates the seamless implementation of agreed-upon terms and ensures the proper enforcement of contractual obligations. This smart contract is essential in the governance framework implemented in the Axone protocol, particularly in regulating the orchestration of digital resources, which involves many parties. -### What is the Logic Module in a few words? +## What is the Logic Module in a few words? The Logic module is designed to primarily address logical queries based on facts sourced from the ontology or the state of the chain, along with inference rules. Its main use in the protocol is the management of governance rules, written in Prolog. Thus, any smart contract deployed on the Axone blockchain can use the logic module to evaluate queries written in Prolog. Prolog is a powerful declarative programming language to manage from simple restrictions to complex rules. This language is not natively operable on-chain; the logic module adds Prolog interpretation capability. The Logic module is not strongly coupled to the Axone blockchain. It's designed to be reusable and can be integrated with any Cosmos appchain. Because it's open and interoperable, the support of Prolog programs is a significant gain for the Cosmos ecosystem. Using this open-source Logic module implementation, any appchain can quickly adopt complex Prolog governance rules. ## Token -### What is the utility of the $AXONE token? +## What is the utility of the $AXONE token? The $AXONE is the fee token of the Axone blockchain, it is required to submit transactions to the network of validators. @@ -264,11 +233,11 @@ The $AXONE token may also be used for security purposes, requiring data or servi More details about Token Model [here](https://docs.okp4.network/whitepaper/token-model) -### Can price volatility of the $AXONE token be a problem? +## Can price volatility of the $AXONE token be a problem? -The $AXONE price volatility can become a problem when it's used for payment. Imagine a dataset or service providers denominates its price in KNOW. If the $AXONE values goes +50%, then it goes the same of providers who may see their resources less used because 50% more expensive. An external service can be used to define another unit of account (like the dollar) and have the $AXONE value updated every time their resource is consumed. +The AXONE price volatility can become a problem when it's used for payment. Imagine a dataset or service providers denominates its price in KNOW. If the AXONE values goes +50%, then it goes the same of providers who may see their resources less used because 50% more expensive. An external service can be used to define another unit of account (like the dollar) and have the $AXONE value updated every time their resource is consumed. -### Decentralization seems to add complexity. Does that get offset but the open composability? +## Decentralization seems to add complexity. Does that get offset but the open composability? It's important to state that we're building a protocol: trustless and general primitives that form a foundation for many more layers that can be built on top. Axone is the first settlement layer for off-chain workflows using shared resources. Decentralization introduces complexity but provides many benefits. @@ -285,7 +254,7 @@ Axone is a sandbox for human coordination experiments in the off-chain world. Yo ## Utilization -### Can you describe how the data transfer works? +## Can you describe how the data transfer works? First, let me remind that the data is off-chain, only the data's metadata (its description) is on-chain and integrated in the ontology. @@ -298,17 +267,17 @@ Data transfer is a crucial part of this workflow. Depending on the rules and ser To sum it up, from the moment a consumer places a request to the final reporting by the orchestration service, the entire process is seamlessly automated. -### Are the datasets necessarily transferred to the consumer? +## Are the datasets necessarily transferred to the consumer? Not necessarily, there are several ways to process data without transferring it to the end consumer, or even to third-party service providers: Trusted Execution Environments (TEE), Multi-Party Computation (MPC), Edge computing, and more. Implementations of these technologies are digital services that can be used within workflows. Once again, it's up to the provider to choose the consent rules related to the resources they want to share and especially how they can be processed. -### Axone is the set of instructions that could be used for data pipelines. How can I build a Data Platform with Axone? +## Axone is the set of instructions that could be used for data pipelines. How can I build a Data Platform with Axone? The answer depends on the Design Pattern you opt for: batching, micro batching, streaming, hybrid, or any other. Depending on the most suitable choice for the datasets you intend to collect and process, you'll need to pick specific tools. For instance, within the Apache series, options such as AIRFLOW, SPARK, STORM, KAFKA, FLINK, or even other open-source or proprietary solutions could come into play. Both the team and community will reference implementations of these tools alongside the necessary connectors for communication. This will facilitate the seamless construction of your own process by interconnecting services that best align with your use case. -### Can you illustrate it? +## Can you illustrate it? For example, when you want to extract data from nodes for analytical purposes, a batching collection approach every 6-12 hours might be ideal, followed by data processing and storage in a Data Warehouse solution. Conversely, when extracting data from nodes for monitoring purposes, a streaming or micro batching process might be more suitable, with the data being stored in a Data Lake solution. @@ -318,13 +287,13 @@ Axone functions as a decentralized coordinator where: - The workflow can be initiated in accordance with the consent rules of each resource. - The workflow is recorded on-chain and is subject to thorough auditing. -### How does Axone ensure the execution and validation of sharing rules? +## How does Axone ensure the execution and validation of sharing rules? The protocol itself is primarily an infrastructure that allows a resource "provider" to reference and define usage rules (in Prolog, which offers better expressiveness compared to other languages), and for a "consumer" to make usage requests based on these rules. What the protocol guarantees is the transparency of the rules and the correct assessment (validation or not) of these rules. However, there is indeed the question of verifying the actual "real" sharing action. The current approach is an open-source off chain "orchestrator" developed by the Axone Association team that provides access to resources (based on requests validated onchain) and then reports the successful execution back on chain. So, yes, there's an element of centralization! We aim to have multiple orchestrators, deployed by external entities, and even decentralize that process at some point. Both "providers" and "consumers" will be able to choose the one they "trust" or deploy their own. More info [here](https://docs.okp4.network/whitepaper/architecture#trusted-parties-considerations) -### How Axone ensures law enforcement BEFORE EXECUTION? +## How Axone ensures law enforcement BEFORE EXECUTION? 1. An Identity (human or bot) wants to interact with a Zone 2. The Zone asks to the dedicated smart contract if its possible given the context and all the involved rules diff --git a/docs/index.mdx b/docs/index.mdx index 74d58bec47f..be668375eba 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -9,18 +9,13 @@ hide_table_of_contents: true Axone is a public [dPoS](https://en.bitcoinwiki.org/wiki/DPoS) layer 1 specifically designed for connecting, sharing, and monetizing any resources in the AI stack. It is an open network dedicated to collaborative AI workflow management that is universally compatible with any data, model, or infrastructure. -Data, algorithms, storage, compute, APIs… Anything on-chain and off-chain can be shared. -## The protocol +Axone is built on the [Cosmos SDK](https://v1.cosmos.network/sdk) & [CometBFT](https://cometbft.com) consensus, and allows companies & individuals to define on-chain rules, share any off-chain resources & create a new generation of applications on top of them. With Axone, share anything digital, on your own terms. In a nutshell, Axone is: -Axone is built on the [Cosmos SDK](https://v1.cosmos.network/sdk) & [CometBFT](https://cometbft.com) consensus, and allows companies & individuals to define on-chain rules, share any off-chain resources & create a new generation of applications on top of them. With Axone, share anything digital, on your own terms. - -- solves the trust issue related to digital resource sharing
+- a solution for the trust issue related to digital resource sharing
- sovereign, scalable, multichain & fully customizable (built on Cosmos, leveraging IBC, ICQ & ICA)
- unlocking real-world value creation, bridging the gap between web2 & web3.
-After 4+ years of strategy, research and development, Axone is almost ready to become the foundation for a scalable Open Dataverse, unlocking a new wave of use cases through real-world decentralized coordination. Our team & community is building a set of tools at the infrastructure, protocol, data and application layers with UX, interoperability, privacy and security in mind, ready to ignite innovation through data sharing. -
diff --git a/docs/introduction/ai-factory.mdx b/docs/introduction/ai-factory.mdx index 6597ff162d7..12b12287bf3 100644 --- a/docs/introduction/ai-factory.mdx +++ b/docs/introduction/ai-factory.mdx @@ -7,13 +7,7 @@ import * as quiz from './ai-factory-quiz.json' # AI Factory: A Use Case Unveiling -Reading time: {readingTime} min - -In the previous section, we highlighted the target audience of the protocol using concise examples. To delve deeper into the power of this protocol, this section will examine the underlying motivations for its creation through more detailed and concrete case studies. - -## Context - -The rapid development of AI models redefines the boundaries of what is possible in many fields. Increasingly, the ability to use existing open-source models or create one's own AI models to meet specific needs is becoming accessible to everyone. +The rapid development of AI models redefines the boundaries of what is possible in many fields. The ability to use existing open-source models or create one's own AI models to meet specific needs is becoming accessible to everyone. The swift adoption by users of applications such as ChatGPT has catalyzed innovations in fundamental model architectures and other techniques. Today, many small and medium-sized technology companies, individuals, and researchers are working on new ML models or improving existing ones. diff --git a/docs/introduction/consume-resources-quiz.json b/docs/introduction/consume-resources-quiz.json deleted file mode 100644 index 41ba32db9f5..00000000000 --- a/docs/introduction/consume-resources-quiz.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "quizTitle": "Test your knowledge!", - "nrOfQuestions": "4", - "questions": [ - { - "question": "What does a workflow represent in the context of the Axone protocol?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "A sequence of financial transactions on the blockchain.", - "A series of processes involving digital resources and digital resource processing services.", - "A set of governance rules for resource management.", - "A communication protocol between different nodes on the blockchain." - ], - "correctAnswer": "2", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "How are workflows structured in Axone?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "As a linear sequence of activities with no interdependencies.", - "As a Directed Acyclic Graph (DAG) without circular references or loops.", - "By following a proof-of-work consensus model.", - "By a random set of uncoordinated activities." - ], - "correctAnswer": "2", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "What is the first step in the life of a workflow in Axone?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "The execution of digital resources.", - "Payment of tokens to resource providers.", - "Workflow validation by validators.", - "Submission of a transaction describing the desired workflow." - ], - "correctAnswer": "4", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "How is off-chain orchestration implemented in Axone?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "By using the blockchain to coordinate resources directly.", - "Through a centralized authority that manages execution logic.", - "Through a dedicated off-chain Orchestration Service.", - "Through an automatic distributed consensus mechanism." - ], - "correctAnswer": "3", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - } - ] -} diff --git a/docs/introduction/overview.mdx b/docs/introduction/overview.mdx deleted file mode 100644 index 86e5e71ea4e..00000000000 --- a/docs/introduction/overview.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Axone Basics - -Axone is designed to bring the tools for builders and communities to solve trust and incentive issues and unlock value through applications based on shared datasets and algorithms. - -Axone is a public blockchain built to share and orchestrate any off-chain resource. Its architecture is specifically designed to: - -- Share any off-chain resource (datasets, algorithms, services...). -- Define and enforce highly customized rules on-chain (access rights, business models, governance models...). -- Build applications leveraging the shared resources according to the on-chain rules. - -:::tip -Before delving into the academy modules, we strongly recommend familiarizing yourself with essential sections of the Axone Whitepaper: - -1. The [Abstract](/whitepaper/abstract): Gain a broad overview of the Axone protocol to understand its fundamental principles. -2. The [Introduction](/whitepaper/introduction): Explore the challenges within the knowledge economy that Axone addresses. -3. The [Solution](/whitepaper/solution): Discover the high-level concepts and key features underlying the Axone protocol. - -::: diff --git a/docs/introduction/protocol-concepts.md b/docs/introduction/protocol-concepts.md index cca86c113c1..ce27047a755 100644 --- a/docs/introduction/protocol-concepts.md +++ b/docs/introduction/protocol-concepts.md @@ -4,8 +4,6 @@ sidebar_position: 7 # Protocol concepts -Reading time: {readingTime} min - This section will provide an in-depth analysis of the core principles that form the protocol's foundation and how it presents an innovative solution to sharing digital resources by leveraging these principles. It's important to note that these concepts are often intertwined and mutually reliant to ensure the equilibrium of the protocol. We will also begin to address some essential technical components, such as smart contracts. We will delve deeper into these aspects in the second part of the academy. diff --git a/docs/introduction/resources-quiz.json b/docs/introduction/resources-quiz.json deleted file mode 100644 index 55722377eb4..00000000000 --- a/docs/introduction/resources-quiz.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "quizTitle": "Test your knowledge!", - "nrOfQuestions": "6", - "questions": [ - { - "question": "How are Bounded digital resources classified in terms of size?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "They have infinite size.", - "They have a defined size and temporal limits.", - "They are limitless.", - "They are classified as structured and unstructured resources." - ], - "correctAnswer": "2", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "What is the main difference between Infrastructure Services and Digital Resource Processing Services ?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "Infrastructure Services focus on managing complex processes, while Digital Resource Processing Services provide fundamental support for efficient resource sharing.", - "Infrastructure Services are responsible for resource identification, while Digital Resource Processing Services ensure the sovereignty of digital resources.", - "Infrastructure Services provide a foundation for efficient resource sharing, while Digital Resource Processing Services manage complex processes related to the transformation of digital resources.", - "Infrastructure Services specialize in resource storage, while Digital Resource Processing Services facilitate communication between network entities." - ], - "correctAnswer": "3", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "What do Verifiable Credentials (VCs) bring to the Axone ?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "A method for storing resources directly on the blockchain.", - "A way to ensure the sovereignty of digital resources.", - "A mechanism for identifying resources without centralized control.", - "A means to describe specific properties of a resource securely and in a verifiable manner" - - ], - "correctAnswer": "4", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "What is the fundamental difference between Verifiable Claims (VCs) and Verifiable Presentations (VPs)?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "VCs and VPs are interchangeable terms in the Axone protocol.", - "VPs are used to store data about resources, while VCs are used to store data about services.", - "VCs are verifiable claims about a set of resources, while VPs are assertions that define off-chain governance rules in Axone, facilitating decision-making within the network.", - "VCs are verifiable assertions about a resource, while VPs are a selection of VCs with a verifiable chain, serving as a basis for decision-making in on-chain governance." - ], - "correctAnswer": "4", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "How does Ontology contribute to solving challenges related to the diversity of digital resources in the Axone protocol?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "By providing a structured representation of knowledge, clarifying relationships and the context of resources.", - "By encouraging the proliferation of protocols rather than seeking standardization.", - "By categorizing resources rigidly to facilitate understanding.", - "Ontology has no impact on the diversity of digital resources." - ], - "correctAnswer": "1", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "How do Verifiable Claims and Ontology interact in the Axone protocol?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "Verifiable Claims and Ontology synergize by sharing cryptographic keys, enhancing the security of digital resources within the Axone.", - "They are not linked and operate independently.", - "Ontology serves as a substitute for Verifiable Claims, offering comprehensive details about digital resources without the need for additional information from Verifiable Claims.", - "Verifiable Claims provide detailed information, while ontology clarifies relationships and the context of resources." - ], - "correctAnswer": "4", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - } - ] - } - \ No newline at end of file diff --git a/docs/introduction/resources.mdx b/docs/introduction/resources.mdx index dd724bfade1..f4bcd24d44c 100644 --- a/docs/introduction/resources.mdx +++ b/docs/introduction/resources.mdx @@ -1,31 +1,19 @@ --- -sidebar_position: 3 +sidebar_position: 1 --- -import Quiz from 'react-quiz-component' -import * as quiz from './resources-quiz.json' - # Resources: what can be shared -Reading time: {readingTime} min - -Diving into the realm of off-chain resource sharing with Axone, it's crucial to understand the diverse landscape of digital resources that can be seamlessly shared. Digital resources, the building blocks for extracting insights and generating new knowledge, come in various forms and formats. -There are two types of resources: - -- Digital Resource -- Digital Service - -## Digital Resource +Digital resources, the building blocks for extracting insights and generating new knowledge, come in various forms and formats. +There are two types of resources: Digital Resources and Digital Services. -Digital Resources are the raw material from which insights and new knowledge are extracted. They encompass data and information presented in various forms (spreadsheets, text, videos, etc.) and expressed, carried, and stored in any format (.xml, .json, .txt, .mp4, etc.). -These Digital Resources can be categorized into two subtypes: +## Digital Resources -- Bounded digital resources -- Unbounded digital resources +Digital Resources are the raw material from which insights and new knowledge are extracted. They include data in various forms (spreadsheets, text, videos) and formats (.xml, .json, .txt, .mp4). These Digital Resources can be categorized into two subtypes: -**Bounded digital resources** have a finite size and defined boundaries regarding time. They are often accessed and analyzed as complete entities, commonly referred to as datasets. These datasets are further classified into structured data, such as databases or spreadsheets, and unstructured data, including text documents, images, videos, and more. +- **Bounded digital resources** have a limited size and defined boundaries regarding time. They are often accessed and analyzed as complete entities, commonly referred to as datasets. These datasets are further classified into structured data, such as databases or spreadsheets, and unstructured data, including text documents, images, videos, and more. -In contrast to their bounded counterparts, **unbounded digital resources** have no boundaries defined in terms of time. This data may have originated in the past, persisted into the present, and is expected to continue arriving in the future. This absence of predefined boundaries implies that unbounded resources do not have a set size and are characterized by their continuous and potentially infinite nature. Examples of unbounded resources include streaming and real-time data: sensor data from IoT devices, social media feeds, or stock market tickers. +- **Unbounded digital resources** have no boundaries defined in terms of time. This data may have originated in the past, persisted into the present, and is expected to continue arriving in the future. This absence of predefined boundaries implies that unbounded resources do not have a set size and are characterized by their continuous and potentially infinite nature. Examples of unbounded resources include streaming and real-time data: sensor data from IoT devices, social media feeds, or stock market tickers. ![resources-1](/img/content/academy/resources-1.webp) @@ -53,17 +41,11 @@ Any algorithms and models can be considered as dedicated solutions to unique nee ![resources-2](/img/content/academy/resources-2.webp) -## Verifiable Claims: how it's referenced in the protocol +## Verifiable Claims -Understanding the intricate workings of the Axone protocol is essential, particularly concerning handling digital resources. Unlike traditional storage mechanisms, the Axone blockchain doesn't store these resources directly. Instead, providers maintain sovereignty over resource ownership. +In the Axone protocol, resources are uniquely identified by **Decentralized Identifiers** (DIDs), allowing for decentralized and verifiable identity management. **Verifiable Credentials** (VCs) provide detailed and secure information about each resource, enhancing reliability and transparency both off-chain and on-chain. -In the context of the Axone protocol, each resource is uniquely identified by **Decentralized Identifiers** (DIDs). DIDs are a key component in the decentralized identity ecosystem, providing a mechanism for establishing and verifying the identity of a resource without centralized control. This identification system ensures that each resource is distinct, easily identifiable and easily traceable. - -For adequate resource accessibility and description (context, precision about the data, and even technical information about the dataset structure for instance), the protocol relies on [Verifiable Credentials (VCs)](https://www.w3.org/TR/vc-data-model/). Firstly, VCs allow for the assertion of specific properties about a resource. Each resource can carry verifiable information detailing its characteristics and other relevant attributes. Secondly, because VCs are inherently designed to be tamper-evident and cryptographically secure, they enhance the reliability and transparency of the information they convey, ensuring integrity and clarity in both off-chain and on-chain contexts. - -**Example**: A Data provider shares a dataset. In the Axone Protocol, this dataset is uniquely identified by the DID `d0c63b88-44f8-4518-b62d-e141dd8fb624`. - -Here are some verifiable claims the provider can link to his dataset: +**Example**: A Data provider shares a dataset. In the Axone Protocol, this dataset is uniquely identified by the DID `d0c63b88-44f8-4518-b62d-e141dd8fb624`. Verifiable claims linked to this dataset can include: ```text Title: MyDataset @@ -73,9 +55,9 @@ Geographical Coverage: Europe Served by: (DID of the server where the dataset is stored off-chain) ``` -This approach results in a more reliable and robust system, where the data about resources (also called metadata), backed by the claims from Verifiable Credentials, can be shared and used confidently. These claims, being trusted sources of information, are instrumental for decision-making in established on-chain Governance rules. +This approach results in a more reliable and robust system, where the data about resources (also called metadata), backed by the claims from Verifiable Credentials, can be shared and used confidently. -Some Verifiable Claims are stored Off-chain, but critical data is introduced to the blockchain as **Verifiable Presentations** (VPs). VPs, often a selected subset of VCs with a verifiable chain, serve as the medium for conveying knowledge to the blockchain and are a resource for on-chain governance decisions. They provide a reliable basis for the formulation and execution of governance rules, ensuring that decisions are made based on verified and accurate information. +Some VCs are stored off-chain, but critical data is introduced to the blockchain as **Verifiable Presentations** (VPs). VPs, often a selected subset of VCs with a verifiable chain, serve as the medium for conveying knowledge to the blockchain and are a resource for on-chain governance decisions. They provide a reliable basis for the formulation and execution of governance rules, ensuring that decisions are made based on verified and accurate information. ## Ontology: how it's represented, semantic description @@ -109,10 +91,8 @@ In practical terms, the semantic description facilitated by ontology within the Ontology forms a cornerstone in the Axone protocol, elevating the representation and semantic description of digital resources. Its integration with metadata and commitment to standardization positions Axone as a forward-looking protocol in the dynamic landscape of data sharing among professionals. -## SUM UP +## Sum Up This illustration provides an overview of the classification of digital resources and services within the protocol. ![resources-3](/img/content/academy/resources-3.webp) - - diff --git a/docs/introduction/rules-quiz.json b/docs/introduction/rules-quiz.json deleted file mode 100644 index 5e7ae40dff0..00000000000 --- a/docs/introduction/rules-quiz.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "quizTitle": "Test your knowledge!", - "nrOfQuestions": "4", - "questions": [ - { - "question": "Which of the following best describes the role of Prolog in the Axone protocol?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "Prolog is primarily used for front-end development within the Axone ecosystem, focusing on user interface design and experience.", - "Prolog serves as a database management system in Axone, handling the storage, retrieval, and update of data within the protocol.", - "Prolog is employed as an on-chain module within Axone, interpreting rules related to governance and consent, and ensuring secure and reliable decentralized decision-making.", - "Prolog functions as a cryptocurrency wallet in the Axone protocol, managing digital assets and facilitating transactions between users." - ], - "correctAnswer": "3", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "How does the Axone protocol handle the dynamic nature of resource management?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "By enforcing static rules.", - "Through Dynamic Rule Updates in real-time.", - "By allowing only manual updates to rules.", - "By relying on a centralized system for adaptation." - ], - "correctAnswer": "2", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "What is the role of hierarchy of norms in Axone resource consents?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "It establishes the order of precedence among different norms.", - "It increases transparency.", - "It eliminates conflicts.", - "It enforces static rules." - ], - "correctAnswer": "1", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - }, - { - "question": "In Prolog, what is the declarative style?", - "questionType": "text", - "answerSelectionType": "single", - "answers": [ - "Specifying how to achieve a task", - "Describing relationships and rules without step-by-step instructions.", - "Focusing on sequential programming.", - "Ignoring logical inferenceIt establishes the order of precedence among different norms." - ], - "correctAnswer": "2", - "messageForCorrectAnswer": "Correct answer. Good job.", - "messageForIncorrectAnswer": "Incorrect answer. Please try again.", - "point": "1" - } - ] -} diff --git a/docs/introduction/rules.mdx b/docs/introduction/rules.mdx index acbe7fa0645..72a6268dded 100644 --- a/docs/introduction/rules.mdx +++ b/docs/introduction/rules.mdx @@ -1,174 +1,35 @@ --- -sidebar_position: 4 +sidebar_position: 2 --- -import Quiz from 'react-quiz-component' -import * as quiz from './rules-quiz.json' - # Define any rule -Reading time: {readingTime} min - ## Rules: what can be defined? -The key feature of the Axone protocol is the ability to define rules within its ecosystem. The term **"Rules"** forms the backbone of the protocol, governing how off-chain digital resources like datasets, algorithms, storage, and computation resources are shared and managed. These rules define the parameters and conditions under which resource sharing and interactions occur. Understanding the scope of what can be defined within these rules is crucial for harnessing the full power of the Axone protocol. - -A [zone](https://docs.okp4.network/whitepaper/solution#zone-overview) is a conceptual framework defined by a set of rules, within which the recognized digital resources are compatible with these rules, considering the associated consents. A resource is not attached to a zone. The recognition of resources within a Zone relies on the dynamic evaluation of the conformity of the rules and consents of the resources. - -The Axone protocol enforces rules for governance and consent. When users want to do something in a Zone (launch a workflow to create new indicators or train an AI model, for instance), the protocol checks if it's allowed based on the rules. This decision considers the current situation, as blockchain rules and digital resources constantly change. From a computer science perspective, the challenge is dealing with complex logic involving rules, such as hierarchy, inconsistency, and dependency. -To handle this, the Axone protocol ensures a secure and reliable way to interpret rules in a decentralized manner. The rules in each Zone and the consent attached to a resource determine if a user's action is permitted. It's essential to remember that this assessment also considers the evolving state of the blockchain at the time of the request. +The Axone protocol's core feature is defining rules for sharing and managing off-chain digital resources like datasets and algorithms. These rules define the parameters and conditions under which resource sharing and interactions occur. A [Zone](https://docs.okp4.network/whitepaper/solution#zone-overview), a conceptual framework defined by a set of rules, ensures resource compatibility through dynamic evaluation of rules and consents. Resources aren't attached to zones but are recognized based on their conformity to these rules and consents. Understanding these definitions is key to utilizing the protocol effectively. -![rules-1](/img/content/academy/rules-1.webp) +So how does Axone ensure law enforcement before execution? 1. An Identity (human or bot) wants to interact with a Zone -2. The Zone asks the dedicated smart contract if it's possible given the context and all the involved rules +2. The Zone asks the dedicated smart contract if it's possible given the context and the defined rules 3. The protocol employs logical inference to resolve matters based on the state of the blockchain -4. The protocol yields a modality as a response, such as "prohibited", "permitted", "possible", and so on. Depending on the answer, the execution process could start. - -What kind of rules can be defined? - -### 1. Defining Access Permissions - -One fundamental aspect of Axone rules is the ability to define access permissions. Through these rules, you can precisely outline who has the right to access specific off-chain resources. Whether granting read-only access to certain data or complete control over a particular resource, Axone empowers users to tailor access permissions according to their unique needs. - -### 2. Resource Utilization Policies - -Axone allows users to establish resource utilization policies beyond simple access permissions. This involves defining how shared resources can be utilized, ensuring optimal efficiency, and preventing misuse. Whether specifying the duration of resource access or setting usage quotas, Axone rules provide a flexible framework for resource management. For example, users can define temporal and spatial constraints for resource sharing. This means you can set rules that dictate when specific resources are available, creating dynamic access schedules. Additionally, spatial constraints enable the restriction of resource access based on geographical or network-specific parameters. - -### 3. Business models - -Each zone can define how value is created and distributed among participants. This could range from straightforward transaction-based models to more complex, performance-based incentives. - -### 4. Dynamic Rule Updates - -The Axone protocol acknowledges the dynamic nature of resource management. Rules can be updated in real-time, enabling users to adapt to changing requirements seamlessly. This dynamicity ensures that Axone remains responsive to evolving scenarios, providing a future-proof solution for off-chain resource orchestration. - -### 5. Inter-Rule Relationships - -Axone rules are not isolated entities; they can interact with one another. Understanding and defining inter-rule relationships is a powerful aspect of Axone's flexibility. For example, you can establish dependencies between rules, ensuring that certain conditions must be met before others come into effect. +4. The protocol yields a modality as a response ("prohibited", "permitted", "possible", etc). Depending on the answer, the execution process could start. -The ability to define rules is a pivotal feature of the Axone protocol, offering an unprecedented level of control and customization. By leveraging these rules, participants can create diverse applications and ecosystems, each with unique governance and operational dynamics. This flexibility is central to Axone's vision of fostering a decentralized, collaborative, and innovative digital resource environment. +## What kind of rules can be defined? -## Prolog: Turing complete logical and declarative programming language +1. **Defining Access Permissions** - Axone allows you to set precise access permissions for off-chain resources, controlling who can view or manage them, from read-only access to full control. -In the vast landscape of programming languages, Prolog stands out as a formidable tool. And in the realm of Axone, it plays a pivotal role in shaping the logical and declarative aspects of the protocol. Prolog's significance lies in its ability to handle complex logical scenarios, making it a powerful choice for the dynamic environment of the Axone protocol. +2. **Resource Utilization Policies** - You can establish how resources are used, including setting duration limits and usage quotas, as well as temporal and spatial constraints for resource sharing. -### 1. The Essence of Prolog +3. **Business models** - Axone supports defining business models for value creation and distribution, ranging from simple transactions to complex performance-based incentives. -Prolog, short for "Programming in Logic," is a unique programming paradigm that utilizes logical inference and declarative statements. Unlike traditional imperative languages, Prolog focuses on describing relationships and rules rather than explicit step-by-step instructions. This makes it well-suited for expressing complex relationships and solving intricate logical problems, precisely the challenges faced in Axone. +4. **Dynamic Rule Updates** - Rules can be updated in real-time to adapt to changing needs, providing flexibility and ensuring the system remains responsive. -### 2. Turing Completeness +5. **Inter-Rule Relationships** - Rules can interact with one another through dependencies, allowing for complex rule applications where conditions must be met before others are enforced. -One of Prolog's notable features is its Turing completeness. This term signifies that Prolog can, in theory, compute anything computable by other programming languages. This attribute is essential for Axone, as it ensures that the logical and declarative programming capabilities provided by Prolog can address the diverse and evolving challenges presented by combining multiple resources and rules. - -### 3. Declarative Programming in Action - -In the context of Axone, Prolog's declarative nature is a boon. Users can specify what they want to achieve, and Prolog handles the intricate task of determining how to achieve it. This provides a clear and concise way to express the governance and consent rules governing resource interactions. - -### 4. Logical Problem Solving - -The dynamic and evolving nature of Axone's rules necessitates a robust logical problem-solving capability. Prolog excels in this arena by employing a resolution-based inference engine, allowing it to navigate through complex relationships defined by rules. This becomes crucial when resolving issues of hierarchy, inconsistency, dependency, and conflict resolution in access permissions and resource utilization. - -### 5. Decentralized Interpretation - -In the Axone ecosystem, where decentralization is a crucial principle, Prolog is integrated into an on-chain module and serves as a trustworthy interpreter of rules. With its established rules, each Zone can leverage Prolog to determine the permissibility of a user's actions. This decentralized interpretation ensures that the governance and consent rules are applied consistently and reliably across the network. - -### 6. Prolog in practice - -Here are some fundamental concepts and basics of the Prolog language: - -- Declarative Style: Prolog is a declarative language, meaning that you specify what you want - to achieve rather than how to achieve it. Programs in Prolog describe relationships and rules - rather than a sequence of steps. - -- Logic Programming: Prolog is a logic programming language. It is based on the principles of - first-order logic, where statements are represented as logical predicates. - -- Facts and Rules: Prolog programs consist of facts and rules. Facts are statements about the - world, and rules define relationships and conditions. These are the building blocks for creating a - knowledge base. - -```prolog -% Fact -% John likes pizza. -likes(john, pizza). - -% Rule -% X is hungry IF X likes pizza. -hungry(X) :- likes(X, pizza). -``` +## Understanding Prolog in Axone -- Predicates and Clauses: In Prolog, statements are expressed as predicates. Predicates - consist of a function (name) and arguments. Clauses are the combination of facts and rules. - -```prolog -% Predicate -likes(john, pizza). - -% Clause (fact) -father(john, jim). - -% Clause (rule) -sibling(X, Y) :- father(Z, X), father(Z, Y), X \= Y. -``` - -- Variables: Prolog uses variables to represent unknown values. Variables are denoted with a - capital letter or an underscore. - -```prolog -% Variable -% John likes X. -likes(john, X). -``` - -- Queries: Prolog is interactive, and users can query the knowledge base. The system will - attempt to find values for variables that satisfy the given conditions. - -```prolog -% Query -% What does John like? -?- likes(john, What). -``` - -- Backtracking: Prolog uses a backtracking mechanism to explore alternative solutions. If a - query fails, Prolog will backtrack and explore other possibilities. - -```prolog -% Backtracking example -% The following rule defines a family relationship. -parent(john, jim). -parent(john, ann). -parent(jim, tom). - -% Query: Who is Tom's parent? -?- parent(X, tom). -% This will return X = jim, and upon backtracking, X = john. -``` - -- Recursion: Prolog supports recursion, allowing functions to call themselves. Recursive - structures are common in Prolog for expressing relationships that involve repetition. - -```prolog -% Recursive rule for factorial -factorial(0, 1):-!. -factorial(N, Result) :- N > 0, Prev is N - 1, factorial(Prev, PrevResult), Result is N * PrevResult. -``` - -- Cut Operator (!): The cut operator controls backtracking. It prunes the search space and - commits Prolog to the choices made. - -```prolog -% Cut operator example -likes(john, pizza). -likes(john, sushi). - -% Query: Does John like pizza? -?- likes(john, pizza), !. -``` - -These are some of the basic concepts of Prolog. Its emphasis on logic and declarative programming makes it well-suited for rule-based systems, knowledge representation, and artificial intelligence applications. - -As we progress through the Axone Academy, the role of Prolog becomes increasingly apparent in enabling a Turing complete, logical, and declarative approach to managing the intricate rules that define the protocol. Join us on this journey as we explore the depth of Prolog's capabilities within the dynamic landscape of Axone. +Prolog, a logical and declarative programming language, plays a crucial role in managing Axone's complex logical scenarios. Its Turing completeness ensures it can handle diverse challenges, making it ideal for expressing governance and consent rules. Prolog's declarative nature allows users to specify desired outcomes, with Prolog determining the method to achieve them. This capability supports decentralized interpretation of rules, ensuring consistent application across the network. By leveraging Prolog, Axone offers a robust solution for dynamic and flexible rule management. To delve deeper into Prolog's role in Axone, read more **here**. ## Resource's consents @@ -200,7 +61,7 @@ Given the interconnected nature of resources and their rules, Axone acknowledges Axone places a premium on transparency in resource governance. Resource consents are designed to be transparent and auditable, allowing users and stakeholders to understand how each resource is governed. This transparency fosters trust and contributes to the overall security and accountability within the Axone ecosystem. -**7. Let's practice** +**Let's practice!** Let's consider a simple example of rules written in Prolog for a hypothetical resource-sharing scenario within the Axone context. In this example, we'll create rules for granting access to a specific dataset based on user roles and temporal constraints. @@ -249,5 +110,3 @@ Example queries demonstrate how Prolog can be used to check if a user has access Note: The Axone SDK contains templates of governance rules that you can use and adapt to your needs. As we delve deeper into the Axone Academy, understanding the intricacies of resource rules becomes paramount. These rules serve as the backbone of the protocol, ensuring that off-chain resources are governed with precision, flexibility, and transparency. Join us as we unravel the complexities of resource rule management within the dynamic landscape of Axone. - - diff --git a/docs/introduction/who-is-it-for.mdx b/docs/introduction/who-is-it-for.mdx index 3f1927c3e4f..f017074a63f 100644 --- a/docs/introduction/who-is-it-for.mdx +++ b/docs/introduction/who-is-it-for.mdx @@ -7,8 +7,6 @@ import * as quiz from './who-is-it-for-quiz.json' # Who is it for? -Reading time: {readingTime} min - Axone is often described as a protocol that enables sharing Anything as a Service under any Conditions. To illustrate the infinite possibilities opened up by the protocol, this section provides further examples of the intended audience for the protocol. ## For Data Providers diff --git a/docs/introduction/consume-resources.mdx b/docs/introduction/workflows.mdx similarity index 96% rename from docs/introduction/consume-resources.mdx rename to docs/introduction/workflows.mdx index 12475286f82..f5d0d837a27 100644 --- a/docs/introduction/consume-resources.mdx +++ b/docs/introduction/workflows.mdx @@ -2,14 +2,7 @@ sidebar_position: 5 --- -import Quiz from 'react-quiz-component' -import * as quiz from './consume-resources-quiz.json' - -# Consume resources - -Reading time: {readingTime} min - -## Workflows: what are they? +# Workflows **Workflows**, in the context of the Axone protocol, refer to the sequences or processes initiated using the various digital resources and digital resources processing services shared within the Axone ecosystem: The Dataverse. These workflows can involve datasets, algorithms, software, storage resources, computation resources, or any other resources that are part of the Axone Dataverse. @@ -35,7 +28,7 @@ In the example above, we have a simple use case which involves three datasets (D In essence, workflows in Axone represent the practical application of the shared digital resources within its ecosystem, facilitating various tasks and operations by leveraging the power of decentralized data and resource sharing. -## The life of a workflow from initiation to completion +## Workflow lifecycle Here's a detailed breakdown: @@ -68,16 +61,12 @@ When we think of Workflows as a Service, a new perspective emerges: workflows ca The workflow is purely declarative and merely expresses the activities to be performed and how they are to be performed. However, its execution requires the coordination of the involved resources. Typically, this is achieved through a central authority responsible for managing this logic, acting as the conductor who directs each participant. It is at this juncture that the concept of Orchestration comes into play. -![consume-resources-4](/img/content/academy/consume-resources-4.webp) - In its centralized perspective, orchestration relies on a single authority responsible for taking the necessary actions to accomplish a set of activities in response to a declarative expression of needs. This authority holds the logic for execution. Let's consider the example of Kubernetes — a well-known Container Orchestrator — its API enables the "declaration" of resources and will manage the operations and lifecycle logic associated with these resources. By adopting a decentralized approach, one would expect the blockchain to handle orchestration. However, due to its highly constrained communication capabilities with the external environment, it cannot fulfill this role effectively. Therefore, the most suitable approach is to delegate the execution of workflows to a dedicated off-chain resource: **the Orchestration Service**. This specific resource takes on the orchestration role while the protocol maintains its position as the source of truth and ultimate authority to which it must adhere. In the given diagram, we illustrate how an off-chain Orchestration Service interprets the instructions (plan) recorded on-chain (in a transaction) and arranges the communication with different services (off-chain) to execute the workflow. -![consume-resources-5](/img/content/academy/consume-resources-5.webp) - ### One To Many We have thus introduced a new kind of Resource whose actual role is to drive the execution of workflows registered in the blockchain. However, this may seem to reduce the decentralization perspective by relying on a single entity. In reality, this is not the case. @@ -103,5 +92,3 @@ The role and responsibilities of an Orchestration Service can be categorized int - Audit trail: The Orchestration Service maintains an Audit Trail by recording all execution steps in the blockchain. Specifically, it records information in the ontology designed for this purpose on-chain. This provides a complete and immutable traceability of actions performed within the workflow, offering enhanced transparency and control. ## Safety mechanisms - Coming soon - - diff --git a/docs/technical-documentation/technical-implementation/decentralized-identity.mdx b/docs/technical-documentation/technical-implementation/decentralized-identity.mdx index ff2d1c37e88..3fd7fd2811b 100644 --- a/docs/technical-documentation/technical-implementation/decentralized-identity.mdx +++ b/docs/technical-documentation/technical-implementation/decentralized-identity.mdx @@ -2,18 +2,16 @@ sidebar_position: 1 --- -import Quiz from 'react-quiz-component'; -import * as quiz from './decentralized-identity-quiz.json'; +import Quiz from 'react-quiz-component' +import * as quiz from './decentralized-identity-quiz.json' # Decentralized identity -Reading time: {readingTime} min +Unlike traditional identity systems, where personal identification information is centralized and often managed by a single entity (such as a company or government), **decentralized identity** enables individuals to control and operate their own identification data. This model, also known as Self-Sovereign Identity (SSI), offers several key advantages. -Unlike traditional identity systems, where personal identification information is centralized and often managed by a single entity (such as a company or government), **decentralized identity** enables individuals to control and operate their own identification data. This model, also known as Self-Sovereign Identity (SSI), offers several key advantages. - -It enhances security and privacy, as data is not stored in a central location vulnerable to attack or abuse. -It increases transparency and trust, as users can choose how, when, and with whom to share their information without relying on intermediaries. -This reduces the risk of censorship or manipulation by third parties. +It enhances security and privacy, as data is not stored in a central location vulnerable to attack or abuse. +It increases transparency and trust, as users can choose how, when, and with whom to share their information without relying on intermediaries. +This reduces the risk of censorship or manipulation by third parties. The importance of decentralized identity lies in its ability to give individuals back the power over their personal information in an increasingly digital world, offering a new approach to identity management that is secure, transparent, and user-centric. @@ -28,53 +26,58 @@ Axone integrates [W3C standards](https://www.w3.org/) for decentralized identity ## Decentralized identity roles -Decentralized identity allows users to manage their personal information in their own wallet. This data, called **credentials**, is created, issued, and cryptographically signed by an entity called **Issuer** to a **Holder**. The Holder can share this data with a third party, called a Verifier. +Decentralized identity allows users to manage their personal information in their own wallet. This data, called **credentials**, is created, issued, and cryptographically signed by an entity called **Issuer** to a **Holder**. The Holder can share this data with a third party, called a Verifier. ### Issuers -An Issuer is an entity that issues trustworthy data in the form of **Verifiable Credentials**. Issuers can be institutional organizations (government, bank, insurance company, etc.) or any other person or organization (a friend, a local business, a DAO, etc.). The only requirement for an issuer is its ability to certify a fact or characteristic relating to another person. +An Issuer is an entity that issues trustworthy data in the form of **Verifiable Credentials**. Issuers can be institutional organizations (government, bank, insurance company, etc.) or any other person or organization (a friend, a local business, a DAO, etc.). The only requirement for an issuer is its ability to certify a fact or characteristic relating to another person. ### Holders -A Holder can be a person, organization, product, or object possessing a set of attributes certified by an Issuer. This holder can store and manage these attributes in the form of Verifiable Credentials and decide with whom to share this information. +A Holder can be a person, organization, product, or object possessing a set of attributes certified by an Issuer. This holder can store and manage these attributes in the form of Verifiable Credentials and decide with whom to share this information. ### Verifiers A Verifier is an entity empowered to authenticate the legitimacy and veracity of a Verifiable Credential through a Verifiable Presentation submitted to it. The verifier can confirm that the information presented originates from the correct and authorized Issuer and that the Verifiable Credential has not been altered in any way. Generally, the verifier can also check that the Verifiable Credential has not expired or been revoked. -
- Decentralized Identity tryptic +
+ Decentralized Identity tryptic
-**Zero-knowledge proof** (ZKP) technology can be used to share proof of identity or authorization without revealing the complete identity of the holder. +**Zero-knowledge proof** (ZKP) technology can be used to share proof of identity or authorization without revealing the complete identity of the holder. -Note that blockchain technologies generally support decentralized identity. Therefore, each data exchange between your wallet and an Issuer or Verifier may involve fees. +Note that blockchain technologies generally support decentralized identity. Therefore, each data exchange between your wallet and an Issuer or Verifier may involve fees. :::tip **Note on Blockchain Fees:** The fees associated with blockchain transactions can vary due to several factors, including network congestion and transaction complexity. As these fees are not fixed and can change over time, we recommend consulting the documentation of the relevant blockchain or your wallet provider to get the most current information on transaction fees. ::: -### Example: apply for a job +### Example: apply for a job **Issuer - University**: -*Role*: Issues digital diplomas. +_Role_: Issues digital diplomas. -*Action*: A university (Issuer) issues a digital diploma to one of its former students. The university digitally signs the certificate, guaranteeing its authenticity. +_Action_: A university (Issuer) issues a digital diploma to one of its former students. The university digitally signs the certificate, guaranteeing its authenticity. **Holder - Graduate**: -*Role*: Receives and holds claims (attestations). +_Role_: Receives and holds claims (attestations). -*Action*: The graduate (Holder) receives the digital diploma and stores it in their digital wallet. This wallet enables him to manage his digital credentials and attestations securely. +_Action_: The graduate (Holder) receives the digital diploma and stores it in their digital wallet. This wallet enables him to manage his digital credentials and attestations securely. **Verifier - Potential Employer**: -*Role*: Verifies claims to confirm their validity. +_Role_: Verifies claims to confirm their validity. -*Action*: When the graduate applies for a job, the potential employer (Verifier) asks for proof of qualification. The graduate then shares his digital diploma with the employer. The employer can then verify the diploma's authenticity using the university's public key. If the digital signature matches, the employer can be sure that the diploma is genuine and has been issued by the university mentioned. +_Action_: When the graduate applies for a job, the potential employer (Verifier) asks for proof of qualification. The graduate then shares his digital diploma with the employer. The employer can then verify the diploma's authenticity using the university's public key. If the digital signature matches, the employer can be sure that the diploma is genuine and has been issued by the university mentioned. **How the process works**: + 1. Diploma issuance: The university creates a digital diploma and digitally signs it. 2. Diploma storage: The graduate receives and securely stores the diploma in their digital wallet. 3. Sharing and verification: When applying for a job, the graduate shares the diploma with the employer. The employer then verifies the digital signature against the university's public key. @@ -83,11 +86,11 @@ This scenario illustrates how decentralized identity systems facilitate the secu ## DID -A **DID**, or **Decentralized Identifier**, is a unique identifier that enables sovereign, verifiable digital identification. Unlike traditional identifiers, such as those provided by online services like user accounts or social security numbers, DIDs are entirely controlled by the individual, organization, or entity they refer to. +A **DID**, or **Decentralized Identifier**, is a unique identifier that enables sovereign, verifiable digital identification. Unlike traditional identifiers, such as those provided by online services like user accounts or social security numbers, DIDs are entirely controlled by the individual, organization, or entity they refer to. -A DID applies to anything that has an identity. An entity is something with a distinct and independent existence. It can be a person but also an organization, an animal, an object, and, in the case of the Axone protocol, a dataset or a digital service. +A DID applies to anything that has an identity. An entity is something with a distinct and independent existence. It can be a person but also an organization, an animal, an object, and, in the case of the Axone protocol, a dataset or a digital service. -An infinite number of DIDs can be attached to the same identity, which offers several advantages: +An infinite number of DIDs can be attached to the same identity, which offers several advantages: 1. **Separation of contexts**: An identity can have several DIDs, each used in a different context (professional, personal, leisure, etc.). This allows the individual or entity to present only the information relevant to each context without exposing the whole identity or other irrelevant information. 2. **Privacy**: With multiple DIDs, controlling which information is shared with whom is possible. This reduces the risk of profiling or tracking by third parties. Using different DIDs in different contexts makes it more difficult for observers to correlate all actions and interactions to a single identity. @@ -98,8 +101,12 @@ DIDs are managed by decentralized networks, notably blockchains. This means that The DID is a [W3C](https://www.w3.org/TR/did-core/) standard designed to be interoperable across different systems and networks, facilitating their use in diverse digital contexts. -
- DID +
+ DID
### Example: An Autonomous Vehicle as a DID Holder @@ -107,6 +114,7 @@ The DID is a [W3C](https://www.w3.org/TR/did-core/) standard designed to be inte Soon, autonomous vehicles could be equipped with their own decentralized identity (DID). These DIDs enable the car to interact autonomously with various services and infrastructures without human intervention. **How the process works**: + 1. Identity creation: An autonomous vehicle manufacturer generates a DID for each vehicle it produces. This DID serves as a digital identifier for the vehicle. 2. Autonomous Interactions: The vehicle uses its DID to authenticate itself and communicate with intelligent road infrastructures, recharging services, parking payment systems, etc. 3. Security and Privacy Management: The DID enables the vehicle to maintain high security and privacy, as it can prove its identity without revealing sensitive information. @@ -119,31 +127,32 @@ Soon, autonomous vehicles could be equipped with their own decentralized identit - Security and reliability: DIDs provide a secure framework for transactions and communications. - Traceability and Accountability: Every vehicle interaction can be traced through its DID, offering greater accountability in case of problems. - ### DID Document A **Decentralized Identifier Document** contains key information that enables an entity (individual, organization, or object) to autonomously and securely manage its digital identity. Here are the typical elements found in a DID Document (not exclusive): 1. **DID Identifier** -This is the entity's unique identifier, typically in the form of a URI (Uniform Resource Identifier). + This is the entity's unique identifier, typically in the form of a URI (Uniform Resource Identifier). Example : "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3" 2. **DID Context** -It provides information about the DID context or schema, usually by referencing a URL where the DID specification is defined. + It provides information about the DID context or schema, usually by referencing a URL where the DID specification is defined. Example : "@context": "https://www.w3.org/ns/did/v1". 3. **Verification Method** -A DID document can include specific methods, such as public keys (a kind of digital key), that help verify the identity of the DID holder or authorize interactions with their digital identity. For example, a public key can validate a digital signature by ensuring it corresponds with the holder's private key, which is a unique digital key they possess. These verification methods can vary greatly. + A DID document can include specific methods, such as public keys (a kind of digital key), that help verify the identity of the DID holder or authorize interactions with their digital identity. For example, a public key can validate a digital signature by ensuring it corresponds with the holder's private key, which is a unique digital key they possess. These verification methods can vary greatly. Each Verification Key itself lists: + - An **ID** for the specific key - The **controller**: the identifier of the person or company with control over that key - The **type of cryptographic key** - The verification key material such as **publicKeyMultibase** Example: + ```json { "@context": [ @@ -192,31 +201,39 @@ Direct Incorporation of Public Key: In the did:key method, the DID directly enco A did:key DID looks like this: did:key:z12ab34cd56ef78gh90i... -The limitations of the did:key method are: +The limitations of the did:key method are: + - No Dynamic Updates: Since did:key DIDs are static and don't reference an external source for their DID document, they cannot be updated. Any change in the key or other details requires the generation of a new DID. - No Privacy Layer: The method exposes the public key openly, which might not be desirable in all scenarios, especially where privacy is a concern. # Decentralized identity in Axone Protocol -The **[Axone ontology](/academy/part-1/resources#ontology-how-its-represented-semantic-description)** is used to describe the dataverse. In the dataverse, resources are identified by their DID. +The **[Axone ontology](/academy/part-1/resources#ontology-how-its-represented-semantic-description)** is used to describe the dataverse. In the dataverse, resources are identified by their DID. Understanding and distinguishing key roles is essential when claiming a resource in the Axone dataverse. Although these roles are distinct, they can be exercised by the same or different entities. Here's a detailed explanation of each role: + - **Registrant**: This entity initiates the process of declaring the resource on the blockchain. It is also responsible for the financial aspects of the process, including transaction fees. It is important to note that the Declarer can be any entity that is able and willing to declare the resource in the Axone protocol. - **Holder**: This role is assigned to the DID of the resource itself. The holder embodies the digital identity of the resource in the dataverse, thus constituting a central point for any interaction or transaction concerning this resource. - **Issuer**: The issuer, whose DID is linked to creating the Verifiable Credential, plays a decisive role. It ensures the authenticity and legitimacy of the resource's claim, guaranteeing its official recognition in the protocol. -
- Decentralized Identity and Axone +
+ Decentralized Identity and Axone
In the case of the declaration of a digital resource in the Dataverse, the Provider has three roles at the same time: + - Issuer as he declares the metadata of its resource - Holder as he is the owner of the resource - Registrant as he declares the verifiable presentations in the Axone Protocol so that it can be used In the case of a declaration of reputation, the roles are handled by distinct entities: + - The Issuer is a trusted authority - The Holder is the Provider subject of the reputation claim -- The Registrant can be the Provider, the Issuer, or a third-party +- The Registrant can be the Provider, the Issuer, or a third-party - + diff --git a/docs/technical-documentation/technical-implementation/describe-resource.mdx b/docs/technical-documentation/technical-implementation/describe-resource.mdx index c5d87ce2ef2..782ad813f98 100644 --- a/docs/technical-documentation/technical-implementation/describe-resource.mdx +++ b/docs/technical-documentation/technical-implementation/describe-resource.mdx @@ -4,47 +4,52 @@ sidebar_position: 3 # Describe a resource -Reading time: {readingTime} min +Now that you know what a DID and a Verifiable Credential are, and what they mean for the Axone protocol, let's put them into practice! -Now that you know what a DID and a Verifiable Credential are, and what they mean for the Axone protocol, let's put them into practice! - -You're a digital resource provider and you want to share a dataset or a service. First, you need to describe your resource and register it in the Dataverse (i.e. in the Axone protocol). +You're a digital resource provider and you want to share a dataset or a service. First, you need to describe your resource and register it in the Dataverse (i.e. in the Axone protocol). Here are the 4 steps involved: -
- Steps to describe a resource in the Dataverse +
+ Steps to describe a resource in the Dataverse
-We'll take 2 examples in this tutorial: +We'll take 2 examples in this tutorial: - The dataset [Crime Data from 2020 to Present](https://data.lacity.org/Public-Safety/Crime-Data-from-2020-to-Present/2nrs-mtv8/about_data) - The storage service [IPFS](https://ipfs.tech) :::info -Prerequisite: +Prerequisite: + - [Install the Axone CLI](https://docs.okp4.network/tutorials/cli-1#installing-the-okp4-cli) to interact with the protocol - Ensure you have `npm` installed on your system. You can follow the installation guide [here](https://www.npmjs.com/get-npm). - Install the [json-cli](https://github.com/digitalbazaar/jsonld-cli) with the following command: + ```bash npm install -g jsonld-cli ``` + ::: ## Step 1: Create keys -As we saw previously, all entities are identified by a DID in the Dataverse. The first step consists of creating keys and related DID for the issuer of the credentials and the resource itself. +As we saw previously, all entities are identified by a DID in the Dataverse. The first step consists of creating keys and related DID for the issuer of the credentials and the resource itself. The Axone Protocol can provide you keys (also called a wallet) and DID. A key pair is created to obtain a wallet to establish secure ownership and control over your assets on the Axone blockchain. The key pair consists of two cryptographic keys: public and private keys. When creating a wallet, you're typically provided with a mnemonic consisting of 12, 24, or sometimes more words. This mnemonic acts as a human-readable representation of the underlying cryptographic information. It is easier to remember and write down than the complex numbers and characters representing the private key. The mnemonic serves as a backup mechanism for the wallet. You can regenerate the key pair by inputting the mnemonic into any compatible wallet software to recover access to your funds. -Here, we don't create a wallet for cryptocurrency storage but for secure storage of identifiers: A wallet can securely store digital identifiers, such as proofs of identity, certificates, or other personal identification information. +Here, we don't create a wallet for cryptocurrency storage but for secure storage of identifiers: A wallet can securely store digital identifiers, such as proofs of identity, certificates, or other personal identification information. :::danger -A keyring is a secure software utility designed to store and manage credentials, such as passwords, cryptographic keys, and API tokens, in a centralized and encrypted form. The `--keyring-backend test` command parameter is intended for use in *testing* environments. However, it is not recommended for production applications where the security of private keys is a highest priority. +A keyring is a secure software utility designed to store and manage credentials, such as passwords, cryptographic keys, and API tokens, in a centralized and encrypted form. The `--keyring-backend test` command parameter is intended for use in _testing_ environments. However, it is not recommended for production applications where the security of private keys is a highest priority. -For secure keyring setup in production environments, refer to the [Cosmos SDK doc](https://docs.cosmos.network/v0.50/user/run-node/keyring). This documentation provides a comprehensive guide to establishing a secure keyring configuration suitable for production use. +For secure keyring setup in production environments, refer to the [Cosmos SDK doc](https://docs.cosmos.network/v0.50/user/run-node/keyring). This documentation provides a comprehensive guide to establishing a secure keyring configuration suitable for production use. Avoid using the `--keyring-backend test` option in production, as it leaves private keys unencrypted on the file system, posing a potential security risk. ::: @@ -70,7 +75,7 @@ address: okp413e4exyqr5chxz5qlg2wpqr5ehmq90q2dgy753z type: local ``` -You can also use the command `okp4d show` to directly find information about a particular wallet. +You can also use the command `okp4d show` to directly find information about a particular wallet. ```bash # Replace "crime-data-lapd" with your wallet name @@ -80,27 +85,28 @@ okp4d keys show crime-data-lapd --keyring-backend test pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Aj8dI0OJWxTGM4gYd89cB8Qzi95DNxR/3F9DAPaNU0Mg"}' type: local ``` -Reiterate the command to create a wallet to store the IPFS and Issuer's identities. -So now we have the following information: +Reiterate the command to create a wallet to store the IPFS and Issuer's identities. + +So now we have the following information: -| | Crime dataset | -|--------------|------| -| Name of the wallet | crime-data-lapd | -| Public key | okp413e4exyqr5chxz5qlg2wpqr5ehmq90q2dgy753z | -| DID | did:key:zQ3shRfADCmegmmKotqCjzDc9BHWDpbEzp9yMiN5RkJx88oP5 | +| | Crime dataset | +| ------------------ | --------------------------------------------------------- | +| Name of the wallet | crime-data-lapd | +| Public key | okp413e4exyqr5chxz5qlg2wpqr5ehmq90q2dgy753z | +| DID | did:key:zQ3shRfADCmegmmKotqCjzDc9BHWDpbEzp9yMiN5RkJx88oP5 | -| | IPFS Storage | -|--------------|------| -| Name of the wallet | digital-resource-ipfs | -| Public key | okp41mlq7l9snuy9m0cznyrv3emn9wsndzle5v4j5q4 | -| DID | did:key:zQ3shhb4SvzBRLbBonsvKb3WX6WoDeKWHpsXXXMhAJETqXAfB | +| | IPFS Storage | +| ------------------ | --------------------------------------------------------- | +| Name of the wallet | digital-resource-ipfs | +| Public key | okp41mlq7l9snuy9m0cznyrv3emn9wsndzle5v4j5q4 | +| DID | did:key:zQ3shhb4SvzBRLbBonsvKb3WX6WoDeKWHpsXXXMhAJETqXAfB | -| | Issuer | -|--------------|------| -| Name of the wallet | issuer-okp4| -| Public key | okp41ysl9yllv40kfygcdfqj7c9n2a5c5zpmgku8ufg | -| DID | did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3 | +| | Issuer | +| ------------------ | --------------------------------------------------------- | +| Name of the wallet | issuer-okp4 | +| Public key | okp41ysl9yllv40kfygcdfqj7c9n2a5c5zpmgku8ufg | +| DID | did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3 | :::note In the future, you will be able to use any key provider, such as Cheqd. @@ -108,164 +114,156 @@ In the future, you will be able to use any key provider, such as Cheqd. ## Step 2: Create the credentials -Find the credential templates you need in the [Ontology documentation](https://docs.okp4.network/ontology/schemas) according to the nature of the resource you describe. +Find the credential templates you need in the [Ontology documentation](https://docs.okp4.network/ontology/schemas) according to the nature of the resource you describe. For the dataset, instantiate the template [credential-dataset-description](https://github.com/okp4/ontology/blob/main/src/example/dataset/crime-dataset-description.jsonld). For the service, instantiate the template [credential-digital-service-description](https://github.com/okp4/ontology/blob/main/src/example/digital-service/ipfs-digital-service-description.jsonld). :::info -Would you like to describe your dataset with other properties? You can create your template of credentials. Don't directly add these properties in the DatasetDescriptionCredential as defined in the Ontology. +Would you like to describe your dataset with other properties? You can create your template of credentials. Don't directly add these properties in the DatasetDescriptionCredential as defined in the Ontology. ::: -### Description of the dataset +### Description of the dataset Here are the following metadata of the dataset [Crime Data from 2020 to Present](https://data.lacity.org/Public-Safety/Crime-Data-from-2020-to-Present/2nrs-mtv8/about_data): -| Title | Crime Data from 2020 to Present | -|--------------|------| -| Description | This dataset reflects incidents of crime in the City of Los Angeles dating back to 2020. This data is transcribed from original crime reports that are typed on paper and therefore there may be some inaccuracies within the data. Some location fields with missing data are noted as (0°, 0°). Address fields are only provided to the nearest hundred block in order to maintain privacy. This data is as accurate as the data in the database. | -| Format | CSV | -| Geographical coverage | USA | -| Image | NA | -| Tags | Crime, Police, Los Angeles | -| Temporal coverage | 2020 to Present | -| Topic | Security | +| Title | Crime Data from 2020 to Present | +| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Description | This dataset reflects incidents of crime in the City of Los Angeles dating back to 2020. This data is transcribed from original crime reports that are typed on paper and therefore there may be some inaccuracies within the data. Some location fields with missing data are noted as (0°, 0°). Address fields are only provided to the nearest hundred block in order to maintain privacy. This data is as accurate as the data in the database. | +| Format | CSV | +| Geographical coverage | USA | +| Image | NA | +| Tags | Crime, Police, Los Angeles | +| Temporal coverage | 2020 to Present | +| Topic | Security | Let's fill in the template. ```json { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://w3id.org/okp4/ontology/v3/schema/credential/dataset/description/" - ], - "type": ["VerifiableCredential","DatasetDescriptionCredential"], - "id": "https://w3id.org/okp4/ontology/v3/schema/credential/dataset/description/5d29ea71-003f-46e7-a74d-d8d598629ed8", - "credentialSubject": { - "id": "did:key:zQ3shRfADCmegmmKotqCjzDc9BHWDpbEzp9yMiN5RkJx88oP5", - "hasDescription": "This dataset reflects incidents of crime in the City of Los Angeles dating back to 2020. This data is transcribed from original crime reports that are typed on paper and therefore there may be some inaccuracies within the data. Some location fields with missing data are noted as (0°, 0°). Address fields are only provided to the nearest hundred block in order to maintain privacy. This data is as accurate as the data in the database.", - "hasFormat": "https://w3id.org/okp4/ontology/v3/thesaurus/media-type/text_csv", - "hasGeoCoverage": "https://w3id.org/okp4/ontology/v3/thesaurus/area-code/840", - "hasTag": [ - "Crime", - "Police", - "Los Angeles" - ], - "hasTemporalCoverage": "2020-01-01T00:00:00.0000+01:00/2024-02-02T00:00:00.00000+01:00", - "hasTitle": "Crime Data from 2020 to Present", - "hasTopic": "https://w3id.org/okp4/ontology/v3/thesaurus/topic/security" - }, - "issuanceDate": "2024-02-02T09:45:43.475304+01:00", - "issuer": { - "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3", - "name": "OKP4" - } + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://w3id.org/okp4/ontology/v3/schema/credential/dataset/description/" + ], + "type": ["VerifiableCredential", "DatasetDescriptionCredential"], + "id": "https://w3id.org/okp4/ontology/v3/schema/credential/dataset/description/5d29ea71-003f-46e7-a74d-d8d598629ed8", + "credentialSubject": { + "id": "did:key:zQ3shRfADCmegmmKotqCjzDc9BHWDpbEzp9yMiN5RkJx88oP5", + "hasDescription": "This dataset reflects incidents of crime in the City of Los Angeles dating back to 2020. This data is transcribed from original crime reports that are typed on paper and therefore there may be some inaccuracies within the data. Some location fields with missing data are noted as (0°, 0°). Address fields are only provided to the nearest hundred block in order to maintain privacy. This data is as accurate as the data in the database.", + "hasFormat": "https://w3id.org/okp4/ontology/v3/thesaurus/media-type/text_csv", + "hasGeoCoverage": "https://w3id.org/okp4/ontology/v3/thesaurus/area-code/840", + "hasTag": ["Crime", "Police", "Los Angeles"], + "hasTemporalCoverage": "2020-01-01T00:00:00.0000+01:00/2024-02-02T00:00:00.00000+01:00", + "hasTitle": "Crime Data from 2020 to Present", + "hasTopic": "https://w3id.org/okp4/ontology/v3/thesaurus/topic/security" + }, + "issuanceDate": "2024-02-02T09:45:43.475304+01:00", + "issuer": { + "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3", + "name": "OKP4" + } } ``` Fields to modify: -- `id` (in @context): change the UUID at the end of the URI. You can generate a new UUID with this [tool](https://www.uuidgenerator.net). +- `id` (in @context): change the UUID at the end of the URI. You can generate a new UUID with this [tool](https://www.uuidgenerator.net). - `id`: copy the did:key of the dataset - `hasDescription`: fill in the description of the dataset -- `hasFormat`: select the format of your dataset in the [Thesaurus Media Type](https://github.com/okp4/ontology/blob/main/src/thesaurus/media-type.ttl). Put the URI of the selected format in the jsonld. -- `hasGeoCoverage`: select the geographical zone concerned by your dataset in the [Thesaurus Area-code](https://github.com/okp4/ontology/blob/main/src/thesaurus/area-code.ttl). Put the URI of the selected zone in the jsonld. +- `hasFormat`: select the format of your dataset in the [Thesaurus Media Type](https://github.com/okp4/ontology/blob/main/src/thesaurus/media-type.ttl). Put the URI of the selected format in the jsonld. +- `hasGeoCoverage`: select the geographical zone concerned by your dataset in the [Thesaurus Area-code](https://github.com/okp4/ontology/blob/main/src/thesaurus/area-code.ttl). Put the URI of the selected zone in the jsonld. - `hasTag`: fill in a list of tags - `hasTemporalCoverage': change the start and end date of the period concerned by your dataset - `hasTitle`: fill in the title of the dataset -- `hasTopic`: select the topic concerned by your dataset in the [Thesaurus Topic](https://github.com/okp4/ontology/blob/main/src/thesaurus/topic.ttl). Put the URI of the selected topic in the jsonld. +- `hasTopic`: select the topic concerned by your dataset in the [Thesaurus Topic](https://github.com/okp4/ontology/blob/main/src/thesaurus/topic.ttl). Put the URI of the selected topic in the jsonld. - `issuanceDate`: update the date for Today - `id` (issuer): copy the did:key of the issuer -- `name`: put the issuer's name (string). +- `name`: put the issuer's name (string). -You can remove some properties if they are not relevant to your dataset. +You can remove some properties if they are not relevant to your dataset. -### Description of the service +### Description of the service Here are the following metadata of the service [IPFS](https://ipfs.tech). -| Title | IPFS | -|--------------|------| -| Description | IPFS is a decentralized protocol designed to facilitate the storage, sharing, and retrieval of files on a global scale. | -| Category | Storage | -| Image | NA | -| Publisher | OKP4| -| Tags | Storage, Cloud, Peer-to-peer | -| Webpage | https://docs.ipfs.tech/ | +| Title | IPFS | +| ----------- | ----------------------------------------------------------------------------------------------------------------------- | +| Description | IPFS is a decentralized protocol designed to facilitate the storage, sharing, and retrieval of files on a global scale. | +| Category | Storage | +| Image | NA | +| Publisher | OKP4 | +| Tags | Storage, Cloud, Peer-to-peer | +| Webpage | https://docs.ipfs.tech/ | ```json { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://w3id.org/okp4/ontology/v3/schema/credential/digital-service/description/" - ], - "type": ["VerifiableCredential","DigitalServiceDescriptionCredential"], - "id": "https://w3id.org/okp4/ontology/v3/schema/credential/digital-service/description/5a3bd610-3a5d-4a41-bc90-0e437d453220", - "credentialSubject": { - "id": "did:key:zQ3shhb4SvzBRLbBonsvKb3WX6WoDeKWHpsXXXMhAJETqXAfB", - "hasCategory": "https://w3id.org/okp4/ontology/v3/thesaurus/digital-service-category/Storage", - "hasDescription": "IPFS is a decentralized protocol designed to facilitate the storage, sharing, and retrieval of files on a global scale", - "hasPublisher": "IPFS", - "hasTag": [ - "Storage", - "Peer-to-peer", - "Cloud" - ], - "hasTitle": "IPFS", - "hasWebpage": "https://docs.ipfs.tech/" - }, - "issuanceDate": "2024-01-22T09:28:43.475304+01:00", - "issuer": { - "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3", - "name": "OKP4" - } + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://w3id.org/okp4/ontology/v3/schema/credential/digital-service/description/" + ], + "type": ["VerifiableCredential", "DigitalServiceDescriptionCredential"], + "id": "https://w3id.org/okp4/ontology/v3/schema/credential/digital-service/description/5a3bd610-3a5d-4a41-bc90-0e437d453220", + "credentialSubject": { + "id": "did:key:zQ3shhb4SvzBRLbBonsvKb3WX6WoDeKWHpsXXXMhAJETqXAfB", + "hasCategory": "https://w3id.org/okp4/ontology/v3/thesaurus/digital-service-category/Storage", + "hasDescription": "IPFS is a decentralized protocol designed to facilitate the storage, sharing, and retrieval of files on a global scale", + "hasPublisher": "IPFS", + "hasTag": ["Storage", "Peer-to-peer", "Cloud"], + "hasTitle": "IPFS", + "hasWebpage": "https://docs.ipfs.tech/" + }, + "issuanceDate": "2024-01-22T09:28:43.475304+01:00", + "issuer": { + "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3", + "name": "OKP4" + } } ``` Fields to modify: -- `id` (in @context): change the UUID at the end of the URI. You can generate a new UUID with this [tool](https://www.uuidgenerator.net). +- `id` (in @context): change the UUID at the end of the URI. You can generate a new UUID with this [tool](https://www.uuidgenerator.net). - `id`: copy the did:key of the digital service -- `hasCategory`: select the cateogry of your service in the [Thesaurus Digital Service Category](https://github.com/okp4/ontology/blob/main/src/thesaurus/digital-service-category.ttl). Put the URI of the selected format in the jsonld. +- `hasCategory`: select the cateogry of your service in the [Thesaurus Digital Service Category](https://github.com/okp4/ontology/blob/main/src/thesaurus/digital-service-category.ttl). Put the URI of the selected format in the jsonld. - `hasDescription`: fill in the description of the service - `hasPublisher': fill in the name of the entity primarily responsible for making the Digital Service available - `hasTag`: fill in a list of tags - `hasTitle`: fill in the title of the service - `hasWebpage`: fill in the URL of the service's webpage - `id` (issuer): copy the did:key of the issuer -- `name`: put the issuer's name (string). +- `name`: put the issuer's name (string). ## Step 3: Sign the credentials -Now that you have created the VCs, you will sign them. +Now that you have created the VCs, you will sign them. Signing a verifiable credential involves creating a digital signature using cryptographic techniques. This signature is unique to both the document (in this case, the credential) and the signer's private key, making it impossible to forge. The private key is kept secret by the signer, while the corresponding public key is made available for anyone wishing to verify the signature's authenticity. By signing the credential, any alteration to the credential's data after it has been signed will invalidate the signature. This ensures the data has not been tampered with and remains as it was when issued. -To sign your VC, use this command: +To sign your VC, use this command: ```bash -okp4d credential sign $/MY-DIRECTORY/MY-DATASET.jsonld - --keyring-backend test +okp4d credential sign $/MY-DIRECTORY/MY-DATASET.jsonld + --keyring-backend test --from $MY_ADDR | jsonld toRdf -q - > $MY-DATASET.nq ``` With: -- `/MY-DIRECTORY/MY-DATASET.jsonld` : credential file address -- `MY_ADDR` : issuer address +- `/MY-DIRECTORY/MY-DATASET.jsonld` : credential file address +- `MY_ADDR` : issuer address - `MY-DATASET.nq` : name of the file with the signed credential in RDF format -Example: +Example: ```bash -okp4d credential sign ipfs-digital-service-description.jsonld - --keyring-backend test +okp4d credential sign ipfs-digital-service-description.jsonld + --keyring-backend test --from issuer-okp4 | jsonld toRdf -q - > ipfs-digital-service-description.nq ``` -You can see that there is new fields in the jsonld with the cryptographic proof. +You can see that there is new fields in the jsonld with the cryptographic proof. ```nquads did:key:zQ3shRfADCmegmmKotqCjzDc9BHWDpbEzp9yMiN5RkJx88oP5 https://w3id.org/okp4/ontology/v3/schema/credential/dataset/description/hasDescription "This dataset reflects incidents of crime in the City of Los Angeles dating back to 2020. This data is transcribed from original crime reports that are typed on paper and therefore there may be some inaccuracies within the data. Some location fields with missing data are noted as (0°, 0°). Address fields are only provided to the nearest hundred block in order to maintain privacy. This data is as accurate as the data in the database." . @@ -289,23 +287,23 @@ _:b1 https://w3id.org/security#proofPurpose https://w3id.org/security#assertionM _:b1 https://w3id.org/security#verificationMethod did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3#zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3 _:b0 . ``` -The VC is now in the hands of the Holder. Note that it is possible that the Issuer is also the Holder. +The VC is now in the hands of the Holder. Note that it is possible that the Issuer is also the Holder. -The Axone blockchain can only register VCs in N-Quads format. +The Axone blockchain can only register VCs in N-Quads format. ## Step 4: Register the credentials in the blockchain -The final step is to register the VCs in the Axone blockchain by submitting them to the Dataverse smart contract. It's the role of the Registrant (who can be the Holder or another entity). +The final step is to register the VCs in the Axone blockchain by submitting them to the Dataverse smart contract. It's the role of the Registrant (who can be the Holder or another entity). :::info Note that as you interact with the Axone blockchain, you must pay fees in $AXONE at each transaction. -::: +::: ```bash -okp4d tx wasm execute $CONTRACT_ADDR \ +okp4d tx wasm execute $CONTRACT_ADDR \ --node "https://api.drunemeton.okp4.network:443/rpc" \ - --chain-id okp4-drunemeton-1 \ - --from $MY_ADDR \ + --chain-id okp4-drunemeton-1 \ + --from $MY_ADDR \ --keyring-backend test --gas 10000000 \ "{\"submit_claims\":{\"metadata\": \"$(cat $MY-DATASET.nq | base64)\"}}" ``` @@ -314,33 +312,35 @@ With: - `CONTRACT_ADDR` : dataverse contract address (always the same) - For the Drunemeton testnet use okp418cszlvm6pze0x9sz32qnjq4vtd45xehqs8dq7cwy8yhq35wfnn3qvya8du - `node "https://api.drunemeton.okp4.network:443/rpc"` : name of the node for the Drunemeton testnet -- `MY_ADDR` : registrant okp4 address -- `$MY-DATASET.nq` : name of the file with the signed credential in RDF format +- `MY_ADDR` : registrant okp4 address +- `$MY-DATASET.nq` : name of the file with the signed credential in RDF format -Example: -```bash +Example: + +````bash okp4d tx wasm execute okp418cszlvm6pze0x9sz32qnjq4vtd45xehqs8dq7cwy8yhq35wfnn3qvya8du \ --node "https://api.drunemeton.okp4.network:443/rpc" \ --chain-id okp4-drunemeton-1 \ --from issuer-okp4 \ - --keyring-backend test + --keyring-backend test --gas 10000000 "{\"submit_claims\":{\"metadata\": \"$(cat ipfs-digital-service-description.nq | base64)\"}}" ``` -The Protocol will check the signature and if the public key corresponds to the proof in the VC, the VC is registered in the smart contract (Cognitarium). +The Protocol will check the signature and if the public key corresponds to the proof in the VC, the VC is registered in the smart contract (Cognitarium). -The command returns the hash of the transaction. You can find more details of this transaction in the [Explorer](https://explore.okp4.network/). Select the network (Currently Drunemeton-Testnet), click on the Search icon, and paste the transaction hash. +The command returns the hash of the transaction. You can find more details of this transaction in the [Explorer](https://explore.okp4.network/). Select the network (Currently Drunemeton-Testnet), click on the Search icon, and paste the transaction hash. Example: Hash: 766627052AA0A56F56702038E54EC69491386D35E0D76A47F9D5B2321DD56C3E
Axone explorer -
+


:::warning -Remember, the Resource Governance VC ensures the existence of a resource in the protocol: a resource or zone exists in the protocol only if governance is attached to it. Let's do it on the next page. +Remember, the Resource Governance VC ensures the existence of a resource in the protocol: a resource or zone exists in the protocol only if governance is attached to it. Let's do it on the next page. ::: +```` diff --git a/docs/technical-documentation/technical-implementation/describe-zone.mdx b/docs/technical-documentation/technical-implementation/describe-zone.mdx index 54621eec999..da6ad858a67 100644 --- a/docs/technical-documentation/technical-implementation/describe-zone.mdx +++ b/docs/technical-documentation/technical-implementation/describe-zone.mdx @@ -4,44 +4,49 @@ sidebar_position: 5 # Describe a Zone -Reading time: {readingTime} min - A [zone](https://docs.okp4.network/whitepaper/solution#zone-overview) is a conceptual framework defined by a set of rules, within which the recognized digital resources are compatible with these rules, taking into account the associated consents. A resource is not attached to a zone. The recognition of resources within a Zone relies on the dynamic evaluation of the conformity of the rules and consents of the resources. -All the workflows initiated within the Axone protocol must be defined in the context of a specific Zone. When the workflow is submitted, the protocol will check if all rules of the zone and of the engaged resources are respected and will apply the business model of the zone. +All the workflows initiated within the Axone protocol must be defined in the context of a specific Zone. When the workflow is submitted, the protocol will check if all rules of the zone and of the engaged resources are respected and will apply the business model of the zone. Let's see how to describe and register a zone in the Axone Protocol. Here are the four steps involved: -
- Steps to describe a resource in the Dataverse +
+ Steps to describe a resource in the Dataverse
We'll take the example of the Collaborative AI Zone in this tutorial. :::info -Prerequisite: +Prerequisite: + - [Install the Axone CLI](https://docs.okp4.network/tutorials/cli-1#installing-the-okp4-cli) to interact with the protocol - Ensure you have `npm` installed on your system. You can follow the installation guide [here](https://www.npmjs.com/get-npm). - Install the [json-cli](https://github.com/digitalbazaar/jsonld-cli) with the following command: + ```bash npm install -g jsonld-cli ``` + ::: ## Step 1: Create keys -The first step consists of creating keys and related DID for the issuer of the credentials and the resource itself. +The first step consists of creating keys and related DID for the issuer of the credentials and the resource itself. The Axone Protocol can provide you keys (also called a wallet) and DID. A key pair is created to obtain a wallet to establish secure ownership and control over your assets on the Axone blockchain. The key pair consists of two cryptographic keys: public and private keys. When creating a wallet, you're typically provided with a mnemonic consisting of 12, 24, or sometimes more words. This mnemonic acts as a human-readable representation of the underlying cryptographic information. It is easier to remember and write down than the complex numbers and characters representing the private key. The mnemonic serves as a backup mechanism for the wallet. You can regenerate the key pair by inputting the mnemonic into any compatible wallet software to recover access to your funds. -Here, we don't create a wallet for cryptocurrency storage but for secure storage of identifiers: A wallet can securely store digital identifiers, such as proofs of identity, certificates, or other personal identification information. +Here, we don't create a wallet for cryptocurrency storage but for secure storage of identifiers: A wallet can securely store digital identifiers, such as proofs of identity, certificates, or other personal identification information. :::danger -A keyring is a secure software utility designed to store and manage credentials, such as passwords, cryptographic keys, and API tokens, in a centralized and encrypted form. The `--keyring-backend test` command parameter is intended for use in *testing* environments. However, it is not recommended for production applications where the security of private keys is a highest priority. +A keyring is a secure software utility designed to store and manage credentials, such as passwords, cryptographic keys, and API tokens, in a centralized and encrypted form. The `--keyring-backend test` command parameter is intended for use in _testing_ environments. However, it is not recommended for production applications where the security of private keys is a highest priority. -For secure keyring setup in production environments, refer to the [Cosmos SDK doc](https://docs.cosmos.network/v0.50/user/run-node/keyring). This documentation provides a comprehensive guide to establishing a secure keyring configuration suitable for production use. +For secure keyring setup in production environments, refer to the [Cosmos SDK doc](https://docs.cosmos.network/v0.50/user/run-node/keyring). This documentation provides a comprehensive guide to establishing a secure keyring configuration suitable for production use. Avoid using the `--keyring-backend test` option in production, as it leaves private keys unencrypted on the file system, posing a potential security risk. ::: @@ -68,7 +73,7 @@ okp4d keys list --keyring-backend test ``` -You can also use the command `okp4d show` to directly find information about a particular wallet. +You can also use the command `okp4d show` to directly find information about a particular wallet. ```bash # Replace "collab-ai-zone" with your wallet name @@ -80,22 +85,22 @@ okp4d keys show collab-ai-zone --keyring-backend test type: local ``` -Reiterate the command to create a wallet to store the identity of the issuer. +Reiterate the command to create a wallet to store the identity of the issuer. -So now we have the following information: +So now we have the following information: -| | Collaborative AI zone | -|--------------|------| -| Name of the wallet | collab-ai-zone | -| Public key | okp41e48vdzvv5j337f6z5h93lyg5jth9ckn94cagzt | -| DID | did:key:zQ3shunN7us5oKNYKKzprW8nP5HAoTf4t2Fxyudho5zMAR1PQ | +| | Collaborative AI zone | +| ------------------ | --------------------------------------------------------- | +| Name of the wallet | collab-ai-zone | +| Public key | okp41e48vdzvv5j337f6z5h93lyg5jth9ckn94cagzt | +| DID | did:key:zQ3shunN7us5oKNYKKzprW8nP5HAoTf4t2Fxyudho5zMAR1PQ | -| | Issuer | -|--------------|------| -| Name of the wallet | issuer-okp4 | -| Public key | okp41ysl9yllv40kfygcdfqj7c9n2a5c5zpmgku8ufg | -| DID | did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3 | +| | Issuer | +| ------------------ | --------------------------------------------------------- | +| Name of the wallet | issuer-okp4 | +| Public key | okp41ysl9yllv40kfygcdfqj7c9n2a5c5zpmgku8ufg | +| DID | did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3 | :::note In the future, you will be able to use any key provider, such as Cheqd. @@ -103,99 +108,95 @@ In the future, you will be able to use any key provider, such as Cheqd. ## Step 2: Create the credentials -Find the credential templates you need in the [Ontology documentation](https://docs.okp4.network/ontology/schemas) according to the nature of the resource you describe. +Find the credential templates you need in the [Ontology documentation](https://docs.okp4.network/ontology/schemas) according to the nature of the resource you describe. -For the zone, instantiate the template [credential-zone-description](https://github.com/okp4/ontology/blob/main/src/example/zone/collab-ai-zone-description.jsonld). +For the zone, instantiate the template [credential-zone-description](https://github.com/okp4/ontology/blob/main/src/example/zone/collab-ai-zone-description.jsonld). :::info -Would you like to describe your zone with other properties? You can create your template of credentials. Don't directly add these properties in the ZoneDescriptionCredential as defined in the Ontology. +Would you like to describe your zone with other properties? You can create your template of credentials. Don't directly add these properties in the ZoneDescriptionCredential as defined in the Ontology. ::: -### Description of the Zone +### Description of the Zone Here are the following metadata of the zone Collaborative AI Zone -| Title | Collaborative AI Zone | -|--------------|------| -| Description | Collaborative AI Zone is dedicated to training AI models in a collaborative and open way. | -| Image | NA | -| Tags | AI, Collaboration, Machine learning | -| Topic | Other | +| Title | Collaborative AI Zone | +| ----------- | ----------------------------------------------------------------------------------------- | +| Description | Collaborative AI Zone is dedicated to training AI models in a collaborative and open way. | +| Image | NA | +| Tags | AI, Collaboration, Machine learning | +| Topic | Other | Let's fill in the template. ```json { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://w3id.org/okp4/ontology/v3/schema/credential/zone/description/" - ], - "type": ["VerifiableCredential","ZoneDescriptionCredential"], - "id": "https://w3id.org/okp4/ontology/v3/schema/credential/zone/description/7f547e63-ceb8-4ff3-8e2e-7a4278d97b8e", - "credentialSubject": { - "id": "did:key:zQ3shunN7us5oKNYKKzprW8nP5HAoTf4t2Fxyudho5zMAR1PQ", - "hasDescription": "Collaborative AI Zone is dedicated to train AI models in a collaborative and open way.", - "hasTag": [ - "AI", - "Collaboration", - "Machine Learning" - ], - "hasTitle": "Collaborative AI Zone", - "hasTopic": "https://w3id.org/okp4/ontology/v3/thesaurus/topic/other" - }, - "issuanceDate": "2024-02-02T15:40:43.475304+01:00", - "issuer": { - "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3", - "name": "OKP4" - } + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://w3id.org/okp4/ontology/v3/schema/credential/zone/description/" + ], + "type": ["VerifiableCredential", "ZoneDescriptionCredential"], + "id": "https://w3id.org/okp4/ontology/v3/schema/credential/zone/description/7f547e63-ceb8-4ff3-8e2e-7a4278d97b8e", + "credentialSubject": { + "id": "did:key:zQ3shunN7us5oKNYKKzprW8nP5HAoTf4t2Fxyudho5zMAR1PQ", + "hasDescription": "Collaborative AI Zone is dedicated to train AI models in a collaborative and open way.", + "hasTag": ["AI", "Collaboration", "Machine Learning"], + "hasTitle": "Collaborative AI Zone", + "hasTopic": "https://w3id.org/okp4/ontology/v3/thesaurus/topic/other" + }, + "issuanceDate": "2024-02-02T15:40:43.475304+01:00", + "issuer": { + "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3", + "name": "OKP4" + } } ``` Fields to modify: -- `id` (in @context): change the UUID at the end of the URI. You can generate a new UUID with this [tool](https://www.uuidgenerator.net). +- `id` (in @context): change the UUID at the end of the URI. You can generate a new UUID with this [tool](https://www.uuidgenerator.net). - `id`: copy the did:key of the zone - `hasDescription`: fill in the description of the zone - `hasTag`: fill in a list of tags - `hasTitle`: fill in the title of the zone -- `hasTopic`: select the topic concerned by your zone in the [Thesaurus Topic](https://github.com/okp4/ontology/blob/main/src/thesaurus/topic.ttl). Put the URI of the selected topic in the jsonld. +- `hasTopic`: select the topic concerned by your zone in the [Thesaurus Topic](https://github.com/okp4/ontology/blob/main/src/thesaurus/topic.ttl). Put the URI of the selected topic in the jsonld. - `issuanceDate`: update the date for Today - `id` (issuer): copy the did:key of the issuer -- `name`: put the issuer's name (string). +- `name`: put the issuer's name (string). -You can remove some properties if they are not relevant to your zone. +You can remove some properties if they are not relevant to your zone. ## Step 3: Sign the credentials -Now that you have created the VC, you will sign it. +Now that you have created the VC, you will sign it. Signing a verifiable credential involves creating a digital signature using cryptographic techniques. This signature is unique to both the document (in this case, the credential) and the signer's private key, making it nearly impossible to forge. The private key is kept secret by the signer, while the corresponding public key is made available for anyone wishing to verify the signature's authenticity. By signing the credential, any alteration to the credential's data after it has been signed will invalidate the signature. This ensures the data has not been tampered with and remains as it was when issued. -To sign your VC, use this command: +To sign your VC, use this command: ```bash -okp4d credential sign $/MY-DIRECTORY/MY-DATASET.jsonld - --keyring-backend test +okp4d credential sign $/MY-DIRECTORY/MY-DATASET.jsonld + --keyring-backend test --from $MY_ADDR | jsonld toRdf -q - > $MY-DATASET.nq ``` With: -- `/MY-DIRECTORY/MY-DATASET.jsonld` : credential file address -- `MY_ADDR` : issuer address +- `/MY-DIRECTORY/MY-DATASET.jsonld` : credential file address +- `MY_ADDR` : issuer address - `MY-DATASET.nq` : name of the file with the signed credential in RDF format -Example: +Example: ```bash -okp4d credential sign collab-ai-zone-description.jsonld - --keyring-backend test +okp4d credential sign collab-ai-zone-description.jsonld + --keyring-backend test --from issuer-okp4 | jsonld toRdf -q - > collab-ai-zone-description.nq ``` -You can see that there is new fields in the jsonld with the cryptographic proof. +You can see that there is new fields in the jsonld with the cryptographic proof. ```nquads "Collaborative AI Zone is dedicated to train AI models in a collaborative and open way." . @@ -217,23 +218,23 @@ _:b1 _:b0 . ``` -The VC is now in the hands of the Holder. Note that it is possible that the Issuer is also the Holder. +The VC is now in the hands of the Holder. Note that it is possible that the Issuer is also the Holder. -The Axone blockchain can only register VCs in N-Quads format. +The Axone blockchain can only register VCs in N-Quads format. ## Step 4: Register the credentials in the blockchain -The final step is to register the VCs in the Axone blockchain by submitting them to the Dataverse smart contract. It's the role of the Registrant (who can be the Holder or another entity). +The final step is to register the VCs in the Axone blockchain by submitting them to the Dataverse smart contract. It's the role of the Registrant (who can be the Holder or another entity). :::info Note that as you interact with the Axone blockchain, you must pay fees in $AXONE at each transaction. -::: +::: ```bash -okp4d tx wasm execute $CONTRACT_ADDR \ +okp4d tx wasm execute $CONTRACT_ADDR \ --node "https://api.drunemeton.okp4.network:443/rpc" \ - --chain-id okp4-drunemeton-1 \ - --from $MY_ADDR \ + --chain-id okp4-drunemeton-1 \ + --from $MY_ADDR \ --keyring-backend test --gas 10000000 \ "{\"submit_claims\":{\"metadata\": \"$(cat $MY-DATASET.nq | base64)\"}}" ``` @@ -242,34 +243,36 @@ With: - `CONTRACT_ADDR` : dataverse contract address (always the same) - For the Drunemeton testnet use okp418cszlvm6pze0x9sz32qnjq4vtd45xehqs8dq7cwy8yhq35wfnn3qvya8du - `node "https://api.drunemeton.okp4.network:443/rpc"` : name of the node for the Drunemeton testnet -- `MY_ADDR` : registrant okp4 address -- `$MY-DATASET.nq` : name of the file with the signed credential in RDF format +- `MY_ADDR` : registrant okp4 address +- `$MY-DATASET.nq` : name of the file with the signed credential in RDF format -Example: -```bash +Example: + +````bash okp4d tx wasm execute okp418cszlvm6pze0x9sz32qnjq4vtd45xehqs8dq7cwy8yhq35wfnn3qvya8du \ --node "https://api.drunemeton.okp4.network:443/rpc" \ --chain-id okp4-drunemeton-1 \ --from issuer-okp4 \ - --keyring-backend test + --keyring-backend test --gas 10000000 "{\"submit_claims\":{\"metadata\": \"$(cat collab-ai-zone-description.nq | base64)\"}}" ``` -The Protocol will check the signature and if the public key corresponds to the proof in the VC, the VC is registered in the smart contract (Cognitarium). +The Protocol will check the signature and if the public key corresponds to the proof in the VC, the VC is registered in the smart contract (Cognitarium). -The command returns the hash of the transaction. You can find more details of this transaction in the [Explorer](https://explore.okp4.network/). Select the network (Currently Drunemeton-Testnet), click on the Search icon, and paste the transaction hash. +The command returns the hash of the transaction. You can find more details of this transaction in the [Explorer](https://explore.okp4.network/). Select the network (Currently Drunemeton-Testnet), click on the Search icon, and paste the transaction hash. Example: Hash: 213CE6A476776392625981A071E36DD295B1F0BB95F4A29DFCDA8B1F59C9282D
Axone explorer -
+


:::warning -Remember, the Resource Governance VC ensures the existence of a resource in the protocol: a resource or zone exists in the protocol only if governance is attached to it. Let's do it on the next page. +Remember, the Resource Governance VC ensures the existence of a resource in the protocol: a resource or zone exists in the protocol only if governance is attached to it. Let's do it on the next page. ::: +```` diff --git a/docs/technical-documentation/technical-implementation/resource-governance.mdx b/docs/technical-documentation/technical-implementation/resource-governance.mdx index 163233c7196..a10496e4064 100644 --- a/docs/technical-documentation/technical-implementation/resource-governance.mdx +++ b/docs/technical-documentation/technical-implementation/resource-governance.mdx @@ -4,10 +4,8 @@ sidebar_position: 4 # Create the resource's governance -Reading time: {readingTime} min - :::info -We recommend you first read the [Technical documentation of Governance](https://docs.okp4.network/technical-documentation/governance/introduction) before delving into practice in the Academy. +We recommend you first read the [Technical documentation of Governance](https://docs.okp4.network/technical-documentation/governance/introduction) before delving into practice in the Academy. ::: Resource Consent is an agreement associated with the use of Resources within Zones. By resources, we mean Digital Resources (e.g., datasets) or Digital Services. It goes beyond simple approval and encompasses the permissions and restrictions on resource owners' access, usage, sharing, management, and handling of their resources. It allows parties to define boundaries and establish terms for others to interact with their digital resources. This is crucial for governance, ensuring resources are used appropriately per the relevant parties' expressed will and intentions. @@ -23,34 +21,45 @@ In the protocol, governance structures are made up of two key elements: - A **VP** serves as proof of the existence of a governance by referencing the Codified Governance. This document plays a fundamental role in creating a resource within the dataverse. - **Governance as Code** is represented by a program written in Prolog. This program details and encodes the specific rules governing resource management. -
- Governance elements for Resources in Axone Protocol +
+ Governance elements for Resources in Axone Protocol
Here are the five steps to create the governance of a resource in the Dataverse: -
- Steps to create a resource's governance +
+ Steps to create a resource's governance
-We'll take 2 simple examples in this tutorial: +We'll take 2 simple examples in this tutorial: - The dataset [Crime Data from 2020 to Present](https://data.lacity.org/Public-Safety/Crime-Data-from-2020-to-Present/2nrs-mtv8/about_data) - The storage service [IPFS](https://ipfs.tech) :::info -Prerequisite: +Prerequisite: + - [Install the Axone CLI](https://docs.okp4.network/tutorials/cli-1#installing-the-okp4-cli) to interact with the protocol - Ensure you have `npm` installed on your system. You can follow the installation guide [here](https://www.npmjs.com/get-npm). - Install the [json-cli](https://github.com/digitalbazaar/jsonld-cli) with the following command: + ```bash npm install -g jsonld-cli ``` + ::: -## Step 1: Define the governance of your resource +## Step 1: Define the governance of your resource -First, you need to define the governance rules of your resource. +First, you need to define the governance rules of your resource. The governance content is systematically arranged into a hierarchical text structure comprising sections, articles, and paragraphs. - **chapter**: This term represents a major division in structuring rules, similar to a chapter in a legislative text. It is used to group together articles dealing with related subjects or falling within the same thematic area. @@ -58,43 +67,43 @@ The governance content is systematically arranged into a hierarchical text struc - **article**: The article is the basic unit in the formulation of rules. Each article sets out a specific rule or set of rules and is identified by a unique number or title for ease of reference. - **paragraph**: The paragraph is the element that contains the text of the rule itself. This translates into a clause defining a specific condition or rule in Prolog. -You can use a template (coming soon) or begin from scratch. +You can use a template (coming soon) or begin from scratch. -Governance rules of the dataset Crime Data from 2020 to Present: +Governance rules of the dataset Crime Data from 2020 to Present: -| Division | Ordinal number | Title | -|------------|----------------|------------------------------------------------------| -| Chapter | 1 | Crime data dataset governance | -| Section | 1.1 | Usage of the dataset | -| Article | 1.1.1 | Conditions on consumers | -| Paragraph | 1.1.1.1 | Everyone can use the dataset | -| Article | 1.1.2 | Conditions on services that consume the dataset | -| Paragraph | 1.1.2.1 | Only services of type "Storage" or "Data Processing" | -| Section | 1.2 | Conditions of usages | -| Article | 1.2.1 | Price | -| Paragraph | 1.2.1.1 | Free | -| Article | 1.2.2 | Rate limiting | -| Paragraph | 1.2.2.1 | The rate limit is 2 months maximum | +| Division | Ordinal number | Title | +| --------- | -------------- | ---------------------------------------------------- | +| Chapter | 1 | Crime data dataset governance | +| Section | 1.1 | Usage of the dataset | +| Article | 1.1.1 | Conditions on consumers | +| Paragraph | 1.1.1.1 | Everyone can use the dataset | +| Article | 1.1.2 | Conditions on services that consume the dataset | +| Paragraph | 1.1.2.1 | Only services of type "Storage" or "Data Processing" | +| Section | 1.2 | Conditions of usages | +| Article | 1.2.1 | Price | +| Paragraph | 1.2.1.1 | Free | +| Article | 1.2.2 | Rate limiting | +| Paragraph | 1.2.2.1 | The rate limit is 2 months maximum | Governance rules of the service IPFS: -| Division | Ordinal number | Title | -|-------------|----------------|------------------------------| -| Chapter | 1 | IPFS governance | -| Section | 1.1 | Usage of the dataset | -| Article | 1.1.1 | Conditions on consumers | -| Paragraph | 1.1.1.1 | Everyone can use the dataset | -| Section | 1.2 | Conditions of usages | -| Article | 1.2.1 | Price | -| Paragraph | 1.2.1.1 | Free | +| Division | Ordinal number | Title | +| --------- | -------------- | ---------------------------- | +| Chapter | 1 | IPFS governance | +| Section | 1.1 | Usage of the dataset | +| Article | 1.1.1 | Conditions on consumers | +| Paragraph | 1.1.1.1 | Everyone can use the dataset | +| Section | 1.2 | Conditions of usages | +| Article | 1.2.1 | Price | +| Paragraph | 1.2.1.1 | Free | :::info -The Axone Community will provide more and more templates over time. +The Axone Community will provide more and more templates over time. ::: -## Step 2: Create the Prolog program +## Step 2: Create the Prolog program -### Introduction +### Introduction Codified Governance is based on the principles of Rules as Code (RaC), a powerful and innovative approach that reinvents a fundamental aspect of governance: the formulation of rules. This concept suggests that governance bodies implement official versions of rules (such as regulations) in a format that can be interpreted by both machines and humans. @@ -104,7 +113,7 @@ In the context of the protocol, it enables autonomous and decentralized interpre ### The elements of law -Several terminological elements are essential when expressing legal terms in Prolog for the construction of governance rules. These elements provide a structured framework, mirroring traditional legal documents, and facilitate the precise encoding of legal concepts and rules in the Prolog programming environment. +Several terminological elements are essential when expressing legal terms in Prolog for the construction of governance rules. These elements provide a structured framework, mirroring traditional legal documents, and facilitate the precise encoding of legal concepts and rules in the Prolog programming environment. #### Hierarchical elements @@ -119,7 +128,7 @@ article(ArticleId). paragraph(ParagraphId, ...). ``` -To maintain the link between the different hierarchical elements, the binary predicate `partOf/2` is added to the system. +To maintain the link between the different hierarchical elements, the binary predicate `partOf/2` is added to the system. For example: @@ -138,8 +147,12 @@ partOf(art1, sec1). partOf(sec1, chap1). ``` -
- Governance elements for Resources in Axone Protocol +
+ Governance elements for Resources in Axone Protocol
#### Elements of description @@ -170,8 +183,8 @@ where - `ParagraphId` is the unique identifier of the paragraph. - `Modality` designates the modality, the interpretation under which the rule is to be considered. The possible values are: - - `permitted`: This modality expresses formal permission relating to the specified action, depending on the particular conditions or context taken into account. It is relevant to conditional clauses, highlighting situations where the action is explicitly permitted. - - `prohibited`: This modality expresses an explicit prohibition linked to the action mentioned, applicable in the specific context considered. It is also relevant for conditional clauses, marking circumstances where the action is formally prohibited. + - `permitted`: This modality expresses formal permission relating to the specified action, depending on the particular conditions or context taken into account. It is relevant to conditional clauses, highlighting situations where the action is explicitly permitted. + - `prohibited`: This modality expresses an explicit prohibition linked to the action mentioned, applicable in the specific context considered. It is also relevant for conditional clauses, marking circumstances where the action is formally prohibited. #### Elements of context @@ -206,13 +219,14 @@ For a given standard, if an action is neither prohibited nor permitted by any ru **Priority principle** For two standards under consideration, providing 2 different verdicts, the following priority principle is applied: -- *prohibited* over *permitted*: If an action is both prohibited by one rule and permitted by another, the prohibition rule prevails. -- *prohibited* over *unregulated*: If a rule prohibits an action, the prohibition prevails, regardless of whether other rules are neutral in this respect. -- *permitted* over *unregulated*: If an action is explicitly permitted by a rule, this permission prevails over the absence of any indication (unregulated) in other rules. + +- _prohibited_ over _permitted_: If an action is both prohibited by one rule and permitted by another, the prohibition rule prevails. +- _prohibited_ over _unregulated_: If a rule prohibits an action, the prohibition prevails, regardless of whether other rules are neutral in this respect. +- _permitted_ over _unregulated_: If an action is explicitly permitted by a rule, this permission prevails over the absence of any indication (unregulated) in other rules. ### Examples -Here is an example of the consent attached to the Crime dataset: +Here is an example of the consent attached to the Crime dataset: ```prolog :- discontiguous([title/2,partOf/2,chapter/1,section/1,article/1,paragraph/2]). @@ -233,7 +247,7 @@ chapter('chap1'). Create a Prolog file `my-resource-governance.pl` with the governance of your resource. -Create a specific smart contrat Law Stone for your governance. +Create a specific smart contrat Law Stone for your governance. ```bash okp4d tx wasm instantiate 2 --label $UNIQUE_LABEL \ @@ -250,11 +264,12 @@ With: - `$UNIQUE_LABEL` : name of the smart contract. It must be unique. You can use a UUID. - `CONTRACT_ADDR` : Cognitarium contract address (always the same) okp41suhgf5svhu4usrurvxzlgn54ksxmn8gljarjtxqnapv8kjnp4nrscr7uaj -- from `$WALLET` : registrant okp4 address -- admin `$WALLET` : okp4 address which is allowed to update the contract -- `$MY-GOVERNANCE.pl` : Prolog file of the governance +- from `$WALLET` : registrant okp4 address +- admin `$WALLET` : okp4 address which is allowed to update the contract +- `$MY-GOVERNANCE.pl` : Prolog file of the governance Example: + ```bash okp4d tx wasm instantiate 2 --label fea0312a-f4bb-449c-a736-7a16e7cc94c1 \ --node "https://api.drunemeton.okp4.network:443/rpc" \ @@ -268,7 +283,7 @@ okp4d tx wasm instantiate 2 --label fea0312a-f4bb-449c-a736-7a16e7cc94c1 \ txhash: 59AB4A2A7AD238AD55F75D5CB9B576FF92DDE39F1509442A74E6556A612591A6 -Then you need to find the contract address which is necessary for the next step. You can use the following command: +Then you need to find the contract address which is necessary for the next step. You can use the following command: ```bash okp4d --node "https://api.drunemeton.okp4.network:443/rpc" query tx $TX_HASH @@ -279,13 +294,15 @@ With: - `$TX_HASH`: The hash of the transaction which instantiates the smart contract Example: + ```bash okp4d --node "https://api.drunemeton.okp4.network:443/rpc" query tx 59AB4A2A7AD238AD55F75D5CB9B576FF92DDE39F1509442A74E6556A612591A6 ``` Find the contract address in the transactions information: -Example: +Example: + ```bash - attributes: - index: true @@ -307,121 +324,121 @@ This bimodal approach not only guarantees the clarity and accessibility of the g Governance VPs play an essential role in the dataverse, applying universally to various categories of resources, such as datasets, services, and [zones](/academy/part-2/zone-governance). -Instantiate the template [credential-governance-text](https://github.com/okp4/ontology/blob/main/src/example/governance/crime-dataset-governance.jsonld). +Instantiate the template [credential-governance-text](https://github.com/okp4/ontology/blob/main/src/example/governance/crime-dataset-governance.jsonld). -Fill in the template with the elements you [precedently defined](#step-1-define-the-governance-of-your-resource). +Fill in the template with the elements you [precedently defined](#step-1-define-the-governance-of-your-resource). The following code specifies that the Crime Dataset whose DID is `` has a governance system that is described by the prolog program `` for which a text description is also provided. ```json { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://w3id.org/okp4/ontology/v3/schema/credential/governance/text/" - ], - "type": ["VerifiableCredential","GovernanceTextCredential"], - "id": "https://w3id.org/okp4/ontology/v3/schema/credential/governance/text/hfk0312a-f4bb-449c-a736-7a16e7cc94c1", - "credentialSubject": { - "id": "did:key:zQ3shRfADCmegmmKotqCjzDc9BHWDpbEzp9yMiN5RkJx88oP5", - "isGovernedBy": { - "type": "GovernanceText", - "fromGovernance": "cosmwasm:law-stone:okp41z7asfxkwv0t863rllul570eh5pf2zk07k3d86ag4vtghaue37l5sa62rrk?query=%22program_code%22", - "hasChapter": { - "type": "Chapter", - "hasTitle": "Crime data dataset governance", - "hasOrdinalNumber": "1", - "hasSection": { - "type": "Section", - "hasTitle": "Usage of the dataset", - "hasOrdinalNumber": "1.1", - "hasArticle": { - "type": "Article", - "hasTitle": "Conditions on consumers", - "hasOrdinalNumber": "1.1.1", - "hasParagraph": { - "type": "Paragraph", - "hasTitle": "Everyone can use the dataset", - "hasOrdinalNumber": "1.1.1.1" - } - }, - "hasArticle": { - "type": "Article", - "hasTitle": "Conditions on services that consume the dataset", - "hasOrdinalNumber": "1.1.2", - "hasParagraph": { - "type": "Paragraph", - "hasTitle": "Only services of type 'Storage' or 'Data Processing'", - "hasOrdinalNumber": "1.1.2.1" - } - } - }, - "hasSection": { - "type": "Section", - "hasTitle": "Conditions of usages", - "hasOrdinalNumber": "1.2", - "hasArticle": { - "type": "Article", - "hasTitle": "Price", - "hasOrdinalNumber": "1.2.1", - "hasParagraph": { - "type": "Paragraph", - "hasTitle": "Free", - "hasOrdinalNumber": "1.2.1.1" - } - }, - "hasArticle": { - "type": "Article", - "hasTitle": "Rate limiting", - "hasOrdinalNumber": "1.2.2", - "hasParagraph": { - "type": "Paragraph", - "hasTitle": "The rate limit is 2 months maximum", - "hasOrdinalNumber": "1.2.2.1" - } - } - } + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://w3id.org/okp4/ontology/v3/schema/credential/governance/text/" + ], + "type": ["VerifiableCredential", "GovernanceTextCredential"], + "id": "https://w3id.org/okp4/ontology/v3/schema/credential/governance/text/hfk0312a-f4bb-449c-a736-7a16e7cc94c1", + "credentialSubject": { + "id": "did:key:zQ3shRfADCmegmmKotqCjzDc9BHWDpbEzp9yMiN5RkJx88oP5", + "isGovernedBy": { + "type": "GovernanceText", + "fromGovernance": "cosmwasm:law-stone:okp41z7asfxkwv0t863rllul570eh5pf2zk07k3d86ag4vtghaue37l5sa62rrk?query=%22program_code%22", + "hasChapter": { + "type": "Chapter", + "hasTitle": "Crime data dataset governance", + "hasOrdinalNumber": "1", + "hasSection": { + "type": "Section", + "hasTitle": "Usage of the dataset", + "hasOrdinalNumber": "1.1", + "hasArticle": { + "type": "Article", + "hasTitle": "Conditions on consumers", + "hasOrdinalNumber": "1.1.1", + "hasParagraph": { + "type": "Paragraph", + "hasTitle": "Everyone can use the dataset", + "hasOrdinalNumber": "1.1.1.1" } + }, + "hasArticle": { + "type": "Article", + "hasTitle": "Conditions on services that consume the dataset", + "hasOrdinalNumber": "1.1.2", + "hasParagraph": { + "type": "Paragraph", + "hasTitle": "Only services of type 'Storage' or 'Data Processing'", + "hasOrdinalNumber": "1.1.2.1" + } + } + }, + "hasSection": { + "type": "Section", + "hasTitle": "Conditions of usages", + "hasOrdinalNumber": "1.2", + "hasArticle": { + "type": "Article", + "hasTitle": "Price", + "hasOrdinalNumber": "1.2.1", + "hasParagraph": { + "type": "Paragraph", + "hasTitle": "Free", + "hasOrdinalNumber": "1.2.1.1" + } + }, + "hasArticle": { + "type": "Article", + "hasTitle": "Rate limiting", + "hasOrdinalNumber": "1.2.2", + "hasParagraph": { + "type": "Paragraph", + "hasTitle": "The rate limit is 2 months maximum", + "hasOrdinalNumber": "1.2.2.1" + } + } } - }, - "issuanceDate": "2024-02-06T13:29:00.475304+01:00", - "issuer": { - "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3", - "name": "OKP4" + } } + }, + "issuanceDate": "2024-02-06T13:29:00.475304+01:00", + "issuer": { + "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3", + "name": "OKP4" + } } ``` ## Step 5: Sign and register in the Blockchain -Now that you have created the VC, you will sign it. +Now that you have created the VC, you will sign it. Signing a verifiable credential involves creating a digital signature using cryptographic techniques. This signature is unique to both the document (in this case, the credential) and the signer's private key, making it nearly impossible to forge. The private key is kept secret by the signer, while the corresponding public key is made available for anyone wishing to verify the signature's authenticity. By signing the credential, any alteration to the credential's data after it has been signed will invalidate the signature. This ensures the data has not been tampered with and remains as it was when issued. -To sign your VC, use this command: +To sign your VC, use this command: ```bash -okp4d credential sign $/MY-DIRECTORY/MY-DATASET.jsonld - --keyring-backend test +okp4d credential sign $/MY-DIRECTORY/MY-DATASET.jsonld + --keyring-backend test --from $MY_ADDR | jsonld toRdf -q - > $MY-DATASET.nq ``` With: -- `/MY-DIRECTORY/MY-DATASET.jsonld` : credential file address -- `MY_ADDR` : issuer address +- `/MY-DIRECTORY/MY-DATASET.jsonld` : credential file address +- `MY_ADDR` : issuer address - `MY-DATASET.nq` : name of the file with the signed credential in RDF format -Example: +Example: ```bash -okp4d credential sign crime-dataset-governance.jsonld - --from issuer-okp4 +okp4d credential sign crime-dataset-governance.jsonld + --from issuer-okp4 --keyring-backend test | jsonld toRdf -q - > crime-dataset-governance.nq ``` -You can see that there is new fields in the jsonld with the cryptographic proof. +You can see that there is new fields in the jsonld with the cryptographic proof. ```nquads _:b2 . @@ -448,21 +465,21 @@ _:b4 "Usage of the dataset" . ``` -The VC is now in the hands of the Holder. Note that it is possible that the Issuer is also the Holder. +The VC is now in the hands of the Holder. Note that it is possible that the Issuer is also the Holder. -The Axone blockchain can only register VCs in N-Quads format. +The Axone blockchain can only register VCs in N-Quads format. -The final step is to register the VCs in the Axone blockchain by submitting them to the Dataverse smart contract. It's the role of the Registrant (who can be the Holder or another entity). +The final step is to register the VCs in the Axone blockchain by submitting them to the Dataverse smart contract. It's the role of the Registrant (who can be the Holder or another entity). :::info Note that as you interact with the Axone blockchain, you must pay fees in $AXONE at each transaction. -::: +::: ```bash -okp4d tx wasm execute $CONTRACT_ADDR \ +okp4d tx wasm execute $CONTRACT_ADDR \ --node "https://api.drunemeton.okp4.network:443/rpc" \ - --chain-id okp4-drunemeton-1 \ - --from $MY_ADDR \ + --chain-id okp4-drunemeton-1 \ + --from $MY_ADDR \ --keyring-backend test --gas 10000000 \ "{\"submit_claims\":{\"metadata\": \"$(cat $MY-DATASET.nq | base64)\"}}" ``` @@ -471,29 +488,30 @@ With: - `CONTRACT_ADDR` : dataverse contract address (always the same) - For the Drunemeton testnet use okp418cszlvm6pze0x9sz32qnjq4vtd45xehqs8dq7cwy8yhq35wfnn3qvya8du - `node "https://api.drunemeton.okp4.network:443/rpc"` : name of the node for the Drunemeton testnet -- `MY_ADDR` : registrant okp4 address -- `$MY-DATASET.nq` : name of the file with the signed credential in RDF format +- `MY_ADDR` : registrant okp4 address +- `$MY-DATASET.nq` : name of the file with the signed credential in RDF format -Example: -```bash +Example: + +````bash okp4d tx wasm execute okp418cszlvm6pze0x9sz32qnjq4vtd45xehqs8dq7cwy8yhq35wfnn3qvya8du \ --node "https://api.drunemeton.okp4.network:443/rpc" \ --chain-id okp4-drunemeton-1 \ --from issuer-okp4 \ - --keyring-backend test + --keyring-backend test --gas 10000000 "{\"submit_claims\":{\"metadata\": \"$(cat crime-dataset-governance.nq | base64)\"}}" ``` -The Protocol will check the signature and if the public key corresponds to the proof in the VC, the VC is registered in the smart contract (Cognitarium). +The Protocol will check the signature and if the public key corresponds to the proof in the VC, the VC is registered in the smart contract (Cognitarium). -The command returns the hash of the transaction. You can find more details of this transaction in the [Explorer](https://explore.okp4.network/). Select the network (Currently Drunemeton-Testnet), click on the Search icon, and paste the transaction hash. +The command returns the hash of the transaction. You can find more details of this transaction in the [Explorer](https://explore.okp4.network/). Select the network (Currently Drunemeton-Testnet), click on the Search icon, and paste the transaction hash. Example: Hash: 4192587E13FF1A1530B0FFE88A80EACE4954374AE9A2789462E0372CC49E1A47
Axone explorer -
+
## Delete a resource in the Dataverse @@ -504,3 +522,4 @@ It is essential to stress the primacy of governance in this context. Suppose the VPs can be issued with predefined validity periods. When these durations expire, the VPs concerned are automatically revoked, rendering them null and void. This feature is crucial for managing situations where a resource becomes obsolete or loses relevance. When the governance VP expires, the resource concerned is nullified in the dataverse. As a result, the resource loses its recognition and validity within the system, rendering it unusable and unreferenced. In this context, it is essential to highlight the principle that governance does not have absolute primacy: governance regulations cannot prevent resource revocation. Indeed, the decision to revoke a resource falls exclusively within the authority of the entity that issued the resource's initial governance VP. However, extending these expirations through a governance amendment process is possible following the terms established by the governance itself. +```` diff --git a/docs/technical-documentation/technical-implementation/verifiable-claims.mdx b/docs/technical-documentation/technical-implementation/verifiable-claims.mdx index 54dfae91f87..58085632cb3 100644 --- a/docs/technical-documentation/technical-implementation/verifiable-claims.mdx +++ b/docs/technical-documentation/technical-implementation/verifiable-claims.mdx @@ -2,13 +2,11 @@ sidebar_position: 2 --- -import Quiz from 'react-quiz-component'; -import * as quiz from './verifiable-claims-quiz.json'; +import Quiz from 'react-quiz-component' +import * as quiz from './verifiable-claims-quiz.json' # Verifiable Claims Principles -Reading time: {readingTime} min - **Verifiable Credentials** are a key concept in the world of digital identity, particularly in decentralized identity systems. A Verifiable Credential is a form of digital evidence that attests to information or a characteristic about a person, organization, or object. A trusted entity that issues these credentials is called the **Issuer**. ## Verifiable Credentials and claims @@ -21,8 +19,12 @@ A credential may contain several claims. For example, a diploma contains the cla In the [W3C standard](https://www.w3.org/TR/vc-data-model/), a credential is a set of one or more **claims** made by the same entity. Credentials include an identifier and metadata describing the credential's properties, such as the issuer, the expiry date and time, a representative image, a public key to use for verification purposes, the revocation mechanism, and so on. The issuer might sign the metadata. A verifiable credential is a set of tamper-evident claims and metadata that cryptographically prove who issued it. -
- Verifiable claims W3C +
+ Verifiable claims W3C
:::info @@ -41,8 +43,12 @@ A **verifiable presentation** is a tamper-evident presentation encoded in such a A government authority issues a digital passport to a citizen. -
- Verifiable claims passport example +
+ Verifiable claims passport example
Use when traveling : @@ -64,8 +70,12 @@ This notion is analogous to that of cryptocurrency wallets. Although all address Verifiable Credentials obey schemas that describe a particular aspect of a resource. Certain VCs apply depending on the nature of the resource. A VC describing an entity or organization does not apply to the same resource as a VC describing a dataset. This is why VCs are organized in schemas. -
- Verifiable claims attached to a resource +
+ Verifiable claims attached to a resource
### Resource materiality @@ -90,8 +100,12 @@ Once the Issuer successfully issues the Verifiable Credentials (VCs) associated Recording VPs in the blockchain, rather than individual VCs, ensures the confidentiality of specific properties by only revealing a restricted set of properties on the public chain. -
- Verifiable presentation W3C +
+ Verifiable presentation W3C
- + diff --git a/docs/technical-documentation/technical-implementation/zone-governance.mdx b/docs/technical-documentation/technical-implementation/zone-governance.mdx index 4308f13e96a..4e299021629 100644 --- a/docs/technical-documentation/technical-implementation/zone-governance.mdx +++ b/docs/technical-documentation/technical-implementation/zone-governance.mdx @@ -4,10 +4,8 @@ sidebar_position: 6 # Create the zone's governance -Reading time: {readingTime} min - :::info -We recommend you first read the [Technical documentation of Governance](https://docs.okp4.network/technical-documentation/governance/introduction) before delving into practice in the Academy. +We recommend you first read the [Technical documentation of Governance](https://docs.okp4.network/technical-documentation/governance/introduction) before delving into practice in the Academy. ::: Zone Rules establish the boundaries of a specific area in the Dataverse, termed a Zone, within which governance is enforced. Each Zone is governed by its unique set of Rules tailored to its particular function or purpose. @@ -23,31 +21,42 @@ In the protocol, governance structures are made up of two key elements: - A **VP** serves as proof of the existence of a governance by referencing the Codified Governance. This document plays a fundamental role in creating a zone within the dataverse. - **Governance as Code** is represented by a program written in Prolog. This program details and encodes the specific rules governing zone management. -
- Governance elements for Zone in Axone Protocol +
+ Governance elements for Zone in Axone Protocol
Here are the five steps to create a zone governance in the Dataverse: -
- Steps to create a zone's governance +
+ Steps to create a zone's governance
-We'll take one simple example in this tutorial for the Collaborative AI zone. +We'll take one simple example in this tutorial for the Collaborative AI zone. :::info -Prerequisite: +Prerequisite: + - [Install the Axone CLI](https://docs.okp4.network/tutorials/cli-1#installing-the-okp4-cli) to interact with the protocol - Ensure you have `npm` installed on your system. You can follow the installation guide [here](https://www.npmjs.com/get-npm). - Install the [json-cli](https://github.com/digitalbazaar/jsonld-cli) with the following command: + ```bash npm install -g jsonld-cli ``` + ::: -## Step 1: Define the governance of your zone +## Step 1: Define the governance of your zone -First, you need to define the governance rules of your zone. +First, you need to define the governance rules of your zone. The governance content is systematically arranged into a hierarchical text structure comprising sections, articles, and paragraphs. - **chapter**: This term represents a major division in structuring rules, similar to a chapter in a legislative text. It is used to group together articles dealing with related subjects or falling within the same thematic area. @@ -55,27 +64,26 @@ The governance content is systematically arranged into a hierarchical text struc - **article**: The article is the basic unit in the formulation of rules. Each article sets out a specific rule or set of rules and is identified by a unique number or title for ease of reference. - **paragraph**: The paragraph is the element that contains the text of the rule itself. This translates into a clause defining a specific condition or rule in Prolog. -You can use a template (coming soon) or begin from scratch. - -Governance rules of the Collaborative AI zone: +You can use a template (coming soon) or begin from scratch. -| Division | Ordinal number | Title | -|-------------|----------------|------------------------------------------------------| -| Chapter | 1 | Collaborative AI zone | -| Section | 1.1 | Zone Governance | -| Article | 1.1.1 | Conditions to amend the rules | -| Paragraph | 1.1.1.1 | Governance can only be amended by the identity `did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3`| -| Article | 1.1.2 | Conditions on authorized services | -| Paragraph | 1.1.1.1 | Only services of type 'Storage' or 'Machine Learning'| +Governance rules of the Collaborative AI zone: +| Division | Ordinal number | Title | +| --------- | -------------- | ---------------------------------------------------------------------------------------------------------- | +| Chapter | 1 | Collaborative AI zone | +| Section | 1.1 | Zone Governance | +| Article | 1.1.1 | Conditions to amend the rules | +| Paragraph | 1.1.1.1 | Governance can only be amended by the identity `did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3` | +| Article | 1.1.2 | Conditions on authorized services | +| Paragraph | 1.1.1.1 | Only services of type 'Storage' or 'Machine Learning' | :::info -The Axone Community will provide more and more templates over time. +The Axone Community will provide more and more templates over time. ::: -## Step 2: Create the Prolog program +## Step 2: Create the Prolog program -### Introduction +### Introduction Codified Governance is based on the principles of Rules as Code (RaC), a powerful and innovative approach that reinvents a fundamental aspect of governance: the formulation of rules. This concept suggests that governance bodies implement official versions of rules (such as regulations) in a format that can be interpreted by both machines and humans. @@ -85,7 +93,7 @@ In the context of the protocol, it enables autonomous and decentralized interpre ### The elements of law -Several terminological elements are essential when expressing legal terms in Prolog for the construction of governance rules. These elements provide a structured framework, mirroring traditional legal documents, and facilitate the precise encoding of legal concepts and rules in the Prolog programming environment. +Several terminological elements are essential when expressing legal terms in Prolog for the construction of governance rules. These elements provide a structured framework, mirroring traditional legal documents, and facilitate the precise encoding of legal concepts and rules in the Prolog programming environment. #### Hierarchical elements @@ -100,7 +108,7 @@ article(ArticleId). paragraph(ParagraphId, ...). ``` -To maintain the link between the different hierarchical elements, the binary predicate `partOf/2` is added to the system. +To maintain the link between the different hierarchical elements, the binary predicate `partOf/2` is added to the system. For example: @@ -119,8 +127,12 @@ partOf(art1, sec1). partOf(sec1, chap1). ``` -
- Governance elements for Resources in Axone Protocol +
+ Governance elements for Resources in Axone Protocol
#### Elements of description @@ -151,8 +163,8 @@ where - `ParagraphId` is the unique identifier of the paragraph. - `Modality` designates the modality, the interpretation under which the rule is to be considered. The possible values are: - - `permitted`: This modality expresses formal permission relating to the specified action, depending on the particular conditions or context taken into account. It is relevant to conditional clauses, highlighting situations where the action is explicitly permitted. - - `prohibited`: This modality expresses an explicit prohibition linked to the action mentioned, applicable in the specific context considered. It is also relevant for conditional clauses, marking circumstances where the action is formally prohibited. + - `permitted`: This modality expresses formal permission relating to the specified action, depending on the particular conditions or context taken into account. It is relevant to conditional clauses, highlighting situations where the action is explicitly permitted. + - `prohibited`: This modality expresses an explicit prohibition linked to the action mentioned, applicable in the specific context considered. It is also relevant for conditional clauses, marking circumstances where the action is formally prohibited. #### Elements of context @@ -187,13 +199,14 @@ For a given standard, if an action is neither prohibited nor permitted by any ru **Priority principle** For two standards under consideration, providing 2 different verdicts, the following priority principle is applied: -- *prohibited* over *permitted*: If an action is both prohibited by one rule and permitted by another, the prohibition rule prevails. -- *prohibited* over *unregulated*: If a rule prohibits an action, the prohibition prevails, regardless of whether other rules are neutral in this respect. -- *permitted* over *unregulated*: If an action is explicitly permitted by a rule, this permission prevails over the absence of any indication (unregulated) in other rules. + +- _prohibited_ over _permitted_: If an action is both prohibited by one rule and permitted by another, the prohibition rule prevails. +- _prohibited_ over _unregulated_: If a rule prohibits an action, the prohibition prevails, regardless of whether other rules are neutral in this respect. +- _permitted_ over _unregulated_: If an action is explicitly permitted by a rule, this permission prevails over the absence of any indication (unregulated) in other rules. ### Examples -Here is an example of the governance of Collaborative AI zone: +Here is an example of the governance of Collaborative AI zone: ```prolog :- discontiguous([title/2,partOf/2,chapter/1,section/1,article/1,paragraph/2]). @@ -215,7 +228,7 @@ chapter('chap1'). Create a Prolog file `my-zone-governance.pl` with the governance of your zone. -Create a specific smart contrat Law Stone for your governance. +Create a specific smart contrat Law Stone for your governance. ```bash okp4d tx wasm instantiate 2 --label $UNIQUE_LABEL \ @@ -232,11 +245,12 @@ With: - `$UNIQUE_LABEL` : name of the smart contract. It must be unique. You can use a UUID. - `CONTRACT_ADDR` : Cognitarium contract address (always the same) okp41suhgf5svhu4usrurvxzlgn54ksxmn8gljarjtxqnapv8kjnp4nrscr7uaj -- from `$WALLET` : registrant okp4 address -- admin `$WALLET` : okp4 address which is allowed to update the contract -- `$MY-GOVERNANCE.pl` : Prolog file of the governance +- from `$WALLET` : registrant okp4 address +- admin `$WALLET` : okp4 address which is allowed to update the contract +- `$MY-GOVERNANCE.pl` : Prolog file of the governance Example: + ```bash okp4d tx wasm instantiate 2 --label 4e2e5526-5ce0-41b9-b1ea-a4a3b595a0ae \ --node "https://api.drunemeton.okp4.network:443/rpc" \ @@ -250,7 +264,7 @@ okp4d tx wasm instantiate 2 --label 4e2e5526-5ce0-41b9-b1ea-a4a3b595a0ae \ txhash: 19DA088BC86BFCFAB34846D44024464BDADF71B74EEB1C68AC7634DE393B043B -Then you need to find the contract address which is necessary for the next step. You can use the following command: +Then you need to find the contract address which is necessary for the next step. You can use the following command: ```bash okp4d --node "https://api.drunemeton.okp4.network:443/rpc" query tx $TX_HASH @@ -261,13 +275,15 @@ With: - `$TX_HASH`: The hash of the transaction which instantiates the smart contract Example: + ```bash okp4d --node "https://api.drunemeton.okp4.network:443/rpc" query tx 19DA088BC86BFCFAB34846D44024464BDADF71B74EEB1C68AC7634DE393B043B ``` Find the contract address in the transactions information: -Example: +Example: + ```bash - attributes: - index: true @@ -289,124 +305,121 @@ This bimodal approach not only guarantees the clarity and accessibility of the g Governance VPs play an essential role in the dataverse, applying universally to various categories of resources, such as datasets, services, and [zones](/academy/part-2/zone-governance). -Instantiate the template [credential-governance-text](https://github.com/okp4/ontology/blob/main/src/example/governance/crime-dataset-governance.jsonld). +Instantiate the template [credential-governance-text](https://github.com/okp4/ontology/blob/main/src/example/governance/crime-dataset-governance.jsonld). -Fill in the template with the elements you [precedently defined](#step-1-define-the-governance-of-your-zone). +Fill in the template with the elements you [precedently defined](#step-1-define-the-governance-of-your-zone). The following code specifies that the Crime Dataset whose DID is `` has a governance system that is described by the prolog program `` for which a text description is also provided. ```json { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://w3id.org/okp4/ontology/v3/schema/credential/governance/text/" - ], - "type": [ - "VerifiableCredential", - "GovernanceTextCredential" - ], - "id": "https://w3id.org/okp4/ontology/v3/schema/credential/governance/text/5f2e5526-5ce0-41b9-b1ea-a4a3b595a0ae", - "credentialSubject": { - "id": "did:key:zQ3shunN7us5oKNYKKzprW8nP5HAoTf4t2Fxyudho5zMAR1PQ", - "isGovernedBy": { - "type": "GovernanceText", - "fromGovernance": "cosmwasm:law-stone:okp4182nff4ttmvshn6yjlqj5czapfcav9434l2qzz8aahf5pxnyd33ts6jynpl?query=%22program_code%22", - "hasChapter": { - "type": "Chapter", - "hasTitle": "Collaborative AI governance", - "hasOrdinalNumber": "1", - "hasSection": { - "type": "Section", - "hasTitle": "Zone Governance", - "hasOrdinalNumber": "1.1", - "hasArticle": { - "type": "Article", - "hasTitle": "Conditions to amend the rules", - "hasOrdinalNumber": "1.1.1", - "hasParagraph": { - "type": "Paragraph", - "hasTitle": "Governance can only be amended by the identity `did:key:0x04d1j1x8f8a7a28f9a5a254c326a963a22f5a5b5d5f5e5d5c5b5a5958575758`", - "hasOrdinalNumber": "1.1.1.1" - } - }, - "hasArticle": { - "type": "Article", - "hasTitle": "Conditions on authorized services", - "hasOrdinalNumber": "1.1.2", - "hasParagraph": { - "type": "Paragraph", - "hasTitle": "Only services of type 'Storage' or 'Machine Learning'", - "hasOrdinalNumber": "1.1.2.1" - } - } - }, - "hasSection": { - "type": "Section", - "hasTitle": "Zone Business Model", - "hasOrdinalNumber": "1.2", - "hasArticle": { - "type": "Article", - "hasTitle": "XXXX", - "hasOrdinalNumber": "1.2.1", - "hasParagraph": { - "type": "Paragraph", - "hasTitle": "XXXX", - "hasOrdinalNumber": "1.2.1.1" - } - }, - "hasArticle": { - "type": "Article", - "hasTitle": "XXXX", - "hasOrdinalNumber": "1.2.2", - "hasParagraph": { - "type": "Paragraph", - "hasTitle": "XXXX", - "hasOrdinalNumber": "1.2.2.1" - } - } - } + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://w3id.org/okp4/ontology/v3/schema/credential/governance/text/" + ], + "type": ["VerifiableCredential", "GovernanceTextCredential"], + "id": "https://w3id.org/okp4/ontology/v3/schema/credential/governance/text/5f2e5526-5ce0-41b9-b1ea-a4a3b595a0ae", + "credentialSubject": { + "id": "did:key:zQ3shunN7us5oKNYKKzprW8nP5HAoTf4t2Fxyudho5zMAR1PQ", + "isGovernedBy": { + "type": "GovernanceText", + "fromGovernance": "cosmwasm:law-stone:okp4182nff4ttmvshn6yjlqj5czapfcav9434l2qzz8aahf5pxnyd33ts6jynpl?query=%22program_code%22", + "hasChapter": { + "type": "Chapter", + "hasTitle": "Collaborative AI governance", + "hasOrdinalNumber": "1", + "hasSection": { + "type": "Section", + "hasTitle": "Zone Governance", + "hasOrdinalNumber": "1.1", + "hasArticle": { + "type": "Article", + "hasTitle": "Conditions to amend the rules", + "hasOrdinalNumber": "1.1.1", + "hasParagraph": { + "type": "Paragraph", + "hasTitle": "Governance can only be amended by the identity `did:key:0x04d1j1x8f8a7a28f9a5a254c326a963a22f5a5b5d5f5e5d5c5b5a5958575758`", + "hasOrdinalNumber": "1.1.1.1" } + }, + "hasArticle": { + "type": "Article", + "hasTitle": "Conditions on authorized services", + "hasOrdinalNumber": "1.1.2", + "hasParagraph": { + "type": "Paragraph", + "hasTitle": "Only services of type 'Storage' or 'Machine Learning'", + "hasOrdinalNumber": "1.1.2.1" + } + } + }, + "hasSection": { + "type": "Section", + "hasTitle": "Zone Business Model", + "hasOrdinalNumber": "1.2", + "hasArticle": { + "type": "Article", + "hasTitle": "XXXX", + "hasOrdinalNumber": "1.2.1", + "hasParagraph": { + "type": "Paragraph", + "hasTitle": "XXXX", + "hasOrdinalNumber": "1.2.1.1" + } + }, + "hasArticle": { + "type": "Article", + "hasTitle": "XXXX", + "hasOrdinalNumber": "1.2.2", + "hasParagraph": { + "type": "Paragraph", + "hasTitle": "XXXX", + "hasOrdinalNumber": "1.2.2.1" + } + } } - }, - "issuanceDate": "2024-06-06T15:45:00.475304+01:00", - "issuer": { - "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3", - "name": "OKP4" + } } + }, + "issuanceDate": "2024-06-06T15:45:00.475304+01:00", + "issuer": { + "id": "did:key:zQ3shs7auhJSmVJpiUbQWco6bxxEhSqWnVEPvaBHBRvBKw6Q3", + "name": "OKP4" + } } ``` ## Step 5: Sign and register in the Blockchain -Now that you have created the VC, you will sign it. +Now that you have created the VC, you will sign it. Signing a verifiable credential involves creating a digital signature using cryptographic techniques. This signature is unique to both the document (in this case, the credential) and the signer's private key, making it nearly impossible to forge. The private key is kept secret by the signer, while the corresponding public key is made available for anyone wishing to verify the signature's authenticity. By signing the credential, any alteration to the credential's data after it has been signed will invalidate the signature. This ensures the data has not been tampered with and remains as it was when issued. -To sign your VC, use this command: +To sign your VC, use this command: ```bash -okp4d credential sign $/MY-DIRECTORY/MY-DATASET.jsonld - --keyring-backend test +okp4d credential sign $/MY-DIRECTORY/MY-DATASET.jsonld + --keyring-backend test --from $MY_ADDR | jsonld toRdf -q - > $MY-DATASET.nq ``` With: -- `/MY-DIRECTORY/MY-DATASET.jsonld` : credential file address -- `MY_ADDR` : issuer address +- `/MY-DIRECTORY/MY-DATASET.jsonld` : credential file address +- `MY_ADDR` : issuer address - `MY-DATASET.nq` : name of the file with the signed credential in RDF format -Example: +Example: ```bash -okp4d credential sign collab-ai-zone-governance.jsonld - --from issuer-okp4 +okp4d credential sign collab-ai-zone-governance.jsonld + --from issuer-okp4 --keyring-backend test | jsonld toRdf -q - > collab-ai-zone-governance.nq ``` -You can see that there is new fields in the jsonld with the cryptographic proof. +You can see that there is new fields in the jsonld with the cryptographic proof. ```nquads _:b2 . @@ -433,21 +446,21 @@ _:b4 "Zone Governance" . ``` -The VC is now in the hands of the Holder. Note that it is possible that the Issuer is also the Holder. +The VC is now in the hands of the Holder. Note that it is possible that the Issuer is also the Holder. -The Axone blockchain can only register VCs in N-Quads format. +The Axone blockchain can only register VCs in N-Quads format. -The final step is to register the VCs in the Axone blockchain by submitting them to the Dataverse smart contract. It's the role of the Registrant (who can be the Holder or another entity). +The final step is to register the VCs in the Axone blockchain by submitting them to the Dataverse smart contract. It's the role of the Registrant (who can be the Holder or another entity). :::info Note that as you interact with the Axone blockchain, you must pay fees in $AXONE at each transaction. -::: +::: ```bash -okp4d tx wasm execute $CONTRACT_ADDR \ +okp4d tx wasm execute $CONTRACT_ADDR \ --node "https://api.drunemeton.okp4.network:443/rpc" \ - --chain-id okp4-drunemeton-1 \ - --from $MY_ADDR \ + --chain-id okp4-drunemeton-1 \ + --from $MY_ADDR \ --keyring-backend test --gas 10000000 \ "{\"submit_claims\":{\"metadata\": \"$(cat $MY-DATASET.nq | base64)\"}}" ``` @@ -456,31 +469,33 @@ With: - `CONTRACT_ADDR` : dataverse contract address (always the same) - For the Drunemeton testnet use okp418cszlvm6pze0x9sz32qnjq4vtd45xehqs8dq7cwy8yhq35wfnn3qvya8du - `node "https://api.drunemeton.okp4.network:443/rpc"` : name of the node for the Drunemeton testnet -- `MY_ADDR` : registrant okp4 address -- `$MY-DATASET.nq` : name of the file with the signed credential in RDF format +- `MY_ADDR` : registrant okp4 address +- `$MY-DATASET.nq` : name of the file with the signed credential in RDF format -Example: -```bash +Example: + +````bash okp4d tx wasm execute okp418cszlvm6pze0x9sz32qnjq4vtd45xehqs8dq7cwy8yhq35wfnn3qvya8du \ --node "https://api.drunemeton.okp4.network:443/rpc" \ --chain-id okp4-drunemeton-1 \ --from issuer-okp4 \ - --keyring-backend test + --keyring-backend test --gas 10000000 "{\"submit_claims\":{\"metadata\": \"$(cat collab-ai-zone-governance.nq | base64)\"}}" ``` -The Protocol will check the signature and if the public key corresponds to the proof in the VC, the VC is registered in the smart contract (Cognitarium). +The Protocol will check the signature and if the public key corresponds to the proof in the VC, the VC is registered in the smart contract (Cognitarium). -The command returns the hash of the transaction. You can find more details of this transaction in the [Explorer](https://explore.okp4.network/). Select the network (Currently Drunemeton-Testnet), click on the Search icon, and paste the transaction hash. +The command returns the hash of the transaction. You can find more details of this transaction in the [Explorer](https://explore.okp4.network/). Select the network (Currently Drunemeton-Testnet), click on the Search icon, and paste the transaction hash. Example: Hash: E6D18D38D5A54BC0C73084A047448216A238C69930908B16F11509E7877E0CF9
Axone explorer -
+
## Delete a zone in the Dataverse The deletion of a zone in the Axone Dataverse is carried out exclusively by deleting the governance VP associated with this zone. This deletion action can only be initiated following the rules established by the governance of the zone. It is essential to stress the primacy of governance in this context. Suppose the established governance system does not designate a specific authority empowered to revoke the VP of Governance (or, more generally, the conditions that must be satisfied for its realization). In that case, the result is that the zone remains irrevocably integrated into the dataverse. This provision highlights the crucial importance of a systematic design of governance rules, particularly concerning the mechanisms for modifying zones. +```` diff --git a/docs/tutorials/_category_.json b/docs/tutorials/_category_.json index c92991b53ae..f019433b9ae 100644 --- a/docs/tutorials/_category_.json +++ b/docs/tutorials/_category_.json @@ -1,4 +1,4 @@ { - "label": "Tutorials", + "label": "Guides", "position": 9 } diff --git a/docs/tutorials/cli-1.mdx b/docs/tutorials/cli-1.mdx index 96053913781..72374e04bbf 100644 --- a/docs/tutorials/cli-1.mdx +++ b/docs/tutorials/cli-1.mdx @@ -1,13 +1,11 @@ --- -sidebar_position: 3 +sidebar_position: 2 --- import data from '../../data/chain.json' import CodeBlock from '@theme/CodeBlock' -# Interactions with the CLI - -![Axone with Keplr](/img/content/tutorials/cli.webp) +# Interact with CLI This guide will walk you through connecting with the Axone network using a Command Line Interface (CLI). Picture the CLI as a control panel, allowing you to tap into the pulsing core of Axone's advanced technology. Thanks to the CLI, you can query the chain, uncover deep insights, and execute transactions with a mere command line. diff --git a/docs/tutorials/explorer-sc.md b/docs/tutorials/explorer-sc.md index de05f6f17e4..20f9441aadb 100644 --- a/docs/tutorials/explorer-sc.md +++ b/docs/tutorials/explorer-sc.md @@ -1,11 +1,9 @@ --- -sidebar_position: 4 +sidebar_position: 3 --- # Explorer -![Axone with Keplr](/img/content/tutorials/explorer-0.webp) - The ability to interact seamlessly with a blockchain is a crucial skill. Whether tracking transactions or executing smart contract messages, having the right tools at your disposal can make all the difference. That's where the [Axone Explorer](https://explore.okp4.network/OKP4%20Drunemeton%20testnet) comes in. Are you ready to unpack its capabilities? Let's embark on a journey of exploration and discovery into the Axone blockchain **🚀**. diff --git a/docs/tutorials/keplr-1.mdx b/docs/tutorials/keplr-1.mdx index eafd1c5b451..ca3daad9c37 100644 --- a/docs/tutorials/keplr-1.mdx +++ b/docs/tutorials/keplr-1.mdx @@ -1,10 +1,8 @@ --- -sidebar_position: 2 +sidebar_position: 1 --- -# Your first transaction - -![Axone with Keplr](/img/content/tutorials/keplr-0.webp) +# Make your first transaction This tutorial will guide you through setting up an Axone account, obtaining test tokens from the official faucet, and sending transactions with Keplr Wallet. This will enable you to participate in the Axone ecosystem, interact with the blockchain, and explore its capabilities. Let's get started! @@ -18,19 +16,19 @@ This tutorial will guide you through setting up an Axone account, obtaining test ![Create a new wallet with Keplr](/img/content/tutorials/keplr-1.webp) -3. We recommend you use a recovery phrase to control the wallet custody fully. Click on "**Create new recovery phrase**". Keplr will show you a list of words you must carefully back up. Prefer to write the recovery phrase on a piece of paper you safely store instead of an online solution. +3. We recommend you use a recovery phrase to control the wallet custody fully. Click on "**Create new recovery phrase**". Keplr will show you a list of words you must carefully back up. Prefer to write the recovery phrase on a piece of paper you safely store instead of an online solution. ![Create a new wallet from new recovery seed with Keplr](/img/content/tutorials/keplr-2.webp) 4. Keplr checks you correctly stored your recovery phrase and asks you to provide one of the words. -Then provide a name for your wallet (you can type anything you want), and set a password to get access to your wallet. This password gives you access to your wallet, but if you lose it, you can recover your wallet with the recovery phrase. + Then provide a name for your wallet (you can type anything you want), and set a password to get access to your wallet. This password gives you access to your wallet, but if you lose it, you can recover your wallet with the recovery phrase. ![New Keplr wallet parameters](/img/content/tutorials/keplr-3.webp) 5. Then Keplr asks you to select chains. Don't worry; select any chain you want. 6. And you're done! Your account has been created. You can recover your wallet by following these steps but choosing "Import recovery phrase" in step 3. -Optionally, you can **pin Keplr for easy access**: click the ‘Extensions' button, locate Keplr, and then click the ‘Pin'. + Optionally, you can **pin Keplr for easy access**: click the ‘Extensions' button, locate Keplr, and then click the ‘Pin'. ![New Keplr wallet created](/img/content/tutorials/keplr-4.webp) @@ -54,32 +52,38 @@ The official Axone faucet provides a way to obtain test tokens for experimentati ## Check your $AXONE balance and get your Axone address -1. To see your $AXONE balance, you have to make the `OKP4-drunemeton-1` network visible within the extension: +1. To see your $AXONE balance, you have to make the `OKP4-drunemeton-1` network visible within the extension: - Click on the Keplr extension. -- Click the **≡** button upper on the left, then click "**Manage Chain Visibility**". -- Type "OKP4", +- Click the **≡** button upper on the left, then click "**Manage Chain Visibility**". +- Type "OKP4", - Click on `Axone drunemeton`, and then click on "Save". -
+
+ +
2. Let's check you received the **AXON** tokens: - Click on the Keplr extension button -- Look for `Axone drunemeton` in the list or type "okp4" in the "Search for asset or chain" field to see it easily. +- Look for `Axone drunemeton` in the list or type "okp4" in the "Search for asset or chain" field to see it easily. Alright, there's **1 AXON** in the wallet. -
+
+ +
3. Your wallet is identified by an address derived from your recovery phrase. To receive $AXONE tokens, you should provide your Axone address to the spender. -Here's how you can have your Axone address: + Here's how you can have your Axone address: - Click on the Keplr extension icon and "Copy address". - Look for `Axone drunemeton` in the list or type ‘okp4' in the "Search for a chain" field to see it easily. -- Click on "Copy" to have the Axone address, which is in the following form: `okp41yxrseqc9weu6cm...9xdf3k5z8nwknf` +- Click on "Copy" to have the Axone address, which is in the following form: `okp41yxrseqc9weu6cm...9xdf3k5z8nwknf` -
+
+ +
## Send $AXONE tokens to another wallet @@ -87,11 +91,15 @@ Now that you have $AXONE tokens in your Keplr Wallet, you can send them to other 1. Click on the Keplr extension icon and on "Send". -
+
+ +
2. Select the asset you want to send: AXON. Provide the recipient wallet address, the amount and, optionally, a memo. Click on "Next" and "Approve". You will have to pay a small fee to execute the transaction. -
+
+ +
### Check your transaction with the explorer @@ -108,9 +116,10 @@ To get started, you should: - Add the Axone network and get $AXONE tokens via the official faucet Once you're done, you can interact with the blockchain: + - You can send $AXONE tokens to another wallet using the "Send" button in Keplr, for example. - You can also checkout the explorer to see the transactions status and more. Congratulations! You have successfully learned how to set up an Axone account using Keplr Wallet, obtain test tokens, and send transactions. - With this knowledge, you can actively participate in the Axone blockchain ecosystem, explore its features, build new applications and interact with deployed smart contracts. Enjoy your journey into the world of Axone! +With this knowledge, you can actively participate in the Axone blockchain ecosystem, explore its features, build new applications and interact with deployed smart contracts. Enjoy your journey into the world of Axone! diff --git a/docs/tutorials/nonos-tuto-1.md b/docs/tutorials/nonos-tuto-1.md deleted file mode 100644 index 79e5c4552c1..00000000000 --- a/docs/tutorials/nonos-tuto-1.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -sidebar_position: 101 ---- -# Video Tuto #1 - Architecture - -🚀 Welcome to the first episode of Nono's Tuto! -Your tutorial series to become an expert developer on the Axone protocol 🔥 - -📚 In this first episode, we'll be concentrating on Axone basics. We'll introduce you to what Axone is, and go into detail about the architecture of the Axone protocol! - - diff --git a/docs/tutorials/nonos-tuto-2.md b/docs/tutorials/nonos-tuto-2.md deleted file mode 100644 index d9fe8af3b60..00000000000 --- a/docs/tutorials/nonos-tuto-2.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -sidebar_position: 102 ---- -# Video Tuto #2 - Governance - -🚀 Welcome to the second episode of Nono's Tuto! -Your tutorial series to become an expert developer on the Axone protocol 🔥 - -📚 In this second episode, we'll be focusing on the governance architecture on Axone with some theory and some live examples! - - diff --git a/docs/tutorials/nonos-tuto-3.md b/docs/tutorials/nonos-tuto-3.md deleted file mode 100644 index edcc55ab20a..00000000000 --- a/docs/tutorials/nonos-tuto-3.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -sidebar_position: 103 ---- -# Video Tuto #3 - Ontology - -🚀 Welcome to the third episode of Nono's Tuto! -Your tutorial series to become an expert developer on the Axone protocol 🔥 - -📚 In this third episode, we'll dive into the Ontology and do some demonstration! - - diff --git a/docs/tutorials/overview.md b/docs/tutorials/overview.md deleted file mode 100644 index 7534daf06e9..00000000000 --- a/docs/tutorials/overview.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -sidebar_position: 1 ---- - -# Overview - -![Tutorials overview](/img/content/tutorials/overview-tutos.webp) - -## Getting started with Axone Protocol - -* [Your first transaction with Keplr Wallet](./keplr-1) -* [Interactions with the CLI](./cli-1) -* [Explorer & smart contracts](./explorer-sc) -* [Manage rules with Prolog](./prolog-1) - -## Nono's tutorials - -Discover our video tutorials with Arnaud our Blockchain Architect: - -* [Introduction to Axone Architecture](./nonos-tuto-1) -* [Governance, you said](./nonos-tuto-2) -* [Learn more about Ontology](./nonos-tuto-3) diff --git a/docs/tutorials/prolog-1.mdx b/docs/tutorials/prolog-1.mdx index 6b38feab5eb..85398fd8d01 100644 --- a/docs/tutorials/prolog-1.mdx +++ b/docs/tutorials/prolog-1.mdx @@ -1,11 +1,9 @@ --- -sidebar_position: 5 +sidebar_position: 3 --- # Manage rules with Prolog -![Tutorials overview](/img/content/tutorials/prolog.webp) - Welcome, Axone builders, to an exciting journey at the crossroads of Prolog and blockchain! This tutorial delves into the fascinating realm of logic programming and its profound impact on the "law" governing off-chain resources usages. Whether you're interested in developing using the protocol or are intrigued by one of the core Axone concepts, this tutorial will equip you with the knowledge of programming rules with Prolog and how to use it to set up and enforce rules without trusting a central authority. @@ -563,6 +561,7 @@ Let's load the Prolog program stored with the `objectarium` instance `address = **[Url encoded](https://www.urlencoder.org/) payload:** `%7B%22object_data%22%3A%20%7B%22id%22%3A%222625337e6025495a87cb32eb7f5a042f31e4385fd7e34c90d661bfc94dd539e3%22%7D%7D` + ```bash diff --git a/docusaurus.config.js b/docusaurus.config.js index e8204856bc3..63f5cc3560d 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -206,7 +206,7 @@ const config = { to: '/technical-documentation/overview' }, { - label: 'Tutorials', + label: 'Guides', to: '/tutorials/overview' }, { diff --git a/sidebars.js b/sidebars.js index 6a37f6d8a3e..c55faf393b1 100644 --- a/sidebars.js +++ b/sidebars.js @@ -149,7 +149,7 @@ const sidebars = { tutorials: [ { type: 'category', - label: 'Tutorials', + label: 'Guides', items: [ { type: 'autogenerated', diff --git a/static/img/content/tutorials/overview-tutos.webp b/static/img/content/tutorials/overview-tutos.webp deleted file mode 100644 index 778b0c4b77857e020629d5c7dbc2f2497fa06a41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70610 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

dj=I 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