Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
actions-user committed Jul 14, 2024
2 parents 3dd8a10 + 5768a98 commit 7accf74
Show file tree
Hide file tree
Showing 54 changed files with 1,803 additions and 0 deletions.
5 changes: 5 additions & 0 deletions Languages/ja/01_HelloWeb3_ja/HelloWeb3.sol
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!";}

Binary file added Languages/ja/01_HelloWeb3_ja/img/1-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Languages/ja/01_HelloWeb3_ja/img/1-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Languages/ja/01_HelloWeb3_ja/img/1-3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
90 changes: 90 additions & 0 deletions Languages/ja/01_HelloWeb3_ja/readme.md
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)
48 changes: 48 additions & 0 deletions Languages/ja/02_ValueTypes_ja/ValueTypes.sol
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);
}
}

Binary file added Languages/ja/02_ValueTypes_ja/img/2-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Languages/ja/02_ValueTypes_ja/img/2-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Languages/ja/02_ValueTypes_ja/img/2-3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
162 changes: 162 additions & 0 deletions Languages/ja/02_ValueTypes_ja/readme.md
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における変数型を紹介しました。値型、参照型、マッピング型、関数型です。次によく使われる値型にある型を紹介しました: 真偽値型、整数型、アドレス型、固定長型バイト配列型、列挙型です。この後のチュートリアルで他の型について取り上げます。
40 changes: 40 additions & 0 deletions Languages/ja/03_Function_ja/Function.sol
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;
}
}
Binary file added Languages/ja/03_Function_ja/img/3-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Languages/ja/03_Function_ja/img/3-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Languages/ja/03_Function_ja/img/3-3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Languages/ja/03_Function_ja/img/3-4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 7accf74

Please sign in to comment.