1"use strict";(self.webpackChunkaelf_docs_cms=self.webpackChunkaelf_docs_cms||[]).push([[9569],{64081:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var r=t(74848),i=t(28453);const s={sidebar_position:2,title:"Core Implementation"},l="Design Principles",o={id:"learn/core/implementation/index",title:"Core Implementation",description:"Design Principles",source:"@site/docs/learn/core/implementation/index.md",sourceDirName:"learn/core/implementation",slug:"/learn/core/implementation/",permalink:"/learn/core/implementation/",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,title:"Core Implementation"},sidebar:"learn",previous:{title:"Core Introduction",permalink:"/learn/core/introduction/"},next:{title:"Cross Chain",permalink:"/learn/cross-chain"}},a={},d=[{value:"OS",id:"os",level:2},{value:"Kernel",id:"kernel",level:2},{value:"Structure of the Project",id:"structure-of-the-project",level:2},{value:"Jobs and Event Handlers",id:"jobs-and-event-handlers",level:2},{value:"Modules",id:"modules",level:2},{value:"Testing",id:"testing",level:2}];function c(e){const n={h1:"h1",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"design-principles",children:"Design Principles"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Design Principles",src:t(36596).A+"",width:"960",height:"660"})}),"\n",(0,r.jsx)(n.p,{children:"The diagram above shows the conceptual structure of the node and the separation between the OS and Kernel."}),"\n",(0,r.jsx)(n.h2,{id:"os",children:"OS"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"OS layer"})," implements the application and infrastructure layers for the network. It also handles high-level network events and jobs, such as synchronizing the chain in response to a block announcement. Additionally, the OS layer includes the RPC implementation for the exposed API."]}),"\n",(0,r.jsx)(n.h2,{id:"kernel",children:"Kernel"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Kernel"})," contains smart contract execution primitives and definitions. It also defines the components necessary for accessing the blockchain's data. Various managers use the storage layer to access the underlying database."]}),"\n",(0,r.jsx)(n.p,{children:"The Kernel also introduces the concept of plugins. The diagram shows that side chain modules are implemented as plugins."}),"\n",(0,r.jsx)(n.h2,{id:"structure-of-the-project",children:"Structure of the Project"}),"\n",(0,r.jsx)(n.p,{children:"To understand aelf's structure, this section provides an overview of the solution."}),"\n",(0,r.jsxs)(n.p,{children:["Conceptually, aelf is built on two main layers: ",(0,r.jsx)(n.strong,{children:"OS"})," and ",(0,r.jsx)(n.strong,{children:"Kernel"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"OS Layer:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Contains high-level definitions for a node and endpoints like RPC and P2P."}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Kernel Layer:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Contains logic and definitions for smart contracts and consensus."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["aelf has a native runtime for smart contracts implemented in ",(0,r.jsx)(n.strong,{children:"C#"}),", for contracts written in C#. This implementation is found in the ",(0,r.jsx)(n.strong,{children:"AElf.Runtime.CSharp."})," projects."]}),"\n",(0,r.jsxs)(n.p,{children:["A significant part of aelf is the side chain framework. It is mainly implemented in the ",(0,r.jsx)(n.strong,{children:"AElf.CrossChain"})," namespace, defining the main abstractions in the ",(0,r.jsx)(n.strong,{children:"core"})," project and an implementation with gRPC in the ",(0,r.jsx)(n.strong,{children:"AElf.Crosschain.Grpc"})," project."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"AElf.Test"})," solution folder contains all the tests. Ensuring maximum coverage of the main functional aspects is crucial for maintaining the quality of our system."]}),"\n",(0,r.jsx)(n.p,{children:"Other projects implement libraries we use, like the crypto library, and others for infrastru
1cture, like the database library. While not as critical, they are still worth exploring."}),"\n",(0,r.jsx)(n.h2,{id:"jobs-and-event-handlers",children:"Jobs and Event Handlers"}),"\n",(0,r.jsx)(n.p,{children:"Event handlers implement the logic that reacts to external and internal events. They represent the higher levels of the application, being called by the framework in a domain-agnostic manner. Event handlers, primarily using other services, influence the state of the chain."}),"\n",(0,r.jsx)(n.h2,{id:"modules",children:"Modules"}),"\n",(0,r.jsxs)(n.p,{children:["Our architecture is based on modules that are wired together at runtime. Any new module must inherit from ",(0,r.jsx)(n.strong,{children:"AElfModule"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"To implement a new module, follow these steps:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsx)(n.li,{children:"Write the event handler or the job."}),"\n",(0,r.jsx)(n.li,{children:"Implement the interface and create a manager or infrastructure layer interface if needed."}),"\n",(0,r.jsx)(n.li,{children:"Implement the infrastructure layer interface in the same project if no additional dependencies are required."}),"\n",(0,r.jsx)(n.li,{children:"Implement the infrastructure layer interface in another project if it requires third-party dependencies (e.g., adding gRPC, MongoDB, or MySQL in the new project)."}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Example:"})," The P2P network module."]}),"\n",(0,r.jsxs)(n.p,{children:["The networking code is defined across two modules: ",(0,r.jsx)(n.strong,{children:"CoreOSAElfModule"})," and ",(0,r.jsx)(n.strong,{children:"GrpcNetworkModule"}),". The OS core defines and implements the application service (used by other components of the node) as it is part of the application/domain logic. The infrastructure layer (like the server endpoint) is defined in the OS core modules but implemented in another project that relies on a third party, such as gRPC."]}),"\n",(0,r.jsx)(n.h2,{id:"testing",children:"Testing"}),"\n",(0,r.jsx)(n.p,{children:"When writing a new component, event handler, or method, it is important for aelf's quality to consider the corresponding unit test. As previously mentioned, we have a solution-wide test folder where we place all the tests."})]})}function m(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},36596:(e,n,t)=>{t.d(n,{A:()=>r});const r="data:image/webp;base64,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"},28453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>o});var r=t(96540);const i={},s=r.createContext(i);function l(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.