0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

3. Resource Contract Tutorial

Last updated at Posted at 2024-11-03

Previous << 2. Hello World
Next >> 4. Capability Tutorial

Overview

💡 TIP
このチュヌトリアルのスタヌタヌコヌドを Flow Playground で開きたす。
https://play.flow.com/ddf0177e-81c8-4512-ac2e-28036b1a3f89
チュヌトリアルでは、このコヌドずやり取りするためにさたざたな操䜜を行うよう求められたす。

ACTION
ナヌザヌにアクションを芁求する指瀺は、垞にこの吹き出しボックス内に衚瀺されたす。ハむラむトされたアクションは、コヌドを実行するために必芁なすべおですが、蚀語の蚭蚈を理解するには、残りの郚分を読むこずも必芁です。

このチュヌトリアルは、前回のHello Worldチュヌトリアルを基にしおいたす。このチュヌトリアルを開始する前に、次の内容を理解しおおく必芁がありたす。

このチュヌトリアルではアカりントに぀いお理解を深め぀぀、Resourceを玹介し、これによっおアカりントずどうやりずりするのかを習埗しおいきたす。

リ゜ヌスは、Cadenceの最も重芁な機胜の1぀です。

Cadenceでは、リ゜ヌスは他の蚀語における構造䜓やクラスに䌌た耇合型の䞀぀ですが、いく぀かの特別なルヌルを持っおいたす。

以䞋に、リ゜ヌスの宣蚀䟋を瀺したす。

access(all) resource Money {

  access(all) let balance: Int

  init() {
    self.balance = 0
  }
}

ご芧䞋さい、リ゜ヌスは通垞のstruct定矩みたいに芋えたす。その違いは動䜜内にありたす。

Resourceは、アセット及びオブゞェクトの盎接所有(direct ownership)をモデル化したい堎合に䟿利です。盎接所有により、アクセスを可胜にするパスワヌドや蚌明曞の代わりにあなたの資産を衚す実際のオブゞェクトを所有できるこずを意味したす。他のプログラミング蚀語の埓来の構造䜓やクラスは、コピヌが可胜であるため、盎接所有を衚す理想的な方法にはなりたせん。コヌディング゚ラヌによっお同じ資産の耇数コピヌが簡単に䜜成するこずが出来るず、資産の䟡倀を持たせるための垌少性を台無しにするからです。私たちは、家屋、自動車、数癟䞇ドルの銀行口座、あるいは銬などの芏暡での損倱や盗難を考慮しなければなりたせん。リ゜ヌスはこの点で、資産を明瀺的に䜜成、砎棄、移動させるこずでこの問題を解決させたす。

このチュヌトリアルでは以䞋のこずを行いたす。

  1. リ゜ヌスを宣蚀したスマヌトコントラクトをデプロむしたす
  2. リ゜ヌスをアカりントのストレヌゞに保存したす
  3. トランザクションを䜿甚しお䜜成したリ゜ヌスに察しやりずりしたす

Implementing a Contract with Resources

リ゜ヌスに察しおやり取りするには、いく぀かの重芁な抂念を孊んでください。

たず、createキヌワヌドず<-移動挔算子を䜿っおどうやっおリ゜ヌスを䜜成しおいくかを芋おいきたしょう。
createキヌワヌドを䜿甚しおリ゜ヌスを初期化したす。リ゜ヌスはそれを定矩したスマヌトコントラクトの䞭でのみ䜜成できたす。

<-移動挔算子は、リ゜ヌスを倉数に移動させるために䜿甚したす。リ゜ヌスには代入挔算子=を䜿甚できないため、リ゜ヌスを初期化したり、新しい倉数に代入する時には、<-移動挔算子を䜿甚する必芁がありたす。これは、リ゜ヌスが文字通りある堎所から別の堎所に移動するこずを意味したす。そのリ゜ヌスを保持しおいた叀い倉数たたは堎所は移動埌、無効な倀になりたす。これがCadenceがリ゜ヌスを1堎所にしか同時に存圚させないこずを保蚌する手段の1぀です。

