forked from WTFAcademy/WTF-Solidity
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' of https://github.com/AmazingAng/WTF-Solidity
- Loading branch information
Showing
54 changed files
with
1,803 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.21; | ||
contract HelloWeb3{ | ||
string public _string = "Hello Web3!";} | ||
|
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
# WTF Solidity 超シンプル入門: 1. HelloWeb3 (Solidityを3行で) | ||
|
||
最近、Solidity の学習を再開し、詳細を確認しながら「Solidity 超シンプル入門」を作っています。これは初心者向けのガイドで、プログラミングの達人向けの教材ではありません。毎週 1〜3 レッスンのペースで更新していきます。 | ||
|
||
僕のツイッター:[@0xAA_Science](https://twitter.com/0xAA_Science)|[@WTFAcademy\_](https://twitter.com/WTFAcademy_) | ||
|
||
コミュニティ:[Discord](https://discord.gg/5akcruXrsk)|[Wechat](https://docs.google.com/forms/d/e/1FAIpQLSe4KGT8Sh6sJ7hedQRuIYirOoZK_85miz3dw7vA1-YjodgJ-A/viewform?usp=sf_link)|[公式サイト wtf.academy](https://wtf.academy) | ||
|
||
すべてのソースコードやレッスンは github にて公開: [github.com/AmazingAng/WTFSolidity](https://github.com/AmazingAng/WTFSolidity) | ||
|
||
----- | ||
|
||
## Solidityとは? | ||
|
||
`Solidity` はEVM(Ethereum Virtual Machine)上でスマートコントラクトを作成する為に使われるプログラミング言語です。ブロックチェーンのプロジェクトで仕事を行う上で不可欠なスキルであり、それに加えて、その多くがオープンソースである為、コードを理解することによって赤字プロジェクトとなることを避けることに役立ちます。 | ||
|
||
|
||
`Solidity` が持つ2つの特徴: | ||
|
||
1. オブジェクト指向: Solidityを身に付けた後、適切なプロジェクトを探し出すことでお金を稼ぐことが出来るようになります。 | ||
3. 上級者向け: Solidityでスマートコントラクトを書くことが出来れば、 Ethereumの世界で第一級の市民権を得ることが出来ます。 | ||
|
||
## 開発者ツール: Remix | ||
|
||
このチュートリアルでは、`solidity`のコントラクトを実行する為に、`Remix`を使用します。`Remix`とはEthereum公式が推奨しているスマートコントラクト統合開発環境(IDE)のことです。初心者に適しており、ローカルPCに何もプログラムをインストールすることなく、素早くデプロイしてブラウザ内でスマートコントラクトをテストすることが出来ます。 | ||
|
||
Website: [remix.ethereum.org](https://remix.ethereum.org) | ||
|
||
`Remix`に入ると、左側のメニューに、ファイル(コードを書く場所)、コンパイル(コードを実行する場所)、デプロイ(ブロックチェーン上にデプロイする場所)の3つのボタンがあることが分かります。"Create New File"ボタンをクリックすることで、空の`solidity`コントラクトを作成することが出来ます。 | ||
|
||
Remixに入ると、左端の垂直メニューに、FILE EXPLORER (コードを書く場所)、SEARCH IN FILES (ファイルを検索したり置換したりする場所)、SOLIDITY COMPILER (コードを実行する場所)、そしてDEPLOY & RUN TRANSACTIONS (オンチェーンに対してのデプロイを行う場所)があることがわかります。 "Create New File"ボタンをクリックすることで、空の`solidity`コントラクトを作成することが出来ます。 | ||
|
||
![Remix Menu](./img/1-1.png) | ||
|
||
## はじめてのSolidityプログラム | ||
|
||
これは1行のコメントと3行のコードのみを含む簡単なプログラムです。 | ||
|
||
```solidity | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.21; | ||
contract HelloWeb3{ | ||
string public _string = "Hello Web3!";} | ||
``` | ||
|
||
次に、ソースコードを詳細に分解して分析し、基本的な構造を理解していきます。 | ||
|
||
1. 最初の行はコメントです。プログラムによって使用されているソフトウェアライセンス(ライセンス識別子)を示しています。MITライセンスを使うことにします。もし、使用されているライセンスを記載しなかった場合、プログラムは上手くコンパイルが出来るのですが、コンパイルの最中に警告が表示されます。Solidityのコメントは"//"で示され、その後にコメントの内容が続きます(プログラムによって実行されることはありません)。 | ||
|
||
```solidity | ||
// SPDX-License-Identifier: MIT | ||
``` | ||
|
||
2. 第一に、2行目はソースファイルによって使用されているSolidityのバージョンを宣言しています。というのも、バージョンによって文法が異なっているからです。このコードの行はソースファイルが0.8.21未満または0.9.0以上バージョンのコンパイラーでコンパイルを許可しないことを意味しています(最初のVersion0.8.21以上ならばコンパイルを許可するという条件は`^`によって提供されます)。Solidityステートメントはセミコロン(;)で終了します。 | ||
|
||
|
||
```solidity | ||
pragma solidity ^0.8.21; | ||
``` | ||
|
||
3. 3行目と4行目はスマートコントラクトの本体です。3行目は`HelloWeb3`という名前でコントラクトを作成しています。4行目に関しては、コントラクトの内容です。ここでは、`_string`と呼ばれる文字列型の変数を作成し、その値として"Hello Web3!"を割り当てています。 | ||
|
||
```solidity | ||
contract HelloWeb3{ | ||
string public _string = "Hello Web3!";} | ||
``` | ||
後ほど、Solidityにある様々な変数を紹介しますね。 | ||
|
||
## コードのコンパイルとデプロイ | ||
|
||
コードエディターで、CTRL+Sを行い、コードをコンパイルします。 | ||
|
||
コンパイルした後で、左側のメニューにある`Deploy`ボタンをクリックしてデプロイのページに入ってください。 | ||
|
||
![](./img/1-2.png) | ||
|
||
デフォルトでは、Remixはブラウザ上でテストネットを実行するのと同様に、JavaScript仮想マシンをしようしてEthereumチェーンをシミュレートしてスマートコントラクトを実行します。Remixはそれぞれに100ETH(テスト用のトークン)を持つ、幾つかのテスト用アカウントをあなたに割り当てます。`Deploy`(黄色のボタン)をクリックしてコントラクトをデプロイすることが出来ます。 | ||
|
||
![](./img/1-3.png) | ||
|
||
デプロイが成功すれば、`HelloWeb3`という名前のコントラクトが下の方に出てくることが分かります。`_string`という変数をクリックすることで、その値を表示させます:`Hello Web3!"。 | ||
|
||
## まとめ | ||
|
||
このチュートリアルでは、簡単に`Solidity`、`Remix` IDEを紹介し、最初のSolidityのプログラム`HelloWeb3`を完成させました。今後も、Solidityの旅を続けていきます。 | ||
|
||
### 推奨されるSolidityに関する資料: | ||
|
||
1. [Solidity Documentation](https://docs.soliditylang.org/en/latest/) | ||
2. [Solidity Tutorial by freeCodeCamp](https://www.youtube.com/watch?v=ipwxYa-F1uY) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.21; | ||
contract ValueTypes{ | ||
// Boolean | ||
bool public _bool = true; | ||
// Boolean operators | ||
bool public _bool1 = !_bool; // logical NOT | ||
bool public _bool2 = _bool && _bool1; // logical AND | ||
bool public _bool3 = _bool || _bool1; // logical OR | ||
bool public _bool4 = _bool == _bool1; // equality | ||
bool public _bool5 = _bool != _bool1; // inequality | ||
|
||
|
||
// Integer | ||
int public _int = -1; | ||
uint public _uint = 1; | ||
uint256 public _number = 20220330; | ||
// Integer operators | ||
uint256 public _number1 = _number + 1; // +,-,*,/ | ||
uint256 public _number2 = 2**2; // exponent | ||
uint256 public _number3 = 7 % 2; // modulo (modulus) | ||
bool public _numberbool = _number2 > _number3; // greater than | ||
|
||
|
||
// Address data type | ||
address public _address = 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71; | ||
address payable public _address1 = payable(_address); // payable address (allows for token transfer and balance checking) | ||
// Members of addresses | ||
uint256 public balance = _address1.balance; // balance of address | ||
|
||
|
||
// Fixed-size byte arrays | ||
bytes32 public _byte32 = "MiniSolidity"; // bytes32: 0x4d696e69536f6c69646974790000000000000000000000000000000000000000 | ||
bytes1 public _byte = _byte32[0]; // bytes1: 0x4d | ||
|
||
|
||
// Enumeration | ||
// Let uint 0, 1, 2 represent Buy, Hold, Sell | ||
enum ActionSet { Buy, Hold, Sell } | ||
// Create an enum variable called action | ||
ActionSet action = ActionSet.Buy; | ||
|
||
// Enum can be converted into uint | ||
function enumToUint() external view returns(uint){ | ||
return uint(action); | ||
} | ||
} | ||
|
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,162 @@ | ||
# WTF Solidity 超シンプル入門: 2. Value Type(値型) | ||
|
||
最近、Solidity の学習を再開し、詳細を確認しながら「Solidity 超シンプル入門」を作っています。これは初心者向けのガイドで、プログラミングの達人向けの教材ではありません。毎週 1〜3 レッスンのペースで更新していきます。 | ||
|
||
僕のツイッター:[@0xAA_Science](https://twitter.com/0xAA_Science)|[@WTFAcademy\_](https://twitter.com/WTFAcademy_) | ||
|
||
コミュニティ:[Discord](https://discord.gg/5akcruXrsk)|[Wechat](https://docs.google.com/forms/d/e/1FAIpQLSe4KGT8Sh6sJ7hedQRuIYirOoZK_85miz3dw7vA1-YjodgJ-A/viewform?usp=sf_link)|[公式サイト wtf.academy](https://wtf.academy) | ||
|
||
すべてのソースコードやレッスンは github にて公開: [github.com/AmazingAng/WTFSolidity](https://github.com/AmazingAng/WTFSolidity) | ||
|
||
----- | ||
|
||
## 変数の型 | ||
|
||
1. **値型**:boolean型、integer型などを含みます。 これらの変数は代入時には、直接的に値を渡します。 | ||
|
||
2. **参照型**:配列と構造体があります。これらの変数はより多くのスペースを取り、代入された際には直接アドレスを渡し(ポインタに似ている)、複数の変数名で変更出来る。 | ||
|
||
3. **マッピング型**: Solidityにおけるハッシュテーブル。 | ||
|
||
4. **関数型**:Solidityのドキュメントでは関数は値型に分類されている。しかし、他の型とは全くことなっており、別のカテゴリーに分類した。 | ||
|
||
ここではよく使われる型のみ紹介する予定です。この章では、値型について見ていきましょう。 | ||
|
||
## 値型 | ||
|
||
### 1. Boolean(真偽値型) | ||
|
||
Booleanはバイナリ変数で、その値は`true`か`false`です。 | ||
|
||
```solidity | ||
// Boolean | ||
bool public _bool = true; | ||
``` | ||
|
||
Boolean型の演算子には次のものがあります: | ||
|
||
- `!` (logical NOT)「論理否定」 | ||
- `&&` (logical AND)「論理積」 | ||
- `||` (logical OR) 「論理和」 | ||
- `==` (equality) 「等価」 | ||
- `!=` (inequality) 「不等式」 | ||
|
||
ソースコード: | ||
|
||
```solidity | ||
// Boolean operators | ||
bool public _bool1 = !_bool; // logical NOT | ||
bool public _bool2 = _bool && _bool1; // logical AND | ||
bool public _bool3 = _bool || _bool1; // logical OR | ||
bool public _bool4 = _bool == _bool1; // equality | ||
bool public _bool5 = _bool != _bool1; // inequality | ||
``` | ||
|
||
上記のソースコードより: 変数`_bool`の値は`true`; `_bool1`は`_bool`じゃないので、`false`となる; `_bool && _bool1`は`false`; `_bool || _bool1`は`true`; `_bool == _bool1`は`false`; そして`_bool != _bool1`は`true`となります。 | ||
|
||
**重要なノート:** `&&`と`||`演算子は短絡評価(short-circuit evaluation)のルールに従います。これはすなわち、例えば`f(x) || g(y)`のような表記があった場合、もし`f(x)`が`true`だったなら、`g(y)`が評価されないということです。 | ||
|
||
### 2. Integers(整数型) | ||
SolidityのInteger型には符号付き整数`int`と符号なし整数`uint`があります。 最大256ビット型の整数やデータユニットを格納出来ます。 | ||
|
||
```solidity | ||
// Integer | ||
int public _int = -1; // integers including negative numbers | ||
uint public _uint = 1; // non-negative numbers | ||
uint256 public _number = 20220330; // 256-bit positive integers | ||
``` | ||
よく使われる整数向け演算子には次のものがあります: | ||
|
||
- 不等式演算子(Booleanを返します): `<=`, `<`, `==`, `!=`, `>=`, `>` | ||
- 算術演算子: `+`, `-`, `*`, `/`, `%` | ||
- Arithmetic operator: `+`, `-`, `*`, `/`, `%` (modulo[モジュロ、剰余]), `**` (指数) | ||
|
||
ソースコード: | ||
|
||
```solidity | ||
// Integer operations | ||
uint256 public _number1 = _number + 1; // +, -, *, / | ||
uint256 public _number2 = 2**2; // Exponent | ||
uint256 public _number3 = 7 % 2; // Modulo (Modulus) | ||
bool public _numberbool = _number2 > _number3; // Great than | ||
``` | ||
|
||
上記のソースコードを実行し、各変数の値をチェックすることが出来ます。 | ||
|
||
### 3. Addresses(アドレス型) | ||
|
||
アドレスは次の2つの種類があります: | ||
- `address`: 20バイトの値を保持します(イーサリアムアドレスのサイズです)。 | ||
|
||
- `address payable`: `address`と同じですが、`transfer`と`send`というメンバを付与することによって、ETHの転送を可能にします。 | ||
(メンバ:あるオブジェクトが持つ属性や関数のことで、ここではメンバ関数のこと。) | ||
|
||
ソースコード: | ||
|
||
```solidity | ||
// Address | ||
address public _address = 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71; | ||
address payable public _address1 = payable(_address); // payable address (can transfer fund and check balance) | ||
// Members of address | ||
uint256 public balance = _address1.balance; // balance of address | ||
``` | ||
|
||
### 4. Fixed-size byte arrays(固定サイズのバイト配列型) | ||
|
||
Solidityのバイト配列には2つの種類があります: | ||
|
||
- 固定長のバイト配列: それぞれの要素のサイズ(最大32バイト)によって`byte`や`bytes8`, `bytes32`などを含む値型に属しています。配列の長さは宣言された後で変更されることは出来ません。 | ||
|
||
- 可変長バイト配列: `bytes`などを含み、参照型に属しています。配列の長さは宣言された後で変更することが可能です。後の章で詳しく学んでいきます。 | ||
|
||
ソースコード: | ||
|
||
```solidity | ||
// Fixed-size byte arrays | ||
bytes32 public _byte32 = "MiniSolidity"; | ||
bytes1 public _byte = _byte32[0]; | ||
``` | ||
|
||
上記のソースコードでは、`MiniSolidity`という値を変数`_byte32`に代入しました。即ち、16進数では: `0x4d696e69536f6c69646974790000000000000000000000000000000000000000` | ||
|
||
そして変数`_byte`は`_byte32`の最初のバイトの値を取ります。そして、その値とは`0x4d`です。 | ||
|
||
### 5. Enumeration(列挙型) | ||
|
||
列挙 (`enum`) はSolidityの中でユーザー定義型データです。主に`uint`に名前を割り当てる為に使われ、プログラムを読みやすくしています。 | ||
|
||
ソースコード: | ||
|
||
```solidity | ||
// Let uint 0, 1, 2 represent Buy, Hold, Sell | ||
enum ActionSet { Buy, Hold, Sell } | ||
// Create an enum variable called action | ||
ActionSet action = ActionSet.Buy; | ||
``` | ||
|
||
`uint`に容易に変換出来ます。 | ||
|
||
```solidity | ||
// Enum can be converted into uint | ||
function enumToUint() external view returns(uint){ | ||
return uint(action); | ||
} | ||
``` | ||
|
||
`enum`はそこまでSolidityではポピュラーな型ではありません。 | ||
|
||
## Remixでのデモ | ||
|
||
- コントラクトをデプロイした後、各変数の値をチェック出来ます。 | ||
|
||
![2-1.png](./img/2-1.png) | ||
|
||
- enumとuintの間の変換は次の通りです: | ||
|
||
![2-2.png](./img/2-2.png) | ||
|
||
![2-3.png](./img/2-3.png) | ||
|
||
## まとめ | ||
|
||
この章では、Solidityにおける変数型を紹介しました。値型、参照型、マッピング型、関数型です。次によく使われる値型にある型を紹介しました: 真偽値型、整数型、アドレス型、固定長型バイト配列型、列挙型です。この後のチュートリアルで他の型について取り上げます。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.21; | ||
contract FunctionTypes{ | ||
uint256 public number = 5; | ||
|
||
constructor() payable {} | ||
|
||
// function type | ||
// function (<parameter types>) {internal|external} [pure|view|payable] [returns (<return types>)] | ||
// default function | ||
function add() external{ | ||
number = number + 1; | ||
} | ||
|
||
// pure: not only does the function not save any data to the blockchain, but it also doesn't read any data from the blockchain. | ||
function addPure(uint256 _number) external pure returns(uint256 new_number){ | ||
new_number = _number+1; | ||
} | ||
|
||
// view: no data will be changed | ||
function addView() external view returns(uint256 new_number) { | ||
new_number = number + 1; | ||
} | ||
|
||
// internal: the function can only be called within the contract itself and any derived contracts | ||
function minus() internal { | ||
number = number - 1; | ||
} | ||
|
||
// external: function can be called by EOA/other contract | ||
function minusCall() external { | ||
minus(); | ||
} | ||
|
||
//payable: money (ETH) can be sent to the contract via this function | ||
function minusPayable() external payable returns(uint256 balance) { | ||
minus(); | ||
balance = address(this).balance; | ||
} | ||
} |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.