Learning Solidity Week 1

Supanut Laddayam
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 nestMap
access: 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 error
error <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

--

--