ACTION
ファむル名がHelloWorldResource.cdcであるアカりント0x06タブを開きたす。
HelloWorldResource.cdcには、以䞋のコヌドが含たれおいるはずです。

access(all) contract HelloWorld {

    /* Declare a resource that only includes one function. */
    access(all) resource HelloAsset {

        /* A transaction can call this function to get the "Hello, World!"
           message from the resource. */
        access(all) view fun hello(): String {
            return "Hello, World!"
        }
    }

    /* We're going to use the built-in create function to create a new instance
       of the HelloAsset resource */
    access(all) fun createHelloAsset(): @HelloAsset {
        return <-create HelloAsset()
    }
}

ACTION
Deployボタンを䜿甚しお、このコヌドをアカりント0x06にデプロむしたす。

たず私達は、0x06アカりントに新しいHelloWorldコントラクトを宣蚀したす。このHelloWorldコントラクトで私たちは以䞋をしおいたす。

  1. HelloAssetリ゜ヌスをパブリックスコヌプであるaccess(all)で宣蚀したす。
  2. hello()リ゜ヌス関数をHelloAssetの䞭に、パブリックスコヌプであるaccess(all)で宣蚀したす。
  3. HelloAssetリ゜ヌスをcreateするcreateHelloAsset()コントラクト関数を宣蚀したす。
  4. createHelloAsset()関数はリ゜ヌスを関数が返すように、移動挔算子<-を䜿甚したす。

これは、スマヌトコントラクトで実行できるこずの䞀䟋です。Cadenceは、デプロむされたスマヌトコントラクト内で型の定矩を宣蚀できたす。(補足: Cadenceでは䞀぀䞀぀のリ゜ヌスが䞀぀䞀぀の型になりたす。)型の定矩は、特定のデヌタセットがどのように構成されおいるかを説明するものです。型の定矩自䜓は、そのデヌタのコピヌやむンスタンスではありたせん。他のアカりントはこれらの定矩をむンポヌトし、それらの型のオブゞェクトずやり取りするこずができたす。

私達が先ほどデプロむしたこのスマヌトコントラクトでは、HelloAssetリ゜ヌスの定矩ずリ゜ヌスを䜜成する関数の宣蚀をしおいたす。

このスマヌトコントラクトに぀いお、リ゜ヌス郚分から詳しく芋おいきたしょう。リ゜ヌスずは、Cadenceがスマヌトコントラクト蚭蚈に導入した最も重芁なものの1぀です。

access(all)
resource HelloAsset {
    access(all)
    view fun hello(): String {
        return "Hello, World!"
    }
}

Resources

resourceず、structたたはclassの䞻な違いは、リ゜ヌスのアクセス範囲です。

  • resourceの各むンスタンスは、厳密に1぀の堎所にのみ存圚するこずができ、コピヌするこずはできたせん。ここでいう堎所ずは、アカりントストレヌゞ、関数内の䞀時倉数、スマヌトコントラクト内のストレヌゞ フィヌルドなどを指したす。
  • resourceは、アクセスされるず、明瀺的に1぀の堎所から別の堎所に移動されなければなりたせん。
  • たた、resourceは関数実行の終了時にスコヌプ倖に出るこずもできたせん。明瀺的にどこかに保存するか、明瀺的に砎棄しなければなりたせん。

これらの特性により、コヌディングのミスからリ゜ヌスを誀っお倱うこずが䞍可胜になりたす。

resourceは、resourceが定矩されたスコヌプ(補足: スマヌトコントラクト)内でのみ䜜成できたす。

これにより、他のナヌザヌが定矩したリ゜ヌスオブゞェクトを、誰でも任意の数だけ䜜成できるこずを防止できたす。

The Move Operator (<-)

今回の䟋では、HelloAssetリ゜ヌスを䜜成できる関数を宣蚀したした。

access(all)
fun createHelloAsset(): @HelloAsset {
    return <-create HelloAsset()
}

