Learning Solidity Week 1
3 min readOct 16, 2022
Learn solidity syntax with Cheatsheet docs => https://docs.soliditylang.org/en/v0.8.15/cheatsheet.html
Learn with Example => https://solidity-by-example.org/
…Contract
SPDX license
solidity version
contract => contract <contract_name> { }
Variable
<type> <visibility> <variable_name> = initial_value?
---------------------------------------------------------------State : ตัวแปรใน contract (ไม่ได้อยู่ใน function), เก็บค่าลง block
Local : ตัวแปรในฟังก์ชัน ค่าไม่เก็บลง block
Global : ตัวแปรพิเศษที่ block ให้ smart contract
Global variable example
- block.timestamp => ค่าเวลาของ block
- msg.sender => ค่า address ของคนที่ deploy / execute contract
Variable Type
Primitive Type:
- boolean
- unit
- int
- address => เก็บที่อยู่ของ wallet address / contract address
Visibility of Variable | Function
public | private | internal | external
------------------------------------------------------------ keyword ที่ใช้ในการบอกถึงตัวแปร / function ว่าให้ฟังก์ชันที่สืบทอดสามารถมองเห็นได้หรือไม่
Function
function <fn_name>( <type> _<name> )<visibility> returns (<type>) {}---------------------------------------------------------------
!!! ถ้า parameter / return เป็น array จะต้องระบุ memory เสมอfunction foo(uint[] memory _arr) public returns (uint[] memory) {}
View & Pure
เป็นการระบุว่าฟังก์ชัน ว่าเป็นฟังก์ชันแบบใด
- view => fn แสดงค่าอย่างเดียว, ไม่มีการแก้ไขค่า state_variable
- pure => fn ที่ไม่ยุ่งเกี่ยวกับ state_variable
- ไม่ระบุ => fn มีการเปลี่ยนแปลงค่า state_variable
Returns
การคืนค่าของ function ของ sol สามารถคืนได้มากกว่า 1 ค่า
Gas unit
- Wei
- Gwei
- Ether = n * 10**18 wei---- gas price
- gas limit
if/else
if
else if
ternary operator => x ? a : b
Loop
for
while
do-while
!note => loop มีความเสี่ยงเนื่องจาก แต่ละ loop จะเสีย gas
Mapping
ใช้เก็บข้อมูลเชิง object (key, value)mapping (<key_type>, <value_type>) --- nested mapping ----mapping (<key_type>, mapping(<key_type>, <value_type>))
mapping (address => mapping(unit, bool)) public nestMapaccess: nestMap[_add1][_i] = true
delete key that not use in mapping => delete nestMap[_add1][_i]
Array
<type> [] <visibility> <name><type> [] public arr
---------function arr
- push()
- pop()
- .length
Enum
ประกาศ enum
enum Status {
approve
reject
}approve -> return 0
reject -> return 1-----
ประกาศตัวแปร enum => Status public status;
Struct
ประกาศ struct
struct Todo {string text;
bool completed;}----------
ประกาศตัวแปร struct
Todo[] public todos;Add to arr_struct:
- todos.push( Todo({text: 'txt', completed: true}) )หรือ- todos.push(Todo({'text',true}))!!!! ถ้าต้องการเปลี่ยนแปลงค่าจะใช้ ตัวแปรแบบ storage
ref: https://solidity-by-example.org/structs////Todo public todo
todo.text ='xyz'todos.push(todo)
Data location
storage => เปลี่ยนแปลงตัวแปร state ที่ถูกเก็บบน block memory => สร้างตัวแปรมาอยู่ใน ram จะไม่กระทบค่า state
Error
- require => ตั้ง condition ถ้าไม่เข้าให้ throw string error ออกไป- revert => ไม่ต้องตั้ง condition- assert => ตั้ง condition ที่ตรวจสอบค่าที่มีการเปลี่ยนแปลงใน fn----
custom errorerror <error_name>(argument_value)
Function modifier
การแยกส่วน require เพื่อให้ง่ายต่อการ reusemodifier <name> () {require();
_;
}
---- using
function foo() public <modifier2> <modifier_name1>(arugment) {}
Event
สิ่งที่จะส่งออกจาก function นั้นทำงานเสร็จแล้ว เพื่อเป็นการ log / ให้ code ที่ทำงานอยู่นอก block chain ติดตามการทำงานของ function ได้เช่น มีฟังก์ชันเกี่ยวกับการจ่ายเงิน -> ก็อยากจะทราบว่าการจ่ายเงินนั้นสำเร็จไหม ก็จะเป็นการรอฟัง event เมื่อฟังก์ชันนั้นดำเนินการสำเร็จ---- ประกาศ eventevent Log (address indexed sender, string message)---- การเรียกใช้
function foo () public {
emit Log(msg.sender, "Hello world")
}
!!! ฟังก์ชันใน smart contract ควรใส่ event ไว้เสมอ => เผื่อไว้ว่าให้ด้านนอก blockchain ดัก event ได้ และ !!! จาก case ฟังก์ชันที่มีการแก้ค่า (ไม่ใช่ function view ) เมื่อ fontend เรียก -> มันจะไม่มีการ return ค่าและยังใช้ event กับ subgraph
Constructor
การ set ค่าเริ่มต้น ของ ตัวแปร state เมื่อ smart contract มีการ deploy ไปยัง network
Inheritance
การสืบทอดจะสืบทอดทั้ง
- constructor
- state variable
- function----key wordvirtual => เป็นการบอกว่า function นี้จะถูกเปลี่ยน logic ได้จาก contract ลูกoverride => เป็นกการบอกว่า function ที่ contract ลูก มีการ เปลี่ยน logic จาก contract แม่
Hardhat Boilerplate
- Hardhat
- typechain
- Etherjs -> ใช้ได้ทั้งกับหน้าบ้าน และหลังบ้าน
- Libs
[Workshop] — Animal
Animal contract
Lion สืบทอดจาก Animal
Bear สืบทอดจาก Animal
Deploy on Goerli testnet
test on Laika
continue next chapter