# Solidity(待整理)
## Define version
- 指定版本介於0.6.0-0.9.0
`pragma solidity >=0.6.0 <0.9.0;`
- 指定版本為 0.6.0
`pragma solidity 0.6.0;`
- 指定版本為0.6.X (<0.7)
`pragma solidity ^0.6.0;`
## Define contract
similar to `class` in OOP language
```solidity
contract contractname{
...
}
```
## Type & Declaring Variables
[ref](https://docs.soliditylang.org/en/v0.8.20/types.html)
| Type| content |
|---|---|
|bool | true, false|
|int8-256/uint8-256 | 2**(8-256) -1 ~ 0(initialized to 0 if not assign)|
|address|wallet address|
|bytes1-32|**fixed** size, sequence of bytes from 1 to up to 32.|
|bytes|**Dynamically**-sized byte array|
|string|**Dynamically**-sized UTF-8-encoded string|
struct
mapping(dict)
## Functions & Variables Visibility
#### `External`
**can't** be called by the same contract
#### `Public`
can be called by anyone
#### `Internal` (default)
can only be called by the other functions inside of the same contract, or in its derrived contract.
#### `Private`
only visible for the contract they are define in and not contracts
## View & Pure
Don't have to make transaction
### View
Read some state of blockchain
### Pure
Do some type of math
```solidity
function funcname() visibility view/pure returns(){
}
```
## Memory & Storage
### Memory
Data will only be stored during the execution of the function or if the contract call.
> After execution, delete this data.
### Storage
Data will persist even after the function executes.
> Keep it forever
## Payable (red button)
This kind of function can be used to pay for things.
## require(condition)
stop contracts from executing unless some certain parameters are met.
## transfer()
msg.sender.transfer(address(this).balance)
transfer eth to mag.sender
## Modifier
Is used to change the behavior of a func in a declarative way.
ex:
modifier onlyOwner{
require(msg.sender == owner)
_;
}
Before you run a func, run require first.
'_' means run rest of the code.
## for loop
for(;;)
## Deploy contract
1. Build the contract deploy transaction
2. Sign the transaction
3. Send the transaction