PythonとBrownieを使ったWeb3 DApp本格開発
Python、Brownie、Solidity、その他のアシスタント モジュールを使用して Web3 DApp を開発する方法を学びます。おみくじや宝くじゲームを例に考えてみましょう
この記事では、Python、Brownie、Solidity、およびその他のアシスタント ソフトウェアを使用して Web3 DApp を開発する方法を共有します。このアプリケーションは基本的に、Crypto を使用してブロックチェーン ネットワークを通じて抽選を行うことができます。これは、ホストが宝くじゲームを設定し、それに料金を払って参加するプレーヤーがランダムに賞品を獲得できるかどうかを決める、その他の福引ゲームのようなものです。
Web3 DApp本格開発の材料
Python、Brownie、Solidity、Openzeppelink、Ethereum、Ganache-CLI、MetaMask、Alchemy、Chainlink、Etherscan
宝くじ応募サンプルの目次
- Solidity と Chainlink、Openzeppelink を使用してスマート コントラクトを開発する
- 宝くじアプリケーションのメイン デプロイメントおよびアシスタント Python スクリプト
- モック、VRF、およびリンク トークン テスト コントラクトの追加
- 残りの重要なコンポーネント – config YAML と env
- 単体テスト
- 本物のネットワークに接続して稼働させる
- Web3 DAppフルスケールのフルPythonとSolidityスクリプト – 抽選応募事例
- よくある質問
Solidity と Chainlink を使用してスマート コントラクトを開発する
マルチネットワークと統合された宝くじ DApp の主なフローは次のとおりです。
- ユーザーは宝くじ資金に参加できます
- 抽選は自動的に開始および終了します
- アプリケーションは勝者をランダムに選択できます
スマート コントラクトには、この DApp 開発ロジックに関して共有する必要がある重要な部分がいくつかあります。
1. Solidityスマートコントラクトに機能を追加して宝くじの論理フローを作成する
宝くじのスマート コントラクトでは、基本的にプレイの旅程には少なくとも次のものが含まれます。
- 通貨金額を入力してください
- 取引手数料を受け取る
- 宝くじを始めましょう
- 宝くじを終了する
- ランダム性関数を満たす
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;
}
編集済み!!
宝くじアプリケーションのメイン デプロイメントおよびアシスタント 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
-
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 にアクセスして最新バージョンをコピーし、それを契約フォルダーに個別に貼り付ける必要があります。サンプルは次のとおりです。
価格フィードアドレス、リンクトークンキー、キーハッシュ、および料金については、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 を使用したイーサリアムへのデプロイに関する以前の記事を参照してください。
Web3 DApp フルスケールの完全な Python と Solidity スクリプト – 宝くじアプリケーション
Web3 DApp Lottory のスクリプトの完全なセットに興味がある場合は、 「Web3.0 チュートリアル 5」というメッセージを追加してニュースレターを購読してください。 。スクリプトはすぐにあなたのメールボックスに送信されます。
『Pythonとブラウニーを使ったWeb3 DApp本格開発 – もくじ』を楽しんで読んでいただければ幸いです。もしそうなら、以下にリストされているいずれかの方法で私たちをサポートしてください。それは常に私たちのチャンネルに役立ちます。
- PayPal を通じて私のチャンネルをサポートし、寄付してください ( paypal.me/Easy2digital )
- 私のチャンネルを購読し、 Easy2Digital Youtube チャンネルの通知ベルをオンにしてください。
- Easy2Digital Facebook ページをフォローして「いいね!」してください
- ハッシュタグ #easy2digital を付けて記事をソーシャル ネットワークで共有してください
- Easy2Digital の最新記事、ビデオ、割引コードを受け取るには、毎週のニュースレターに登録してください。
- Patreon を通じて月額メンバーシップに登録すると、限定特典をお楽しみいただけます ( www.patreon.com/louisludigital )
よくある質問:
Q1: ブラウニーはどのような商品ですか?
A: ブラウニーはチョコレートを主成分とした焼き菓子です。
Q2: ブラウニーの原材料は何ですか?
A: ブラウニーの主な原材料はチョコレート、バター、卵、小麦粉、砂糖です。
Q3: ブラウニーはどのように食べるのがおすすめですか?
A: ブラウニーは温かい状態で食べることがおすすめです。また、アイスクリームやクリームを添えても美味しくいただけます。
Q4: ブラウニーの賞味期限はどれくらいですか?
A: ブラウニーの賞味期限は一般的には製造日から1週間程度です。
Q5: ブラウニーは冷蔵庫で保存する必要がありますか?
A: ブラウニーは常温で保存しても問題ありませんが、冷蔵庫で保存するとより長く新鮮な状態を保つことができます。
Q6: ブラウニーはアレルギー対応商品ですか?
A: ブラウニーには主要なアレルゲン成分(小麦、卵、乳製品)が含まれていますので、アレルギーをお持ちの方はご注意ください。
Q7: ブラウニーはギフトに適していますか?
A: ブラウニーは美味しいお土産やプレゼントとしても喜ばれることが多いです。
Q8: ブラウニーは何種類のフレーバーがありますか?
A: ブラウニーにはチョコレートフレーバー、ナッツ入り、フルーツ入りなど、さまざまなフレーバーがあります。
Q9: ブラウニーは自宅で作ることができますか?
A: ブラウニーは比較的簡単に自宅で作ることができます。レシピや調理法はインターネットや料理本で見つけることができます。
Q10: ブラウニーはベジタリアン向け商品ですか?
A: ブラウニーにはバターなどの動物性成分が含まれている場合がありますので、ベジタリアンの方は原材料を確認することをおすすめします。