# Aleph Zeroでのプライベート投票dApp構築：ステップバイステップガイド

## **イントロダクション**

このチュートリアルでは、Aleph Zeroのブロックチェーンエコシステムを活用してプライベート投票dAppを設計・構築する方法を解説します。具体的には、Rustベースのフレームワークであるink!を使用してバックエンドのスマートコントラクトを開発し、それをReactフロントエンドに接続してユーザーが操作できるようにします。このガイドは初心者に優しく、詳細に説明されているため、ブロックチェーン開発が初めての方でも理解しやすい内容となっています。

#  **前提条件**

開始する前に、以下のツールがシステムにインストールされていることを確認してください：

1\. **Rustおよびink!**: スマートコントラクト開発用（[Rustのインストール](https://rustup.rs/)）。  

<table><tbody><tr><td colspan="1" rowspan="1"><p><code>&nbsp; rustup install stable<br>&nbsp; rustup target add wasm32-unknown-unknown</code></p></td></tr></tbody></table>

2\. **Cargo-contract**: ink!スマートコントラクトをビルドおよびデプロイするためのユーティリティ。    

<table><tbody><tr><td colspan="1" rowspan="1"><p><code>&nbsp; cargo install cargo-contract --force --locked</code></p></td></tr></tbody></table>

3\. **Node.jsおよびnpm**: フロントエンド開発用（[Node.js公式サイト](https://nodejs.org)）。 

4\. **Aleph Zeroウォレット**: アカウント管理用（[Aleph Zeroウォレットのダウンロード](https://azero.dev)）。  

5\. **テストネットトークン**: [Aleph Zero Faucet](https://faucet.alephzero.org)から取得可能。  

# **バックエンド：スマートコントラクト開発**

### **ステップ1: 新しいink!プロジェクトを初期化**

新しいプロジェクトを作成し、cargo-contractを使用して初期化します。  

<table><tbody><tr><td colspan="1" rowspan="1"><p><code>cargo contract new private-voting<br>cd private-voting</code></p></td></tr></tbody></table>

### ステップ2: スマートコントラクトコード

以下は、ウォレットベースのゲーティングと編集可能な投票をサポートするプライベート投票dAppのink!コードです。

<table><tbody><tr><td colspan="1" rowspan="1"><p><code>#![cfg_attr(not(feature = "std"), no_std)]<br><br>use ink::prelude::vec::Vec;<br>use ink::storage;<br><br>#[ink::contract]<br>mod private_voting {<br>&nbsp; &nbsp; #[ink(storage)]<br>&nbsp; &nbsp; pub struct PrivateVoting {<br>&nbsp; &nbsp; &nbsp; &nbsp; votes: storage::Mapping&lt;AccountId, String&gt;,<br>&nbsp; &nbsp; &nbsp; &nbsp; voter_whitelist: Vec&lt;AccountId&gt;,<br>&nbsp; &nbsp; &nbsp; &nbsp; is_open: bool,<br>&nbsp; &nbsp; }<br><br>&nbsp; &nbsp; impl PrivateVoting {<br>&nbsp; &nbsp; &nbsp; &nbsp; #[ink(constructor)]<br>&nbsp; &nbsp; &nbsp; &nbsp; pub fn new(voters: Vec&lt;AccountId&gt;) -&gt; Self {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Self {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; votes: storage::Mapping::default(),<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; voter_whitelist: voters,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; is_open: true,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp; &nbsp; #[ink(message)]<br>&nbsp; &nbsp; &nbsp; &nbsp; pub fn cast_vote(&amp;mut self, choice: String) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let caller = self.env().caller();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; assert!(self.voter_whitelist.contains(&amp;caller), "Unauthorized voter");<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; assert!(self.is_open, "Voting is closed");<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.votes.insert(caller, &amp;choice);<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp; &nbsp; #[ink(message)]<br>&nbsp; &nbsp; &nbsp; &nbsp; pub fn close_voting(&amp;mut self) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.is_open = false;<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br><br>&nbsp; &nbsp; &nbsp; &nbsp; #[ink(message)]<br>&nbsp; &nbsp; &nbsp; &nbsp; pub fn get_vote(&amp;self, voter: AccountId) -&gt; Option&lt;String&gt; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.votes.get(voter)<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; }<br>}</code></p></td></tr></tbody></table>

  
**ステップ3: ビルドとデプロイ**

コントラクトをデプロイ用にビルドします。

<table><tbody><tr><td colspan="1" rowspan="1"><p><code>cargo contract build</code></p></td></tr></tbody></table>

コンパイルされた.contractファイルをAleph ZeroのテストネットにウォレットインターフェースまたはCLIツールを使用してデプロイします。

  

# **フロントエンド開発**

### **ステップ1: Reactアプリケーションをセットアップ**

フロントエンドインターフェース用にReactアプリを初期化します。

<table><tbody><tr><td colspan="1" rowspan="1"><p><code>npx create-react-app private-voting-ui<br>cd private-voting-ui</code></p></td></tr></tbody></table>

### **ステップ2: 依存関係のインストール**

Aleph Zeroのブロックチェーンとやり取りするためのSDKをインストールします。

<table><tbody><tr><td colspan="1" rowspan="1"><p><code>npm install aleph-zero-js-sdk</code></p></td></tr></tbody></table>

### **ステップ3: フロントエンド機能**

1\. **ウォレット接続**: 認証のためにユーザーがAleph Zeroウォレットを接続できるようにします。  

2\. **投票インターフェース**: dAppインターフェースを通じてユーザーが投票または投票の更新を行えるようにします。 

3\. **結果表示**: 選挙終了後に集計または個別の投票結果を表示します。

### **ステップ4: コードスニペット例**

以下は、cast\_vote関数を呼び出す方法を示すコードスニペットです。

<table><tbody><tr><td colspan="1" rowspan="1"><p><code>import { AlephZeroAPI } from 'aleph-zero-js-sdk';<br><br>const castVote = async (choice) =&gt; {<br>&nbsp; const alephZero = new AlephZeroAPI();<br>&nbsp; const contract = alephZero.contractInstance('your_contract_address_here');<br><br>&nbsp; await contract.invoke({<br>&nbsp; &nbsp; method: 'cast_vote',<br>&nbsp; &nbsp; args: [choice],<br>&nbsp; &nbsp; signer: userWallet,<br>&nbsp; });<br>};</code></p></td></tr></tbody></table>

# **投票スマートコントラクトのデプロイ**  

スマートコントラクトを作成し、Aleph Zeroウォレットを設定したら、次のステップとしてAleph Zeroテストネットにデプロイします。以下の手順に従って、デプロイプロセスを完了してください：  

### **1\. ウォレットをテストネットに接続**  

* Aleph Zeroウォレット拡張機能を開き、Aleph Zeroテストネットに接続されていることを確認します。
    
* アカウントに、ファウセットから取得した十分なテストトークンがあることを確認してください。  
    

### **2\. デプロイを開始**

* 提供されたデプロイツール（例：Aleph Zero SDKやRemixのようなIDE）を使用します。
    
* トランザクションの認証を求められた際には、Aleph Zero Signerを使用して承認します。
    

### **3\. デプロイの承認** 

* デプロイプロセス中に、Aleph Zero Signerのインターフェースが表示され、トランザクションの承認を求められます。
    

**フィールドの説明**

* **From**: トランザクションを開始するウォレットアドレス。
    
* **Module**: 呼び出されるモジュール。この場合、「Balances」。
    
* **Call**: 実行される具体的なアクション（例：「Transfer」または「Deploy」）。
    
* **Amount**: 転送または使用されるテストトークンの数量。
    
* **Target**: 受信者アドレスまたはスマートコントラクトアドレス。
    
* **Password**: トランザクションを確定するためにアカウントパスワードを入力します。  
    

### **4\. トランザクションの署名**  

* 「Password for this account」フィールドにパスワードを入力します。
    
* 「Remember password for 15 minutes」ボックスをチェック（任意）。
    
* **Sign**をクリックしてデプロイを進めます。  
    

### **5\. デプロイ成功の確認**  

  署名後、トランザクションが完了するまで待ちます。スマートコントラクトが正常にデプロイされると、確認メッセージが表示されます。

  

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXf9c26iGhCFZ2HUDwB3Mjm_e2QgQVKnAY9jGOA0868xdlLPEU9oUUBv9EUAOddDNJ9vvGgGUfIDRpzbt_j7GxPQT_ITXr-sbbztmUIC-Vp2jWArytbEalVG7b8SFO6RyrksWCWYVA?key=5A9NSAWatTBHDgR49z8iV8h0 align="left")

**テストネットでトランザクション認証に使用されるAleph Zero Signerインターフェース。**

  
  

# **Aleph Zeroテストネットでのテスト**

1\. スマートコントラクトをデプロイし、そのアドレスを取得します。  

2\. SDKを使用して、フロントエンドをデプロイ済みのコントラクトに接続します。  

3\. 投票、投票の編集、投票プロセスの終了など、すべての機能をテストします。  

  

# **初心者へのヒント**

* Aleph Zeroの公式ドキュメントを活用して、コード例やデプロイのヒントを確認してください。
    
* テストネット上で徹底的にテストを行い、すべてのコンポーネントがスムーズに動作することを確認します。
    
* シンプルさを重視しましょう。高度な機能は将来のアップデートで追加可能です。
    

  
  

# **結論**

このガイドは、プライベート投票dAppを構築するための包括的なロードマップを提供します。Wave 4では、これらの手順を理解し、文書化することに集中してください。Wave 5では、スケーラビリティと追加機能の強化を伴うdAppの実装を進めていきます。