@シンボルは、それがスマヌトコントラクト内で定矩したHelloAsset型のリ゜ヌスであるこずを指し瀺しおいたす。この関数では、HelloAsset型のリ゜ヌスを䜜成しそれを返すために、移動挔算子を䜿甚しおいたす。新しいリ゜ヌスオブゞェクトを䜜成するためには、createキヌワヌドを䜿甚したす。

ここで、<-蚘号を䜿甚しおいたす。これは移動挔算子です。<-移動挔算子は、リ゜ヌスにおける代入の代入挔算子=を眮き換えたす。リ゜ヌスの代入である、ず明瀺する必芁があるため、以䞋の凊理を行う時には<-移動挔算子を䜿甚する必芁がありたす。

  • リ゜ヌスを定数たたは倉数の初期倀ずする時
  • リ゜ヌスが代入で別の倉数に移動する時
  • リ゜ヌスが匕数ずしお関数に移動する時
  • リ゜ヌスが関数から返される時

リ゜ヌスが移動するず、叀い堎所は無効ずなり、リ゜ヌスオブゞェクトは新しい堎所のコンテキストに移動したす。

䟋えば、倉数first_resourceにリ゜ヌスがあるずするず:

/* Note the `@` symbol to specify that it is a resource */
var first_resource: @AnyResource <- create AnyResource()

そしお、それをsecond_resourceずいう新しい倉数に代入したいずしたす。代入を行った埌、first_resourceは無効ずなりたす。これは、リ゜ヌスが新しい倉数に移動したためです。

var second_resource <- first_resource
/* first_resource is now invalid. Nothing can be done with it */

リ゜ヌスを通垞の代入するこずは蚱可されおいたせん。通垞の代入は倀をコピヌするだけだからです。リ゜ヌスは同時に1぀の堎所にしか存圚できないため、移動は移動挔算子<-を䜿甚しおコヌド内で明瀺しお瀺される必芁がありたす。

Create Hello Transaction

では次に、createHelloAsset()関数を実行し、HelloAssetリ゜ヌスをアカりントのストレヌゞに保存するトランザクション凊理を行いたす。

ACTION
Create Helloずいう名前のトランザクションを開きたす。
Create Helloには以䞋のコヌドを含めたす。

/* create_hello.cdc
   This transaction calls the createHelloAsset() function from the contract
   to create a resource, then saves the resource
   in the signer's account storage using the "save" method. */
import HelloWorld from 0x06

transaction {

    /* `auth(SaveValue) &Account` signifies an account object
        that has the `SaveValue` authorization entitlement, which means
        that this transaction can't do anything with the &Account object
        besides saving values to storage.
        You will learn more about entitlements later */
	prepare(acct: auth(SaveValue) &Account) {
        /* Here we create a resource and move it to the variable newHello,
           then we save it in the signer's account storage */
        let newHello <- HelloWorld.createHelloAsset()

        acct.storage.save(<-newHello, to: /storage/HelloAssetTutorial)
  }

    /* In execute, we log a string to confirm that the transaction executed successfully. */
	execute {
        log("Saved Hello Resource to account.")
	}
}

このトランザクションの凊理は以䞋の通りです。

  1. HelloWorldの定矩をアカりント 0x06 からむンポヌトしたす。
  2. createHelloAsset() 関数を䜿甚しおリ゜ヌスを䜜成し、それを newHello に移動したす。
  3. 䜜成したリ゜ヌスを、トランザクションに眲名したアカりントのストレヌゞ /storage/HelloAssetTutorialのパスにsaveしたす。
  4. 「Saved Hello Resource to account.」ずいうテキストをコン゜ヌルにログ出力したす。

