blog details
author


blog detail

この記事では、Python、Brownie、Solidity、およびその他のアシスタント ソフトウェアを使用して Web3 DApp を開発する方法を共有します。このアプリケーションは基本的に、Crypto を使用してブロックチェーン ネットワークを通じて抽選を行うことができます。これは、ホストが宝くじゲームを設定し、それに料金を払って参加するプレーヤーがランダムに賞品を獲得できるかどうかを決める、その他の福引ゲームのようなものです。

Web3 DApp本格開発の材料

Python、Brownie、Solidity、Openzeppelink、Ethereum、Ganache-CLI、MetaMask、Alchemy、Chainlink、Etherscan

宝くじ応募サンプルの目次

Solidity と Chainlink を使用してスマート コントラクトを開発する

マルチネットワークと統合された宝くじ DApp の主なフローは次のとおりです。

  • ユーザーは宝くじ資金に参加できます
  • 抽選は自動的に開始および終了します
  • アプリケーションは勝者をランダムに選択できます

スマート コントラクトには、この DApp 開発ロジックに関して共有する必要がある重要な部分がいくつかあります。

1. Solidityスマートコントラクトに機能を追加して宝くじの論理フローを作成する

宝くじのスマート コントラクトでは、基本的にプレイの旅程には少なくとも次のものが含まれます。

  • 通貨金額を入力してください
  • 取引手数料を受け取る
  • 宝くじを始めましょう
  • 宝くじを終了する
  • ランダム性関数を満たす

blog detail

2. mainnet-fork envとテスト スクリプトを作成して、宝くじスマート コントラクト機能をテストします。

ポイント 2 について話す前に、プラグマ 0.8 ではmsg.sender が自動的に支払われなくなっていることに注意してくださいmsg.senderしたがって、次のように最初に支払い可能にする必要があります。

players.push(payable(msg.sender));

ローカル環境にmainnet-fork networkのテストを追加するために、ここではホストとして Alchemyを使用します。

このコマンドのリストをターミナルに入力するだけです。

brownie networks add development main net-fork cmd=ganache-cli host=http://127.0.0.1 fork=https://eth-mainnet.g.alchemy.com/v2/abcabc accounts=10 mnemonic=brownie port=8545

getEntraceFee 関数を例に考えてみましょう。これは、brownie test –network mainnet-forkを実行したテスト結果です。

テスト スクリプトについては、「Web3.0 DApp フル スクリプト チュートリアル 5」というメッセージを残して Easy2Digital ニュースレターを購読してください。間もなく送信されます。

3. ENUM ステートメントを追加する

宝くじの場合、宝くじの開始、終了、勝者の計算という 3 つのシナリオを設定する必要があります。コードは次のとおりです。

enum LOTTERY_STATE {
OPEN,
CLOSED,
CALCULATING_WINNER
}
LOTTERY_STATE public lottery_state;

次に、宝くじの開始については、ゲーム プレーヤーに電話をかける権利があるのではなく、電話をかけることができるオーナーのみを要求します。このために、オープン ツェッペリンを使用してスマート コントラクト所有者ソルをインポートできます。

import "@openzeppelin/contracts/access/Ownable.sol";
function startLottery() public onlyOwner {
require(lottery_state == LOTTERY_STATE.CLOSED, "Can't start a new lottery yet!")
lottery_state = LOTTERY_STATE.OPEN;
};

また、 brownie-config.yaml 、必ず最新のオープン ツェッペリン バージョンを使用してください。たとえば、私のバージョンは 4.8.0 です。

- OpenZeppelin/openzeppelin-contracts@4.8.0

4. ランダム性

宝くじが開始された後は、結果をランダムに生成する必要があります。したがって、この機能を実行して結果を提供するには、乱数パッケージが必要です。

import "@chainlink/contracts/src. /v0.8/VRFConsumerBase.sol";

ランダム性関数とパラメータに基づいて、それらを参照し、スマート コントラクトにデプロイする必要があります。更新箇所は以下の通りです。

契約 –> 抽選機能に VRFConsumerBase を追加する

In the contract, we need to add some global variables as follows:
address payable[] public players;
address payable public recentWinner;
uint256 public randomness;
uint256 public fee;
bytes32 public keyhash;

