เขียนโปรแกรมบน Blockchain (Smart Contract) ด้วย Solidity #1

Nonthakon Jitchiranant
3 min readJan 29, 2021

สวัสดีท่านผู้อ่านทุกท่านครับ ณ ปัจจุบัน (วันนี้) Bitcoin ก็กลับไปเป็นที่สนใจกับคนทั่วไปอีกรอบครับ ก็ไหนๆก็ได้ฤกษ์พอดีก็เลยคิดว่าขอเขียนบทความเกี่ยวกับ Bitcoin มาซักซักหน่อยละกัน

ถ้าจะพูดเกี่ยวกับ Bitcoin ในแง่ของเทคโนโลยีผมคิดว่าทุกคนก็น่าจะคิดถึง Blockchain กันใช่มั้ยครับ

อย่างที่จั่วหัวในหัวข้อบทความนี้เราจะมาเขียนโปรแกรม “บน” Blockchain กันครับ แต่ไม่ได้แปลว่าเราจะสร้าง Blockchain ขึ้นมาเอง เพียงแต่เราจะเอาโปรแกรมที่เราเขียนเนี่ยแหละเกาะไปบน Blockchain ที่มีอยู่แล้ว

แล้วเราจะทำยังไง? ผมขออนุญาตเกริ่นคร่าวๆครับ

