外部契約との相互作用
スマートコントラクトは、イーサリアムブロックチェーン上の他の契約とやり取りすることができ、関数を呼び出したり、変数を読み取ったり、イーサまたはトークンを送ったりすることができます。このやり取りを容易にする方法の1つは、Ethereumと連携するための軽量なJavaライブラリであるWeb3jを使用することです。Web3jはスマートコントラクトのラッパーコードを自動生成することができ、JVMからのスマートコントラクトのシームレスな展開ややり取りを実現します。
Web3jを使用して外部契約とやり取りするには、まずスマートコントラクトをコンパイルしてラッパーコードを生成する必要があります。その後、スマートコントラクトを作成して展開するか、既存の契約を使用して、スマートコントラクトのメソッドを直接呼び出すことが簡単にできます。
イベントとログ
イベントは、ブロックチェーン上のスマートコントラクトの活動を追跡および監視するために重要です。イベントは、オフチェーンシステムによって後で取得できるログを発行する方法を提供します。イベントを使用すると、特定の契約イベントや状態変数の変更を追跡しやすくなり、リアルタイムのアップデートが必要なdApps(分散型アプリケーション)に特に役立ちます。
ログはイベントによって発生したレコードであり、ブロックチェーン上に保存されます。ログは、スマートコントラクトとオフチェーンシステム間の効率的な通信を可能にするため、イーサリアムエコシステムの重要な部分です。ログはインデックスもされており、特定のイベントやデータポイントをフィルタリングや検索することが容易になっています。
例: RemixとMetaMaskを使用してスマートコントラクトをデプロイする
ステップ1:Remix IDEを開く
最初に、Remix IDEを開きます(https://remix.ethereum.org/)をWebブラウザーで開く。
ステップ2:新しいファイルを作成します
IDEの左上隅にある「+」ボタンをクリックして、新しい空白のワークスペースを作成します。次に、「新しいファイル」ページをクリックして新しいファイルを作成します。
ファイル名を「Auction.sol」としてください。
ステップ3:契約を定義する
新しい「Auction.sol」ファイルに以下のコードをコピーして貼り付けてください:
TypeScript// SPDX-License-Identifier: MIT// Solidity versionpragma solidity を指定 ^0.8.0;// オークションを定義します contractcontract auction { // 状態変数を宣言します addresspayable public owner; // コントラクトの所有者 (オークションをキャンセルできます) uint public startBlock; // オークションが開始されるブロック番号 uint public endBlock; // オークションが終了するブロック番号 string public ipfsHash; // オークションにかけられるアイテムの IPFS ハッシュ bool public canceled; オークションがキャンセルされたかどうか、公開が終了しました。オークションが終了したかどうか uint public highestBid;これまでの最高入札額は、支払可能なpublic highestBidderに対処します。最高入札者の住所 // イベントを宣言 event AuctionCanceled();オークションがキャンセルされたときに発行されるイベント event HighestBidIncrease(address bidder, uint amount);新しい最高入札価格が設定されたときに発行されるイベント event AuctionEnded(address winner, uint amount);オークション終了時に発行されるイベント // マッピングを宣言します mapping(address => uint256) public balances; コンストラクタ function constructor() { owner = payable(msg.sender); // 所有者をコントラクトを展開するアドレスに設定 startBlock = block.number; // 開始ブロックを現在のブロック番号に設定 endBlock = startBlock + 40320; // 終了ブロックを開始ブロックの 1 週間後 (40320 ブロック) に設定 ipfsHash = "";IPFSハッシュを空の文字列に初期化します } // 入札を行う関数 placeBid() public payable { require(block.number >= startBlock && block.number <= endBlock, "Auction is not active."); // オークションがアクティブであることを確認します require(msg.value > highestBid, "There is already a higher bid."); // 新しい入札額が現在の最高入札額よりも高いことを確認します require(!canceled, "Auction is canceled."); // オークションがキャンセルされていないことを確認します 以前に最高入札者がいた場合、その入札額を残高に加算します if (highestBidder != address(0)) { balances[highestBidder] += highestBid; } // 新しい最高入札額と入札者を設定します highestBid = msg.value; highestBidder = payable(msg.sender); 新しい最高入札額が設定されたことを通知するイベントを発生させる emit HighestBidIncrease(msg.sender, msg.value); } // オークションをキャンセルする関数 cancelAuction() public { require(msg.sender == owner, "Only the owner can cancel the auction."); // 送信者がオーナーであることを確認する require(!ended, "Auction has already ended."); // オークションが終了していないか確認する // canceled フラグを設定し、オークションがキャンセルされたことを知らせるイベントを発行する canceled = true; AuctionCanceled()を出力します。 } // オークションを終了する関数 endAuction() public { require(block.number > endBlock, "オークションはまだ終わっていません。"); // オークションが終了したことを確認する require(!canceled, "オークションはキャンセルされました。"); // オークションがキャンセルされていないことを確認する require(!ended, "オークションは既に終了しています。"); // オークションが終了していないか確認する // 終了フラグを設定し、オークションが終了したことを知らせるイベントを発生させる ended = true; AuctionEnded(highestBidder, highestBid)を出力します。 最高入札額をオーナーに譲渡 owner.transfer(highestBid); 過去に最高入札者がいた場合、その入札額を残高に加算 if (highestBidder != address(0)) { balances[highestBidder] += highestBid; } } // オークションに出品されるアイテムのIPFSハッシュを設定する関数 setIpfsHash(string memory hash) public { require(msg.sender == owner, "Only the owner can set the IPFS hash."); // 送信者が所有者であることを確認する ipfsHash = hash; // IPFS ハッシュを指定された値に設定する }}
このコードは、オークション
契約は、ユーザーが商品に入札できるようにし、指定された期間後にオークションを終了させる機能を持っています。 契約には、オークションをキャンセルする機能や、オークション対象のアイテムにIPFSハッシュを設定する機能もあります。
ステップ4:契約をコンパイルする
左側のメニューで「Solidity Compiler」タブをクリックします。「Auction.sol」をコンパイルする場合は、「Compile」ボタンをクリックします。コントラクトは正常にコンパイルされ、ファイルエクスプローラーの「Auction.sol」の横に緑のチェックマークが表示されるはずです。
ステップ5:契約を展開する
左側のメニューで「デプロイ&トランザクション実行」タブをクリックします。「環境」の下で、環境として「Injected Web3」を選択します。「コントラクト」の下で、デプロイする契約として「オークション」を選択します。「デプロイ」ボタンをクリックします。
ステップ 6: コントラクトを操作する
契約が展開されると、契約で定義されたさまざまな機能を使用してそれとやり取りすることができます。たとえば、placeBid()
アイテムに入札する機能
RemixとMetaMaskを使用することで、Ethreumネットワーク上でスマートコントラクトを簡単にデプロイしてインタラクトでき、ユーザーフレンドリーな環境で分散型アプリケーションの開発とテストを可能にします。
ハイライト
スマートコントラクトは、イーサリアムブロックチェーン上の他のコントラクトとやり取りすることができ、関数の呼び出し、変数の読み取り、Etherまたはトークンの送金が可能です。
Web3jは、イーサリアムとの相互作用を容易にする軽量のJavaライブラリです。スマートコントラクトのラッパーコードを自動生成して、JVMからのコントラクトをシームレスにデプロイし、コントラクトと対話することができます。
イベントは、ブロックチェーン上の契約活動を追跡および監視するために不可欠です。これらはログを生成し、オフチェーンシステムによって格納および取得され、dAppsのリアルタイムの更新を可能にします。
ログは、イベントによって発生したレコードであり、スマートコントラクトとオフチェーンシステム間の効率的なコミュニケーションにおいて重要な役割を果たしています。 インデックスが付けられており、特定のイベントやデータポイントを簡単にフィルタリングや検索することができます。
提供された例は、Remix IDEとMetaMaskを使用してスマートコントラクトを展開する過程を示しています。新しいファイルを作成し、契約を定義し、コンパイルし、展開し、その機能とやり取りするなどの手順が含まれています。
外部契約との相互作用
スマートコントラクトは、イーサリアムブロックチェーン上の他の契約とやり取りすることができ、関数を呼び出したり、変数を読み取ったり、イーサまたはトークンを送ったりすることができます。このやり取りを容易にする方法の1つは、Ethereumと連携するための軽量なJavaライブラリであるWeb3jを使用することです。Web3jはスマートコントラクトのラッパーコードを自動生成することができ、JVMからのスマートコントラクトのシームレスな展開ややり取りを実現します。
Web3jを使用して外部契約とやり取りするには、まずスマートコントラクトをコンパイルしてラッパーコードを生成する必要があります。その後、スマートコントラクトを作成して展開するか、既存の契約を使用して、スマートコントラクトのメソッドを直接呼び出すことが簡単にできます。
イベントとログ
イベントは、ブロックチェーン上のスマートコントラクトの活動を追跡および監視するために重要です。イベントは、オフチェーンシステムによって後で取得できるログを発行する方法を提供します。イベントを使用すると、特定の契約イベントや状態変数の変更を追跡しやすくなり、リアルタイムのアップデートが必要なdApps(分散型アプリケーション)に特に役立ちます。
ログはイベントによって発生したレコードであり、ブロックチェーン上に保存されます。ログは、スマートコントラクトとオフチェーンシステム間の効率的な通信を可能にするため、イーサリアムエコシステムの重要な部分です。ログはインデックスもされており、特定のイベントやデータポイントをフィルタリングや検索することが容易になっています。
例: RemixとMetaMaskを使用してスマートコントラクトをデプロイする
ステップ1:Remix IDEを開く
最初に、Remix IDEを開きます(https://remix.ethereum.org/)をWebブラウザーで開く。
ステップ2:新しいファイルを作成します
IDEの左上隅にある「+」ボタンをクリックして、新しい空白のワークスペースを作成します。次に、「新しいファイル」ページをクリックして新しいファイルを作成します。
ファイル名を「Auction.sol」としてください。
ステップ3:契約を定義する
新しい「Auction.sol」ファイルに以下のコードをコピーして貼り付けてください:
TypeScript// SPDX-License-Identifier: MIT// Solidity versionpragma solidity を指定 ^0.8.0;// オークションを定義します contractcontract auction { // 状態変数を宣言します addresspayable public owner; // コントラクトの所有者 (オークションをキャンセルできます) uint public startBlock; // オークションが開始されるブロック番号 uint public endBlock; // オークションが終了するブロック番号 string public ipfsHash; // オークションにかけられるアイテムの IPFS ハッシュ bool public canceled; オークションがキャンセルされたかどうか、公開が終了しました。オークションが終了したかどうか uint public highestBid;これまでの最高入札額は、支払可能なpublic highestBidderに対処します。最高入札者の住所 // イベントを宣言 event AuctionCanceled();オークションがキャンセルされたときに発行されるイベント event HighestBidIncrease(address bidder, uint amount);新しい最高入札価格が設定されたときに発行されるイベント event AuctionEnded(address winner, uint amount);オークション終了時に発行されるイベント // マッピングを宣言します mapping(address => uint256) public balances; コンストラクタ function constructor() { owner = payable(msg.sender); // 所有者をコントラクトを展開するアドレスに設定 startBlock = block.number; // 開始ブロックを現在のブロック番号に設定 endBlock = startBlock + 40320; // 終了ブロックを開始ブロックの 1 週間後 (40320 ブロック) に設定 ipfsHash = "";IPFSハッシュを空の文字列に初期化します } // 入札を行う関数 placeBid() public payable { require(block.number >= startBlock && block.number <= endBlock, "Auction is not active."); // オークションがアクティブであることを確認します require(msg.value > highestBid, "There is already a higher bid."); // 新しい入札額が現在の最高入札額よりも高いことを確認します require(!canceled, "Auction is canceled."); // オークションがキャンセルされていないことを確認します 以前に最高入札者がいた場合、その入札額を残高に加算します if (highestBidder != address(0)) { balances[highestBidder] += highestBid; } // 新しい最高入札額と入札者を設定します highestBid = msg.value; highestBidder = payable(msg.sender); 新しい最高入札額が設定されたことを通知するイベントを発生させる emit HighestBidIncrease(msg.sender, msg.value); } // オークションをキャンセルする関数 cancelAuction() public { require(msg.sender == owner, "Only the owner can cancel the auction."); // 送信者がオーナーであることを確認する require(!ended, "Auction has already ended."); // オークションが終了していないか確認する // canceled フラグを設定し、オークションがキャンセルされたことを知らせるイベントを発行する canceled = true; AuctionCanceled()を出力します。 } // オークションを終了する関数 endAuction() public { require(block.number > endBlock, "オークションはまだ終わっていません。"); // オークションが終了したことを確認する require(!canceled, "オークションはキャンセルされました。"); // オークションがキャンセルされていないことを確認する require(!ended, "オークションは既に終了しています。"); // オークションが終了していないか確認する // 終了フラグを設定し、オークションが終了したことを知らせるイベントを発生させる ended = true; AuctionEnded(highestBidder, highestBid)を出力します。 最高入札額をオーナーに譲渡 owner.transfer(highestBid); 過去に最高入札者がいた場合、その入札額を残高に加算 if (highestBidder != address(0)) { balances[highestBidder] += highestBid; } } // オークションに出品されるアイテムのIPFSハッシュを設定する関数 setIpfsHash(string memory hash) public { require(msg.sender == owner, "Only the owner can set the IPFS hash."); // 送信者が所有者であることを確認する ipfsHash = hash; // IPFS ハッシュを指定された値に設定する }}
このコードは、オークション
契約は、ユーザーが商品に入札できるようにし、指定された期間後にオークションを終了させる機能を持っています。 契約には、オークションをキャンセルする機能や、オークション対象のアイテムにIPFSハッシュを設定する機能もあります。
ステップ4:契約をコンパイルする
左側のメニューで「Solidity Compiler」タブをクリックします。「Auction.sol」をコンパイルする場合は、「Compile」ボタンをクリックします。コントラクトは正常にコンパイルされ、ファイルエクスプローラーの「Auction.sol」の横に緑のチェックマークが表示されるはずです。
ステップ5:契約を展開する
左側のメニューで「デプロイ&トランザクション実行」タブをクリックします。「環境」の下で、環境として「Injected Web3」を選択します。「コントラクト」の下で、デプロイする契約として「オークション」を選択します。「デプロイ」ボタンをクリックします。
ステップ 6: コントラクトを操作する
契約が展開されると、契約で定義されたさまざまな機能を使用してそれとやり取りすることができます。たとえば、placeBid()
アイテムに入札する機能
RemixとMetaMaskを使用することで、Ethreumネットワーク上でスマートコントラクトを簡単にデプロイしてインタラクトでき、ユーザーフレンドリーな環境で分散型アプリケーションの開発とテストを可能にします。
ハイライト
スマートコントラクトは、イーサリアムブロックチェーン上の他のコントラクトとやり取りすることができ、関数の呼び出し、変数の読み取り、Etherまたはトークンの送金が可能です。
Web3jは、イーサリアムとの相互作用を容易にする軽量のJavaライブラリです。スマートコントラクトのラッパーコードを自動生成して、JVMからのコントラクトをシームレスにデプロイし、コントラクトと対話することができます。
イベントは、ブロックチェーン上の契約活動を追跡および監視するために不可欠です。これらはログを生成し、オフチェーンシステムによって格納および取得され、dAppsのリアルタイムの更新を可能にします。
ログは、イベントによって発生したレコードであり、スマートコントラクトとオフチェーンシステム間の効率的なコミュニケーションにおいて重要な役割を果たしています。 インデックスが付けられており、特定のイベントやデータポイントを簡単にフィルタリングや検索することができます。
提供された例は、Remix IDEとMetaMaskを使用してスマートコントラクトを展開する過程を示しています。新しいファイルを作成し、契約を定義し、コンパイルし、展開し、その機能とやり取りするなどの手順が含まれています。