Internet Computer – struktura nového projektu

Tento příspěvek čerpá z oficiálního tutoriálu.

Postup vývoje na lokálním prostředí (zdroj oficiální tutoriál)

Nový projekt se vytvoří příkazem dfx new a nazveme jej stejně jako v oficiálním tutoriálu – explore_hello. Vytvoří se složka explore_hello se soubory projektu a pokud máte nainstalován node.js, přidá se i vzorový front-endový kód a závislosti. Pro zajištění toho, že název projektu bude platný při použití JavaScriptu, Motoka a dalších, je doporučeno používat v názvu pouze písmena, číslovky a podtržítka.

dfx new explore_hello

Fetching manifest https://sdk.dfinity.org/manifest.json
Creating new project "explore_hello"...
CREATE       explore_hello/README.md (1.18KB)...
CREATE       explore_hello/dfx.json (504B)...
CREATE       explore_hello/.gitignore (165B)...
CREATE       explore_hello/src/explore_hello/main.mo (107B)...
CREATE       explore_hello/src/explore_hello_assets/assets/sample-asset.txt (24B)...
CREATE       explore_hello/webpack.config.js (2.15KB)...
CREATE       explore_hello/src/explore_hello_assets/public/index.js (161B)...
CREATE       explore_hello/package.json (292B)...
⠁ Installing node dependencies...
...

⠄ Installing node dependencies...
...

Creating git repository...

===============================================================================
        Welcome to the internet computer developer community!
                        You're using dfx 0.6.26

            ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄                ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄       
          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄    
        ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄      ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  
       ▄▄▄▄▄▄▄▄▄▄▀▀▀▀▀▄▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄▄▀▀▀▀▀▀▄▄▄▄▄▄▄▄▄▄ 
      ▄▄▄▄▄▄▄▄▀         ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀         ▀▄▄▄▄▄▄▄▄▄
     ▄▄▄▄▄▄▄▄▀            ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀             ▄▄▄▄▄▄▄▄
     ▄▄▄▄▄▄▄▄               ▀▄▄▄▄▄▄▄▄▄▄▄▄▀                ▄▄▄▄▄▄▄
     ▄▄▄▄▄▄▄▄                ▄▄▄▄▄▄▄▄▄▄▄▄                 ▄▄▄▄▄▄▄
     ▄▄▄▄▄▄▄▄               ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄              ▄▄▄▄▄▄▄▄
      ▄▄▄▄▄▄▄▄           ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄          ▄▄▄▄▄▄▄▄▀
      ▀▄▄▄▄▄▄▄▄▄▄     ▄▄▄▄▄▄▄▄▄▄▄▄▀ ▀▄▄▄▄▄▄▄▄▄▄▄▄    ▄▄▄▄▄▄▄▄▄▄▄ 
       ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀     ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀  
         ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀         ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄    
           ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀▀             ▀▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀      
              ▀▀▀▀▀▀▀▀▀▀▀                    ▀▀▀▀▀▀▀▀▀▀▀         
     


To learn more before you start coding, see the documentation available online:

- Quick Start: https://sdk.dfinity.org/docs/quickstart/quickstart-intro.html
- SDK Developer Tools: https://sdk.dfinity.org/docs/developers-guide/sdk-guide.html
- Motoko Language Guide: https://sdk.dfinity.org/docs/language-guide/motoko.html
- Motoko Quick Reference: https://sdk.dfinity.org/docs/language-guide/language-manual.html

If you want to work on programs right away, try the following commands to get started:

    cd explore_hello
    dfx help
    dfx new --help

===============================================================================

Takto může vypadat vygenerovaná struktura projektu

.
├── dfx.json
├── node_modules
├── package.json
├── package-lock.json
├── README.md
├── src
│   ├── explore_hello
|   │   └── main.mo
│   └── explore_hello_assets
|       ├── assets
|        │   └── sample-asset.txt
|        └── public
|            └── index.js
|   
└── webpack.config.js

Složka obsahuje minimálně tyto soubory a složky:
README soubor
dfx.json konfigurační soubor
src adresář se zdrojovými soubory