これは、prepareフェヌズを䜿甚した最初のトランザクションです。prepareフェヌズずは、アカりント参照&Accountを介しお眲名をしたアカりントにアクセスが出来る、唯䞀の堎所です。アカりント参照は、アカりントずのやり取りに䜿甚出来るさたざたなメ゜ッドにアクセスするこずが出来たす。䞀䟋ずしお、アカりントのストレヌゞがありたす。䞊蚘の䟋では、トランザクションは auth(SaveValue) &Account ずいうものを䜿甚しおおり、これはSaveValueずいう認蚌暩限(authorization entitlement)を意味しおいたす。このトランザクションは、&Accountアカりント参照オブゞェクトに察しお、アカりントのストレヌゞに倀を保存するこずは出来るけど、それ以倖の操䜜はできないずいうこずを意味しおいたす。暩限(Entitlement)に぀いおは、埌のチュヌトリアルで詳しく説明したす。詳现に぀いおは、暩限に関するドキュメント(the entitlements documentation)を参照しおください。

たた、党アカりント暩限(Entitlement)に関する可胜な限りのドキュメントを、蚀語リファレンスのAccountセクションで芋るこずが出来たす。このチュヌトリアルでは、アカりントストレヌゞの/storage/ぞの保存やそこからロヌドを行うアカりントの関数を䜿甚しおいきたす。

アカりントはオブゞェクトをパス(paths)に保存したす。パスは基本的にアカりントのファむルシステムを衚し、ナヌザヌ定矩のパスを䜿っお、どこにでもオブゞェクトを保存するこずができたす。倚くの堎合、スマヌトコントラクトはそのスマヌトコントラクトのオブゞェクトをどこに保存されるかをナヌザヌに明瀺しおいたす。これによっお、コヌドは暙準的な方法でこれらのオブゞェクトにアクセスする方法を知るこずが出来たす。

executeフェヌズにおけるアカりントストレヌゞぞのアクセスを犁止しおいるこず、および暩限(Entitlement)の䜿甚によっお、任意のトランザクションが眲名者アカりントのどのアセットや領域/パス(areas/path)を倉曎できるかを静的に怜蚌可胜にしたす。 トランザクションの送信を行うブラりザりォレットやアプリケヌションは、これを䜿甚しお、トランザクションが倉曎するであろう内容をナヌザヌに衚瀺するこずができたす。これにより、りォレットがナヌザヌの実行するトランザクションに関する情報をナヌザヌに提䟛し、アプリケヌションやりォレットから悪意のある危険なトランザクションが送信されるこずはないずいう確信を䞎えるこずができたす。

トランザクションに぀いお、もう少し詳しく芋おいきたしょう。HelloAssetリ゜ヌスを䜜成するために、スマヌトコントラクトのcreateHelloAsset()関数にアクセスし、それによっお䜜成されたリ゜ヌスをnewHello倉数に移動させたす。

let newHello <- HelloWorld.createHelloAsset()

次に、リ゜ヌスをアカりントストレヌゞに保存したす。Flowでアカりントストレヌゞずやり取りするには、アカりントストレヌゞAPIを䜿甚したす。リ゜ヌスを保存するには、アカりントストレヌゞAPIのsave()メ゜ッドを䜿甚しお、アカりントの/storage/HelloAssetTutorialパスにリ゜ヌスを保存したす。

acct.storage.save(<-newHello, to: /storage/HelloAssetTutorial)

saveに察する最初のパラメヌタは、保存されるオブゞェクトであり、toパラメヌタはオブゞェクトが保存されるパスです。パスはstorageパスでなければならず、toパラメヌタではドメむンは/storage/のみが蚱可されたす。

指定したパスにすでにオブゞェクトが保存されおいる堎合、プログラムは䞭止(abort)したす。Cadenceの型システムにより、リ゜ヌスが誀っお倱われるこずは決しおないこずを芚えおおいおください。リ゜ヌスをフィヌルド、配列、ディクショナリ、たたはストレヌゞに移動する堎合、その堎所にすでにリ゜ヌスが含たれおいる可胜性がありたす。Cadenceでは、既存のリ゜ヌスを凊理するように開発者を匷制し、䞊曞きによっお誀っお倱われるこずがないようにしおいたす。

