概要
前回の記事で、
Solidity + Truffle + Ganache + Nextjsの構成でWeb3アプリ構築を行う際の手順を記事にしました。
その時はバックエンドとなるSolidityのプログラム自体には言及しなかったので、今回少しだけ言及しようと思います。
Solidity のスマートコントラクト
Truffleを用いてTruffle initすると、
- contracts
- migrations
- test
- truffle-config.js
が生成されます。
このうち、実際のスマートコントラクトのロジックが書かれるのは、
contractsフォルダの中です。
こちらのファイルを少しだけ今回は解説します。
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.15;
この最初の宣言はテンプレートとして考えて良いでしょう。
ライセンスに関する記述と、Solidityのバージョンをpragma によって指定します。
contract Transactions {
uint256 transactionCount;
event Transfer(address from, address receiver, uint amount, string message, uint256 timestamp);
struct TransferStruct {
address sender;
address receiver;
uint amount;
string message;
uint256 timestamp;
}
次に、contract の内容となるTransactionsを実装していきます。
transactionCount は、スマートコントラクトによって何件の取引が行われたかの総数を管理するプロパティです。
次に、event Transferは、実際に呼ばれるチェーン側のAPIで、どのアドレスからどのアドレスにどのくらいETHを送信するか、というAPIになっています。クライアントから直接呼ばれることはないですが、
クライアントから呼ばれた関数の中で呼ばれるプレイベート関数と考えて大丈夫です。
TransferStruct[] transactions;
function addToBlockchain(address payable receiver, uint amount, string memory message) public {
transactionCount += 1;
transactions.push(TransferStruct(msg.sender, receiver, amount, message, block.timestamp));
emit Transfer(msg.sender, receiver, amount, message, block.timestamp);
}
TransferStruct[] transactions; は、全てのトランザクションを保存したアレイで、
履歴をクライアント側から参照するために使用します。
function addToBlockchain はクライアント側から実際に呼ばれるAPIで、
(address payable receiver, uint amount, string memory message)
を引数として取ります。
address payable receiverはETHを送信する先のアドレスであり、
payableキーワードは、このアドレスがETHを受け取ることのできるアドレスであるということを表記しています。
string memory messageのmemoryキーワードに関しては、今の所はつけるべきキーワードという理解しかしていません。
Transfer(msg.sender) によってチェーン上のETHの取引が行われます。
msgキーワードはSolidityによるキーワードです。
function getAllTransactions() public view returns (TransferStruct[] memory) {
return transactions;
}
function getTransactionCount() public view returns (uint256) {
return transactionCount;
}
}
getAllTransactions, getTransactionCount はどちらも取引を行うAPIではないため、
viewというキーワードが付けられています。(つまりこのAPIについてはガスを払わなくても良い。)
以上で簡単ではありますが、一通りの説明となります。
まとめ
今回は、自分が初めて作ったSolidity スマートコントラクトをバックエンドとしたWeb3アプリの、
スマートコントラクトのプログラムの中身の自分なりの解釈について書いてみました。
今回は簡単なロジックのみが実装されたスマートコントラクトでしたが、
次回はもっと複雑なものも構成してみたいと考えています。
みなさんも楽しいweb3ライフを。
今回はこの辺で。