การเชื่อมต่อของ Blockchain (https://steemit.com/spanish/@gabystories/el-mundo-de-la-cadena-de-bloques)

โครงสร้างของ Block แต่ละ Block ใน Blockchain ของเหรียญอย่าง Bitcoin จะมีองค์ประกอบหลายอย่าง แต่ส่วนที่คนทั่วไปอย่างเราๆเอาไปใช้กันก็จะเป็นส่วนของ Transaction (ซึ่งใน BTC เอาไปเก็บในรูปแบบของ UTXO บลาๆๆ) เท่านั้นครับ

ทีนี้ก็มีคนคิดว่า เฮ้ย! ไอ้ Blockchain เนี่ยมันเป็นไอเดียที่เจ๋งนะ ด้วยความที่มัน Decentralized, Immutable และองค์ประกอบอื่นๆของมันทำให้เค้าคิดว่าเราน่าจะเอาอะไรใส่ลงไปได้ มากกว่าแค่ Transaction อย่างเดียว เขาก็เลยเปิดพื้นที่ให้เรายัดโปรแกรมของเราเข้าไปบน Blockchain ที่กำลังรันอยู่แล้วได้นั่นเองครับ โดยเราเรียกกันว่า Smart Contract

เหรียญที่เปิดให้เราเอา Smart Contract เข้าไปเกาะได้ก็มีหลายเหรียญ ที่ฮิตๆดังๆก็ Ethereum, BNB ของ Binance บลาๆๆ

เหรียญชื่อดัง Ethereum ภาพจาก (https://siamblockchain.com)

แน่นอนครับว่าพอมันมี Smart Contract เกิดขึ้นมาก็เป็นการเปิดมิติใหม่ในด้านการเงินแบบ Decentralized มากขึ้น กำเนิดสิ่งที่เรียกว่า DeFi (Decentralized Finance) ขึ้นมา ซึ่งถ้าลองไปศึกษาดูจะเห็นว่ามีหลาย use-case ที่ปลดล็อคสมองมากๆครับ (ฮา)

เช่นว่า การปล่อยกู้ (Compound), Decentralized Exchange (Kulap) etc.,

(ส่วนตัวผมก็ลงกับ DeFi ไปบ้าง เดี๋ยวไว้หาเวลามาเล่าครับ 5555)

เอาล่ะ เกริ่นมาเยอะแล้ว เดี๋ยวเรามาเริ่มเขียนกันเลยดีกว่าครับ การ Smart Contract นั้นดีตรงที่เราไม่จำเป็นต้อง setup อะไรมากมาย เนื่องจาก IDE ที่เราจะใช้กันเป็นแบบ Web Based ชื่อว่า Remix ครับ

เข้าไปที่เว็บไซต์ https://remix.etherum.org

หน้าตาของเว็บ Remix

หน้าตาของมันก็จะประมาณนี้ครับ ตัว Remix เนี่ยมันจะทำหน้าที่จัดการ Environment ต่างๆ ให้เราเสร็จสรรพเลย พอเข้ามาแล้วก็เริ่มเขียนได้ไม่ต้อง setup อะไรเลย สะดวกมากๆ

ทางฝั่งซ้ายเป็นแถบเครื่องมือต่างๆครับ ซึ่งก็จะมีอยู่หลายปุ่ม แต่เดี๋ยวค่อยมาพูดถึงกันอีกที ก่อนอื่นก็สร้างไฟล์ใหม่ขึ้นมาก่อนเลยครับ (ไปที่ File Explorer ปุ่มแรกสุด ⇒ กดปุ่มเครื่องหมายบวก) ผมจะขออณุญาตตั้งชื่อว่า HelloWorld.sol แล้วกันครับ

ตั้งชื่อไฟล์ว่า HelloWorld.sol

เดี๋ยวก่อนที่จะเริ่มเขียนมาเล่ากันก่อนครับว่าสิ่งที่เราจะทำกันคืออะไร

diagram ของ Smart Contract ที่เราจะเขียนกัน

เราจะสร้าง Smart Contract ที่ทำหน้าที่เป็นตัวนับ โดยจะเก็บตัวแปรตัวนึงเป็นตัวแปรแบบ int แล้วก็จะมีฟังค์ชัน 2 อันคือ countUp() เอาไว้บวกตัวนับขึ้น แล้วก็ getCount() เอาไว้แสดงผลค่าที่กำลังนับอยู่ตอนนี้

ก็เป็น Smart Contract ง่ายๆครับไม่ได้มีอะไรมาก

เมื่อได้ไฟล์ขึ้นมาแล้วก็จะเขียนโค้ดลงไปตามนี้

pragma solidity ^0.8.0;contract Counter {
int count = 0;
function getCount() public view returns(int) {
return count;
}
function countUp() public {
count += 1;
}
}

การทำงานของมันเป็นไปตามนี้ครับ

  • บรรทัดแรกเอาไว้บอกตัวคอมไพล์เลอร์ว่าเราต้องการใช้ solidity version อะไร ณ ปัจจุบันนี้ version ล่าสุดคือ 0.8.0 ผมเลยใส่เป็น pragma solidity ^0.8.0; ไปครับ
  • บรรทัดที่ 2 ประกาศ contract ตัวของ contract ถ้าจะเทียบกันกับภาษาอื่นๆจะดูคล้ายๆกับ class เอาไว้เก็บค่าตัวแปรต่างๆที่เราอยากเก็บไว้ เก็บฟังค์ชันต่างๆที่เราต้องการที่จะใช้งาน และอื่นๆ
  • บรรทัดที่ 3 ผมประกาศตัวแปรตัวนึงชื่อ count ซึ่งก็จะเอาไว้เก็บเลขที่กำลังนับอยู่ปัจจุบัน
  • บรรทัดที่ 4–6 สร้างฟังค์ชัน getCount() ขึ้น ตรงนี้แหละจะเป็นสิ่งที่ Solidity ต่างจากภาษาอื่นๆตรงที่เราจำเป็นที่จะต้องบอกมันค่อนข้างละเอียดครับว่าเราต้องการอะไรบ้าง public เอาไว้บอกว่าใครก็ได้สามารถเข้าถึงมันได้ view เอาไว้บอกว่าฟังค์ชันตัวนี้เอาไว้ใช้สำหรับดูค่า แล้วเราก็ต้องบอกประเภทของตัวแปรที่ต้อง return ด้วย returns ครับ ตรงนี้พยายามสับสนกับ return ปกติจะไม่มีตัว s ต่อท้ายครับ
  • เมื่อประกาศต่างๆนานาเสร็จแล้วผมก็แค่ return ค่า count ออกมา
  • บรรทัดที่ 7–9 สร้างฟังค์ชัน countUp ซึ่งทำหน้าที่ countUp นั่นเองครับ (ก็คือบวกค่า count ไป 1 เฉยๆ)
  • อนึ่ง public ที่ใครก็ได้เข้าถึงได้อันนี้มีความหมายเชิงโค้ดแบบ OOP ครับ

ก็โค้ดของเราก็จะประมาณนี้ ได้เท่านี้แล้วเดี๋ยวเอามา compile แล้วลองรันกันดูครับ

การคอมไฟล์ solidity ใน remix

การ Compile กดตามที่ปุ่มตรงลูกศรได้เลยครับ หน้า compile นี้ก็จะแสดงตัวเลือกหลายอย่างที่เราเลือกได้ เช่น Compiler Version, ภาษา, Config ต่างๆ เมื่อ Compile เสร็จก็สามารถกดดู ABI, Bytecode ได้ด้วยครับ

อย่างลืมเลือก Contract ที่จะ compile ให้ถูกด้วยนะครับ ของเราเป็น Counter (HelloWorld.sol)

พอ Compile เสร็จเดี๋ยวมาลองรันกันดูครับ

เมื่อ compile เสร็จก็ต้อง deploy

กดเลือกหน้า Deploy แล้วกด Deploy ได้เลยครับ ถ้าใครสังเกตดูตรง Account จะเห็นว่ามี Ether บอกเราด้วย เนื่องจากว่าตัว Remix จัดไว้ให้เรา เพราะการจะ Execute อะไรก็ตามใน Smart Contract เราจะต้องเสียค่า gas เล็กๆน้อยๆด้วย

สำหรับใครที่ไม่รู้ว่าอะไรคือ gasสามารถอ่านรายละเอียดเพิ่มที่บทความข้างล่างนี้ได้ครับ

ถ้าลองกด Deploy ดูจะเห็นว่า Ether เราลดลงจาก 100 ไปเป็น 99.99…. เพราะว่าโดนค่า gas ไปครับ (ถ้า Deploy จริงๆก็ต้องใช้เงินจริง แต่อันนี้ยังไม่ได้เสียอะไรนะครับ)

เมื่อ deploy เสร็จแล้วจะเห็นหน้าตาประมาณนี้

พอกด Deploy แล้ว Smart Contract จะเด้งมาอยู่ Deployed Contracts ด้านล่าง ก็จะเห็นว่ามีปุ่มให้กดเล่น countUp, getCount ซึ่งเป็นฟังค์ชันที่เราเขียนไปนั่นแหละ ก็สามารถลองกดเล่นๆดูได้ครับ

ลองกด countUp ดูก็มี log ต่างๆออกมาให้ดู

อันนี้ผมลองกด countUp ดู ก็จะมีเด้งมาบอกในแถบ Debug ข้างล่างว่าเราทำอะไรไป ตรงนี้ก็สามารถขยายมาดูได้ด้วยว่าเราทำอะไรไป โดนค่า gas ไปเท่าไร

log ตอนกด getCount

กด getCount ออกมาดูได้เหมือนกันกับ countUp แต่ตรงนี้จะแตกต่างตรงว่าถ้าเราเรียกใช้ getCount เราจะไม่โดนค่า gas ครับ

สำหรับบทความนี้ก็ขอจบลงเท่านี้ก่อนครับ ก็การเขียน Smart Contract เบื้องต้นก็คงจบลงเพียงเท่านี้ครับ ถ้าใครมีข้อสงสัยอะไรก็ถามทิ้งไว้ที่ข้างล่างได้เลยครับ ขอให้ทุกคนสนุกกับการ Dev ครับ 😄😄

--

--