Src složka obsahuje minimálně soubor main.mo, který může vypadat následovně

actor {
    public func greet(name : Text) : async Text {
        return "Hello, " # name # "!";
    };
};

Pokud máte nainstalován node.js, budete mít ještě další složky a soubory pro front-end aplikace. Front-end soubory jsou ve složce assets. Více informací o konfiguračním souboru dfx.json najdete v tomto příspěvku.

Spuštění lokální sítě

Před tím, než můžete sestavit (build) projekt, musíte se připojit do sítě Internet Computeru buď lokálně, nebo vzdáleně. Pro připojení lokálně potřebujete konfigurační soubor dfx.json. V kořenovém souboru zadejte příkaz dfx start.

dfx start

May 16 09:09:11.594 INFO ic-starter. Configuration: ValidatedConfig { replica_path: Some("/home/vitfo/.cache/dfinity/versions/0.6.26/replica"), replica_version: "0.1.0", log_level: Warning, subnet_id: fscpm-uiaaa-aaaaa-aaaap-yai, cargo_bin: "cargo", cargo_opts: "", state_dir: "/home/vitfo/bin/explore_hello/.dfx/state/replicated_state", http_listen_addr: V4(127.0.0.1:0), http_port_file: Some("/home/vitfo/bin/explore_hello/.dfx/replica-configuration/replica-1.port"), metrics_addr: None, hypervisor_create_funds_whitelist: "*", artifact_pool_dir: "/home/vitfo/bin/explore_hello/.dfx/state/replicated_state/node-100/ic_consensus_pool", crypto_root: "/home/vitfo/bin/explore_hello/.dfx/state/replicated_state/node-100/crypto", state_manager_root: "/home/vitfo/bin/explore_hello/.dfx/state/replicated_state/node-100/state", registry_file: "/home/vitfo/bin/explore_hello/.dfx/state/replicated_state/registry.proto", bootstrap_registry: None, state_dir_holder: None }, Application: starter
May 16 09:09:11.595 INFO Initialize replica configuration "/home/vitfo/bin/explore_hello/.dfx/state/replicated_state/ic.json5", Application: starter
May 16 09:09:11.678 INFO Executing "/home/vitfo/.cache/dfinity/versions/0.6.26/replica" "--replica-version" "0.1.0" "--config-file" "/home/vitfo/bin/explore_hello/.dfx/state/replicated_state/ic.json5", Application: starter
May 16 09:09:12.762 ERRO s:fscpm-uiaaa-aaaaa-aaaap-yai/n:ob7lq-y5gzp-lesds-zr2en-wauue-kf3np-ikln6-jkmj6-fnkwa-p7vci-7qe/ic_messaging/xnet_endpoint No XNet configuration for node ob7lq-y5gzp-lesds-zr2en-wauue-kf3np-ikln6-jkmj6-fnkwa-p7vci-7qe. This is an error in production, but may be ignored in single-subnet test deployments.
May 16 09:09:13.765 WARN s:fscpm-uiaaa-aaaaa-aaaap-yai/n:ob7lq-y5gzp-lesds-zr2en-wauue-kf3np-ikln6-jkmj6-fnkwa-p7vci-7qe/ic_http_handler/ic_http_handler NNS subnet not found in network topology. Skipping fetching the delegation.
Starting webserver on port 42219 for replica at "http://localhost:42219"
binding to: V4(127.0.0.1:8000)
replica(s): http://localhost:42219/

Registrování identifikátorů kanystrů

Po připojení k síti je možné vygenerovat síťově specifický identifikátor kanystru pro projekt. Registraci jedinečného identifikátoru kanystru pro projekt provedete příkazem dfx canister create --all.

dfx canister create --all

Creating canister "explore_hello"...
Creating the canister using the wallet canister...
Creating a wallet canister on the local network.
The wallet canister on the "local" network for user "default" is "r7inp-6aaaa-aaaaa-aaabq-cai"
"explore_hello" canister created with canister id: "rkp4c-7iaaa-aaaaa-aaaca-cai"
Creating canister "explore_hello_assets"...
Creating the canister using the wallet canister...
"explore_hello_assets" canister created with canister id: "rno2w-sqaaa-aaaaa-aaacq-cai"

