概要
前回の記事で、
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ライフを。
今回はこの辺で。