SmartWeave Contract Logicの謎を解く [Community Labs]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/d0b87b89-62b0-4648-b221-8dceb38a3c24.png)

:::note info
本記事は下記の翻訳となります。
[『Demystifying the SmartWeave Contract Logic』](https://www.communitylabs.com/blog/demystifying-the-smartweave-contract-logic)（by Community Labs）
:::

## スマートコントラクトの理解: Arweave 上での構築

Arweave でのスマートコントラクトの構文を見たことがありますか？今日はそれを理解していきます！

## はじめに

まずは、ユーザーが Arweave 上でスマートコントラクトを記述できる標準を定めるプロトコルについて簡単に理解しましょう。

**SmartWeave**は、開発者が分散型アプリケーション（dApp）のためにスマートコントラクトを記述し、ブロックチェーンのセキュリティ、信頼性、透明性を提供しながら、**Ethereum のようなプラットフォームに関連する計算制限や高い取引手数料を排除する**ことができます。

Arweave の上に構築されているため、Arweave が提供する**永続性**と**分散化**の利点を活用することができます。

## 評価メカニズム

SmartWeave は、**Lazy Evaluation**というメカニズムに依存しているため、特にユニークです。

**SmartWeave コントラクトはステートを持つ**ものであり、ステートとそのステートを変更するためのロジックが保存されます。したがって、各コントラクトには次の 2 つが必要です：

1. 初期ステート
2. ステートを変更するためのコントラクトロジック

コントラクトには、関連する**アクション（相互作用）の順序付きリスト**もあります。これらのアクションはすべてユーザーがそのステートを変更するためにリクエストしたものです。

コントラクトとそのトランザクションの評価は、ユーザーが新しいリクエストを投稿したいときにのみ必要です。加えて、負担はノードからユーザー側にシフトされます。

初期ステートから、ユーザーはアクションを順番に評価し、コントラクトロジックを参照して現在のステートを導き出します。

関数型プログラミングに関して言えば、**評価方法は reduce 操作に基づいています**。

reduce は 2 つの引数を取ります：累積子（accumulator）と現在の要素（currentElement）であり、現在の要素に基づいて累積子にロジックを適用して更新された累積子の値を返します。

次の例を見てみましょう：

```javascript
const numbers = [1, 2, 3, 4, 5];

// Reducer関数
const sum = (accumulator, currentValue) => accumulator + currentValue;

// reduceを使って配列の全ての値を合計
const totalSum = numbers.reduce(sum, 0); // 0は累積子の初期値

// totalSumの出力: 15
```

ここで、`sum`という reduce 関数が、`accumulator`と`currentValue`を受け取り、各ステップで`currentValue`を`accumulator`に加算して更新します。

すべての要素が処理された後、`reduce()`関数は最終的な累積子の値（合計）を返します。つまり、**要素の配列を、提供された reducer 関数に基づいて 1 つの値に縮小します**。

同様に、SmartWeave コントラクトは次のようにステートと現在のアクションを受け取ります：

```javascript
// 初期値としてsum変数を0に設定
initState = { sum: 0 };

// 合計計算用のコントラクトロジック
export async function handle(state, action) {
  state.sum = state.sum + action.input.value;
}
```

ユーザーがスマートコントラクトにトランザクションリクエストを投稿する場合、最初にこれまでのすべての相互作用を処理し、ステートを 1 つの値、つまり**現在のステート**に縮小しなければなりません。

現在のステートを受け取った後、ユーザーは自分のアクションリクエストを評価して提出することができます。

## SmartWeave コントラクトの利点

SmartWeave が Arweave エコシステムにもたらす特徴的な利点をいくつか見てみましょう：

- ノードからユーザーに評価の負担が移るため、**高い取引手数料**（ガス代）を経験することなく、取引手数料を**排除**できます。他のチェーンのように計算リソースを巡って競争する必要はありません！
- **コントラクト**は、**reduce 操作の速さで**実行し、現在のステートを返すことができます。**ユーザー**は、他のチェーンが直面する計算制限に依存することなく、**必要に応じて複雑さを定義**できます。
- ユーザー側での評価のもう 1 つの利点は、**任意のスケーラビリティでコントラクトを作成できる**点です。
- ユーザーはコントラクトの評価に使用する実行環境を選択でき、**サポートする言語でコントラクトを書く自由**を享受できます。
- **reduce 操作はさまざまな操作（条件分岐、マッピング、フィルタリングなど）を実装でき**、これによりコントラクトがシナリオに応じて異なるロジック（サブ関数）を選択する際に役立ちます。
- SmartWeave 標準から進化した関数型パターンとして、**ステートを変更するロジックを持つ親コントラクトを参照できる**、各コントラクトインスタンスが独自の初期ステートと相互作用を持つことができます。
- **コントラクトの初期ステートは不変**です。コントラクトの相互作用は評価され、現在のステートのみが返されます（必要な場合）。これはコンテキストの保存に役立ちます。

まとめると、**SmartWeave 標準のスマートコントラクト構築**は、**任意の複雑さのコントラクトを自由に構築でき、必要な言語で記述でき、シンプルなアーキテクチャと手数料なしでオンチェーン実行**できる点で、他のチェーンと**差別化**されています。

**Arweave でスマートコントラクトを構築してみようと思ったことはありますか？今がそのチャンスです。**

自分のビルドを共有するか、[Twitter](https://twitter.com/CommunityLabs)でサポートを求めてください :)

**楽しい構築を！**

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::