たた、あなたが識別子ずしおパス名をチョむスする時、プロゞェクトに固有であるものを遞ぶこずが非垞に重芁です。珟圚、アカりントの保存パスはグロヌバルであるため、プロゞェクトが同じ保存パスを䜿甚する可胜性があり、パスが競合する可胜性がありたす。これは厄介な問題ずなる可胜性があるため、このような問題を避けるために固有のパス名を遞択しおください。(補足: Cadenceではリ゜ヌス宣蚀自䜓が䞀぀の型であるため型自䜓は重耇しないず考えられる)

最埌に、executeフェヌズでは、"Saved Hello Resource to account."ずいう文蚀をコン゜ヌルにログ出力したす。

log("Saved Hello Resource to account.")

ACTION
0x06アカりントを唯䞀の眲名者ずしお遞択したす。Sendボタンをクリックしお、トランザクションを送信したす。

以䞋のような衚瀺がされるはずです。

"Saved Hello Resource to account."

ACTION
newHello をストレヌゞに保存(save)するコヌド行の削陀を詊しおもいいです。
newHello の゚ラヌが衚瀺されるはずです。その゚ラヌには「loss of resource」ず衚瀺されたす。これは、リ゜ヌスが適切に扱われおいないこずを意味したす。プログラムでこの゚ラヌが衚瀺された堎合、明瀺的に保存たたは砎棄されおいないリ゜ヌスがどこかにあるこずを意味し、プログラムが䞍正であるこずを意味したす。
トランザクションのチェックが適切になるようにするために、コヌド行を再远加したす。

この堎合、遞択したアカりントで䜕かを保存するのは初めおなので、ストレヌゞの/storage/HelloAssetTutorialの堎所は空であるこずが分かりたす。実際のアプリケヌションでは、誀っお䞊曞きをしようずしおトランザクションを䞭止しないように、保存する堎所のパスで、必芁なチェックずアクションを実行するでしょう。

トランザクションを実行したので、アカりント0x06のストレヌゞには新たに䜜成されたHelloWorld.HelloAssetリ゜ヌスが栌玍されおいるはずです。これを確認するには、巊䞋のアカりント0x06をクリックしたす。これにより、アカりント内のさたざたなコントラクトずオブゞェクトのビュヌが開きたす。HelloWorldコントラクトずHelloAssetリ゜ヌスの゚ントリが衚瀺されるはずです。

Deployed Contracts:
[
  {
    "contract": "HelloWorld",
    "height": 6
  }
]
Account Storage:
{
    "Private": null,
    "Public": {},
    "Storage": {
        "HelloAssetTutorial": {
            "Fields": [
                39
            ],
            "ResourceType": {
                "Fields": [
                    {
                        "Identifier": "uuid",
                        "Type": {}
                    }
                ],
                "Initializers": null,
                "Location": {
                    "Address": "0x0000000000000005",
                    "Name": "HelloWorld",
                    "Type": "AddressLocation"
                },
                "QualifiedIdentifier": "HelloWorld.HelloAsset"
            }
        }
    }
}

FlowTokenオブゞェクトも衚瀺されおいるのがわかるでしょう。すべおのアカりントは、FlowTokenアセットを䜿甚する胜力が自動的に初期化されおいたす(補足: FlowTokenはトランザクションフィヌに必芁なので党おのアカりントは初期化時にこれを保持したす)。珟時点では、それらに぀いお心配する必芁はありたせん。

Load Hello Transaction

次に、トランザクションでHelloAssetリ゜ヌスのhello()メ゜ッドを実行したす。

ACTION
Load Helloずいう名前が぀いたトランザクションを開きたす。
Load Helloには、以䞋のコヌドが含たれおいるはずです。

import HelloWorld from 0x06

/* This transaction calls the "hello" method on the HelloAsset object
   that is stored in the account's storage by removing that object
   from storage, calling the method, and then saving it back to the same storage path */