コンストラクター → 次のように追加します。

contract Lottery is VRFConsumerBase, Ownable {
address payable[] public players;
address payable public recentWinner;
uint256 public randomness;
uint256 public usdEntryFee;
AggregatorV3Interface internal ethUsdPriceFeed;
enum LOTTERY_STATE {
OPEN,
CLOSED,
CALCULATING_WINNER
}
LOTTERY_STATE public lottery_state;
uint256 public fee;
bytes32 public keyhash;
constructor(
address _priceFeedAddress,
address _vrfCoordinator,
address _link,
uint256 _fee,
bytes32 _keyhash
) public VRFConsumerBase(_vrfCoordinator, _link) {
usdEntryFee = 50 * (10**18);
ethUsdPriceFeed = AggregatorV3Interface(_priceFeedAddress);
lottery_state = LOTTERY_STATE.CLOSED;
fee = _fee;
keyhash = _keyhash;
}

編集済み!!

blog detail

宝くじアプリケーションのメイン デプロイメントおよびアシスタント Python スクリプト

この Lottory アプリケーションには、デプロイするためのコア Python スクリプトがいくつかあります。詳細は次のとおりです。

1. アカウント、ネットワーク、ウォレットなどの要素選択に関するメイン スクリプト (deploy_lottery.py など)。

1) アカウント識別子とグラバー

def deploy_lottery():
account = get_account(id="easy2digitalAccount")

2) コントラクト、ネットワーク、ウォレット識別子およびグラバー

lottery = Lottery.deploy(
get_contract ("eth_usd_price_feed" ).address,
get_contract ("vrf_coordinator" ).address,
get_contract ("link_token" ).address,
config[ "networks" ][network.show_active()][ "fee" ],
config[ "networks" ][network.show_active()][ "keyhash" ],
{ "from" : account },
publish_source =config[ "networks" ][network.show_active()].get(
"verify" , False ),
)

3) 抽選開始、料金入力、終了に関する機能

デプロイメント関数の抜粋では、Lottery スマート コントラクトで動作する Python スクリプトに start、entry、end 関数も必要です。

  • start_lottery()
  • enter_lottery()
  • end_lottery()

start_lottery()を例に挙げます。

def start_lottery ():
account = get_account ()
lottery = Lottery[- 1 ]
starting_tx = lottery .startLottery({ "from" : account })
starting_tx .wait( 1 )
print ("The lottery has started!!" )

2.scriptAssistant.py

このアシスタント Python ファイルに関しては、Python デプロイ スクリプトの実行をサポートするために使用されます。デプロイメント スクリプトの先頭でこれらをインポートします。

from scripts.scriptAssistant import get_account, get_contract, fund_with_link

アシスタント スクリプトの 4 つの主な関数を次に示します。

  • get_account()
  • get_contract()
  • deploy_mocks()
  • fund_with_links()

Get_account 関数を例に挙げます。

def get_account(index=None, id=None):
if index:
return accounts[index]
if id:
return accounts.load(id)
if (
network.show_active() in LOCAL_BLOCKCHAIN_ENVIRONMENTS or network.show_active(
) in FORKED_LOCAL_ENVIRONMENTS
):
return accounts[0]

モック、VRF、およびリンク トークン テスト コントラクトを追加する

Lottory アプリケーションを構築するためのスマート コントラクト コンストラクターに基づいて、アプリケーションと統合するにはいくつかの外部リソースが必要です。この記事では、リソース サンプルとして Chainlink を取り上げます。必要なコンポーネントは次の 5 つです。

  • 価格フィードアドレス
  • VRFコーディネーター
  • リンクトークン
  • キーハッシュ
  • 料金

Chainlink GitHub にアクセスして最新バージョンをコピーし、それを契約フォルダーに個別に貼り付ける必要があります。サンプルは次のとおりです。

blog detail

価格フィードアドレス、リンクトークンキー、キーハッシュ、および料金については、Chainlink の公式 Web サイトにアクセスして関連情報を調べてください。

残りの重要なコンポーネント – config YAML と env

残りの主要コンポーネントは、Brownie config YAML ファイルと env ファイルです。詳しくは、ファンドミースマートコントラクトに関する前回の記事をご覧ください。基本的には今の抽選アプリと同じ設定です。