Pokud jste připojeni lokálně, identifikátory jsou platné pouze lokálně a jsou uloženy v souboru ./dfx/local/canister_ids.

{
  "explore_hello": {
    "local": "rkp4c-7iaaa-aaaaa-aaaca-cai"
  },
  "explore_hello_assets": {
    "local": "rno2w-sqaaa-aaaaa-aaacq-cai"
  }
}

Sestavení (build) programu

Kompilace programu do spustitelného WebAssembly modulu se provede přílazem dfx build.

dfx build

Building canisters...
Building frontend...

Pokud jste lokálně, přidá tento příkaz složku canisters do složky .dfx/local.

.
└── local
    ├── canister_ids.json
    ├── canisters
    │   ├── explore_hello
    │   │   ├── explore_hello.did
    │   │   ├── explore_hello.did.js
    │   │   ├── explore_hello.d.ts
    │   │   ├── explore_hello.js
    │   │   └── explore_hello.wasm
    │   ├── explore_hello_assets
    │   │   ├── assets
    │   │   │   ├── index.js
    │   │   │   ├── index.js.map
    │   │   │   └── sample-asset.txt
    │   │   ├── assetstorage.did
    │   │   ├── assetstorage.wasm
    │   │   ├── explore_hello_assets.did
    │   │   ├── explore_hello_assets.did.js
    │   │   ├── explore_hello_assets.d.ts
    │   │   ├── explore_hello_assets.js
    │   │   └── explore_hello_assets.wasm
    │   └── idl
    └── wallets.json

explore_hello.did obsahuje popis rozhraní hlavního programu

service : {
  greet: (text) -> (text);
}

explore_hello.did.js obsahuje JavaScriptovou reprezentaci rozhraní funkcí programu

export default ({ IDL }) => {
  return IDL.Service({ 'greet' : IDL.Func([IDL.Text], [IDL.Text], []) });
};
export const init = ({ IDL }) => { return []; };

explore_hello.js obsahuje JavaScriptovou reprezentaci rozhraní programu

import actorInterface from "ic:idl/explore_hello";

export default ic.agent.makeActorFactory(actorInterface)({
  canisterId: "rkp4c-7iaaa-aaaaa-aaaca-cai",
});

explore_hello.wasm obsahuje zkompilovaný WebAssembly assetů projektu

(module
  (type $t0 (func (param i32 i32)))
  (type $t1 (func (param i64)))
  (type $t2 (func (param i32 i32 i32 i32 i32 i32 i32 i32)))
  (type $t3 (func (result i32)))
  ...
  (func $bigint_trap (type $t7)
    i32.const 65540
    i32.const 21
    call $ic0.trap
    unreachable)
  (func $rts_trap (type $t0) (param $str i32) (param $len i32)
    local.get $str
    local.get $len
    call $ic0.trap
    unreachable)
  (func $trans_state4 (type $t7)
    block $B0
      i32.const 65536
      i32.load
      i32.const 3
      i32.eq
      if $I1
        br $B0
      end
  ...

Adresář canisters/explore_hello_assets obsahuje podobné soubory, ale pro front-endovou část projektu.

Nasazení projektu lokálně

WebAssembly moduly a canister_manifest.json jsou požadovány pro nasazení programu na síť Internet Computeru. Lokální nasazení se provede příkazem dfx canister install --all.

dfx canister install --all

Installing code for canister explore_hello, with canister_id rkp4c-7iaaa-aaaaa-aaaca-cai
Installing code for canister explore_hello_assets, with canister_id rno2w-sqaaa-aaaaa-aaacq-cai
Authorizing our identity (default) to the asset canister...
Uploading assets to asset canister...

Nyní je možné zavolat kanystr (dfx canister call) a také si zobrazit front-endovou část tak jak bylo popsáno v předchozím příspěvku.

Zdroj: sdk.dfinity.org/docs/developers-guide/tutorials/explore-templates.html

Napsat komentář