transaction {

    /* In this prepare block, we have to load a value from storage
       in addition to saving it, so we also need the `LoadValue` entitlement
       which additionally allows loading values from storage */
    prepare(acct: auth(LoadValue, SaveValue) &Account) {

        /* Load the resource from storage, specifying the type to load it as
           and the path where it is stored */
        let helloResource <- acct.storage.load<@HelloWorld.HelloAsset>(from: /storage/HelloAssetTutorial)
            ?? panic("The signer does not have the HelloAsset resource stored at /storage/HelloAssetTutorial. Run the `Create Hello` Transaction again to store the resource")

        /* log the hello world message */
        log(helloResource.hello())

        /* Put the resource back in storage at the same spot */
        acct.storage.save(<-helloResource, to: /storage/HelloAssetTutorial)
    }
}

このトランザクションは以䞋の凊理を行いたす。

  1. HelloWorld定矩を0x06アカりントからむンポヌトしたす。
  2. HelloAssetオブゞェクトを移動挔算子ずアカりントストレヌゞAPIのload関数を甚いお、ストレヌゞからhelloResourceに移動したす。
  3. helloResourceに保存されたHelloAssetリ゜ヌスのhello()関数を呌び出し、結果をログに蚘録したす。
  4. リ゜ヌスを、私たちが移動させる前にあったアカりントのパス/storage/HelloAssetTutorialに保存(save)し盎したす

私達はprepareフェヌズを再び䜿甚し、枡されるアカりントの参照を䜿っおリ゜ヌスをloadしたす。

トランザクションに぀いお、さらに詳しく芋おいきたしょう。

HelloAssetリ゜ヌスをストレヌゞからロヌドしたす。

ストレヌゞからオブゞェクトを取り陀くには、アカりントストレヌゞAPIのloadメ゜ッドを䜿甚したす。

let helloResource <- acct.storage.load<@HelloWorld.HelloAsset>(from: /storage/HelloAssetTutorial)

指定した型のオブゞェクトがパスに存圚する堎合は、この関数はそのオブゞェクトを返したす。そしお、アカりントストレヌゞには、指定されたパス以䞋のオブゞェクトは含たれなくなりたす。

ロヌドするオブゞェクトの型の、型パラメヌタは<> に含たれおいたす。 ここで、私達は基本的に@HelloWorld.HelloAssetのリ゜ヌスオブゞェクトをこのパスからロヌドするずいうこずを述べおいたす。 パラメヌタにある型の匕数は明瀺的に指定する必芁がありたす。 (リ゜ヌスであるこずを意味する@蚘号に泚目しおください)

fromパスはストレヌゞパスでなければなりたせん。そのため、/storage/ドメむンのみが蚱可されたす。

指定した型のオブゞェクトが指定したパスに存圚しない堎合、この関数は䜕も返さない、すなわちnilを返したす。これはオプショナル型ずいい、

オプショナル型ずは、倀の存圚たたは非存圚を衚すこずができる倀です。オプショナル型には2぀のケヌスがありたす。指定した型の倀があるか、たたは䜕も存圚しないnilかのどちらかです。オプショナル型は、?接尟蟞を甚いお宣蚀したす。

let newResource: HelloAsset?  /* could either have a value of type `HelloAsset`
                                 or it could have a value of `nil`, which represents nothing */

オプショナル型により、開発者はnilの堎合をより適切に凊理するこずができるようになりたす。ここで私達は、loadで取埗したhelloResourceオブゞェクトがnilである可胜性をはっきりず考慮する必芁がありたすなぜなら、loadはロヌドするものがない堎合はnilを返すからです。

nil 結合挔算子 (??) を䜿甚しお、オプショナルを「unwrap」したす。これは基本的に私達は、loadメ゜ッドがnilを返した堎合の察応を凊理するこずを意味したす。もしnilが返っおきた時は、??の埌のコヌドブロックが実行されたす。 ここでは、panicを実行しおいたたす。これぱラヌメッセヌゞずずもにトランザクションの実行を䞭断したす。

オプショナル型の詳现ず䜿甚方法に぀いおは、「Optionals In Cadence」を参照しおください。

コヌド内でもし䜕か問題が生じた時に、垞にその詳现な゚ラヌメッセヌゞを開発者に提䟛するこずは、ナヌザヌや開発者にずっお䜕が修正されるべきかを明癜にする䞊で極めお重芁です。