Python と Web3 を使用してイーサリアム上にデプロイされたBrownie FundMe スマート コントラクト

単体テスト

以前の記事で述べたように、Brownie が提供する最も強力な機能の 1 つはテスト環境です。間違いなく、準備が整っていることを確認する前にアプリケーションを開始するつもりはありません。したがって、開発している DApp が何であれ、テストは必須のステップです。

テストコンポーネントに関しては、基本的にはスマートコントラクト. の手順に従い、1つずつテストする必要があります。今回は以下の5つのステップをご紹介します。

  • test_get_entrance_fee()
  • test_cant_enter_unless_starter()
  • test_can_enter_unless_starter()
  • test_can_end_lottery()
  • test_can_pick_winner_correctly()

test_get_entrance_fee()例に挙げたみましょう

def test_get_entrance_fee():
if network.show_active() notinLOCAL_BLOCKCHAIN_ENVIRONMENTS:
pytest.skip()
# Arrange
lottery = deploy_lottery()
# Act
expected_entrance_fee = Web3.toWei(0.025, "ether")
entrance_fee = lottery.getEntranceFee()
# Assert
assertexpected_entrance_fee == entrance_fee

本物のネットワークに接続して稼働させる

テストが完了し、すべてがうまくいったら、実際のネットワークに接続して開始します。詳細については、Infura と MetaMask を使用したイーサリアムへのデプロイに関する以前の記事を参照してください。

Python スクリプトで Infura と MetaMask を使用して、Web3 スマート コントラクトを実際のイーサリアム ブロックチェーン ネットワークにデプロイする

Web3 DApp フルスケールの完全な Python とSolidity スクリプト – 宝くじアプリケーション

Web3 DApp Lottory のスクリプトの完全なセットに興味がある場合は、 「Web3.0 チュートリアル 5」というメッセージを追加してニュースレターを購読してください。 。スクリプトはすぐにあなたのメールボックスに送信されます。

『Pythonとブラウニーを使ったWeb3 DApp本格開発 – もくじ』を楽しんで読んでいただければ幸いです。もしそうなら、以下にリストされているいずれかの方法で私たちをサポートしてください。それは常に私たちのチャンネルに役立ちます。

  • PayPal を通じて私のチャンネルをサポートし、寄付してください ( paypal.me/Easy2digital )
  • 私のチャンネルを購読し、 Easy2Digital Y. outube チャンネルの通知ベルをオンにしてください。
  • Easy2Digital Facebook ページをフォローして「いいね!」してください
  • ハッシュタグ #easy2digital を付けて記事をソーシャル ネットワークで共有してください
  • Easy2Digital の最新記事、ビデオ、割引コードを受け取るには、毎週のニュースレターに登録してください。
  • Patreon を通じて月額メンバーシップに登録すると、限定特典をお楽しみいただけます ( www.patreon.com/louisludigital )

Share This Post


よくある質問

ブラウニーはチョコレートを主成分とした焼き菓子です。
ブラウニーの主な原材料はチョコレート、バター、卵、小麦粉、砂糖です。
ブラウニーは温かい状態で食べることがおすすめです。また、アイスクリームやクリームを添えても美味しくいただけます。
ブラウニーの賞味期限は一般的には製造日から1週間程度です。
ブラウニーは常温で保存しても問題ありませんが、冷蔵庫で保存するとより長く新鮮な状態を保つことができます。
ブラウニーには主要なアレルゲン成分(小麦、卵、乳製品)が含まれていますので、アレルギーをお持ちの方はご注意ください。
ブラウニーは美味しいお土産やプレゼントとしても喜ばれることが多いです。
ブラウニーにはチョコレートフレーバー、ナッツ入り、フルーツ入りなど、さまざまなフレーバーがあります。
ブラウニーは比較的簡単に自宅で作ることができます。レシピや調理法はインターネットや料理本で見つけることができます。
ブラウニーにはバターなどの動物性成分が含まれている場合がありますので、ベジタリアンの方は原材料を確認することをおすすめします。

今ありません...

shape shape

ニュースレターにご参加

独占的なオートスタイルコンテンツのアップデートとオファーを入手