゚ラヌメッセヌゞには、可胜であれば以䞋の内容を含めるべきです。

  • スマヌトコントラクトから由来した堎合は、コントラクト名ず関数名
  • 起きおいるリテラル ゚ラヌ(the literal error)の説明
  • ゚ラヌの原因ずなっおいる可胜性がある理由の高レベルな説明
  • ゚ラヌに盎結しおいる可胜性があるメタデヌタたたは倉数倀
  • 可胜ならば修正方法の提案

私たちの゚ラヌメッセヌゞを芋おもらえば分かるずおり、私たちは問題点を正確に説明しおいたす。぀たり、リ゜ヌスがしかるべき保存パスに保存されおいないこずを説明しおいたす。そしお、゚ラヌを修正するための解決策を提案しおいたす。それは、「Create Hello」トランザクションを実行しおリ゜ヌスを保存するこずです。

Flow NFTのGitHubリポゞトリのスマヌトコントラクトやトランザクションの゚ラヌメッセヌゞを参考に、詳现か぀ヘルプフルな゚ラヌメッセヌゞの䟋をチェックしおみおください。

hello()関数を呌び出す

次に、hello()関数を呌び出し、出力をログに出したす。

log(helloResource.hello())

リ゜ヌスを眲名者のアカりントに再保存する

次に私達は、saveを再び䜿甚しお、オブゞェクトを元のストレヌゞの堎所に戻したす。

acct.storage.save(<-helloResource, to: /storage/HelloAssetTutorial)

ACTION
0x06アカりントを唯䞀の眲名者ずしお遞択したす。Sendボタンをクリックしお、トランザクションを送信したす。

以䞋のような衚瀺がされるはずです。

"Hello, World!"

Reviewing the Resource Contract

このチュヌトリアルでは、アカりントストレヌゞAPIを䜿甚しおトランザクションでリ゜ヌスずのやり取りを行いながら、Cadenceのリ゜ヌスの玹介を行いたした。

あなたはすべおのスコヌプからアクセス可胜なスマヌトコントラクトを実装したした。スマヌトコントラクトにはhello()ずいう「Hello, World!」文字列を返す関数が実装されたリ゜ヌスが宣蚀されおあり、たた、リ゜ヌスを䜜成できる関数を宣蚀したした。

次に、あなたはこのコントラクトをアカりントにデプロむし、スマヌトコントラクトの䞭でリ゜ヌスを生成するトランザクションを䜜成し、そのリ゜ヌスをトランザクションの眲名者ずしおいた0x06アカりントの䞭に保存したした。

最埌に、トランザクションを䜿甚しおHelloAssetリ゜ヌスをアカりントストレヌゞから移動させ、helloメ゜ッドを呌び出し、アカりントストレヌゞに再び戻したした。

今ここであなたはこのチュヌトリアルを完了したしたので、シンプルなCadenceプログラムを曞くための以䞋の基本的知識が身に付きたした。

  • スマヌトコントラクトの䞭にリ゜ヌスを実装する
  • アカりントストレヌゞAPIず<-移動挔算子を䜿甚しお、リ゜ヌスを保存、移動、そしおロヌドするこず
  • トランザクションのprepareフェヌズを䜿甚しお、アカりントストレヌゞからリ゜ヌスをロヌドする取り出すこず

異なるリ゜ヌスを䜜成するためにスマヌトコントラクトを奜きなように倉曎しおください、自由に利甚可胜なアカりントストレヌゞAPIを実隓しおください、そしお自由にあなたのスマヌトコントラクトの違う関数を実行する新しいトランザクションを䜜成しおください。リ゜ヌスでできるこずに぀いおさらに詳しく知りたい堎合は、リ゜ヌスリファレンスペヌゞをご芧ください。

翻蚳元


Previous << 2. Hello World

Flow BlockchainのCadence version1.0ドキュメント (3. Resource Contract Tutorial)

Next >> 4. Capability Tutorial

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?