สัญญาอัจฉริยะคือชิ้นส่วนของโค้ดที่สามารถโปรแกรมให้ทำงานเมื่อมีชุดของเงื่อนไขที่ถูกต้อง พวกเขาเหมือนกับสัญญาในโลกจริงที่มีผลผูกพันทางกฎหมายเท่านั้นว่าในกรณีนี้โค้ดคือกฎหมาย ซึ่งสัญญาอัจฉริยะตั้งอยู่บนบล็อกเชนเขาไม่สามารถถูกเปลี่ยนแปลงได้ เป็นคุณสมบัติที่ทำให้สัญญาอัจฉริยะเป็นพิเศษ ระหว่างเรื่องอื่น ๆ
สัญญาอัจฉริยะ มีไว้เพื่อทําให้ธุรกรรมเฉพาะบล็อกเชนเป็นไปโดยอัตโนมัติ เนื่องจากเป็นสัญญาเฉพาะเงื่อนไขจึงไม่จําเป็นต้องมีคนกลาง สิ่งที่ทําให้สัญญาอัจฉริยะมีประโยชน์คือความเข้ากันได้ในกรณีการใช้งานที่หลากหลายรวมถึงบริการทางการเงินการจัดการห่วงโซ่อุปทานและอื่น ๆ และแตกต่างจากโค้ดแบบดั้งเดิมที่ตั้งโปรแกรมไว้ที่คลิปสัญญาอัจฉริยะต้องการกลยุทธ์ที่มีความปลอดภัยสูงและใช้เวลานาน
วิธีการสั่งการสัญญาอัจฉริยะกับเทคโนโลยีบล็อกเชน: BeInCrypto
คำวลัสดุ “web3” แสดงถึงนิสัยในการเขียนโปรแกรมที่ไม่เข้มงวดและขาดความปลอดภัยของเว็บ เมื่อถูกเขียนโปรแกรมเหมือนหน้าเว็บ การใช้ crypto หรือ smart contracts ก็จะพบว่ามันล้มละลายไปแล้ว บล็อกเชนที่ประสบความสำเร็จอย่างยั่งยืนและแอปพลิเคชันของมัน ถูกสร้างขึ้นจากวิธีการเขียนโปรแกรมที่ปลอดภัยมากขึ้น รอบคอบและช้าลงมาก
นิก ซาโบ, นักวิทยาศาสตร์คริปโตแกรฟเฟอร์และนักวิทยาการคอมพิวเตอร์: Twitter
สัญญาอัจฉริยะสามารถทำงานร่วมกับโทเค็นที่เฉพาะของบล็อกเชน เช่น ERC-20 สำหรับบล็อกเชน Ethereum เพื่อสร้างสะสมความพยายามและการเคลื่อนไหวธุรกรรม โดยที่มีการเขียนโค้ด เงื่อนไข และค่าใช้จ่ายเกิดขึ้น คุณควรระมัดระวังในการอ่าน เขียน และตรวจสอบมัน
ความสําคัญที่แท้จริงของสัญญาอัจฉริยะเกี่ยวข้องกับลักษณะและการวางตําแหน่งของพวกเขา สําหรับสถานการณ์ที่กําหนด - สมมติว่าบุคคล A ย้ายเงินไปยังบุคคล B เมื่อ B เสร็จสิ้นบริการ - สําเนาของสัญญาอัจฉริยะจะถูกบันทึกและดําเนินการโดยโหนดบล็อกเชน สัญญาอัจฉริยะจะถูกบันทึกเป็นรหัสสัญญาภายในห่วงโซ่ การตรวจสอบหลายเส้นทางนี้เป็นลักษณะที่เน้นบล็อกเชนและช่วยให้สิ่งต่างๆปลอดภัย
นอกจากนี้ยังมีสัญญาอัจฉริยะแบบตามลำดับหรือซิงโครนัสสัญญาอัจฉริยะที่ไม่เสมอเวลาที่นี่งานที่ดำเนินการโดยขนาดเท่ากัน ดังนั้น ประเภทและวัตถุประสงค์ของสัญญาอัจฉริยะกำหนดวิธีการเขียน การอ่าน หรือการตรวจสอบได้อย่างไร
สัญญาทางด้านดั้งเดิม เอกสารสินทรัพย์ พินัยกรรม ฯลฯ เป็นกฎหมายเอกชน 'ที่ถูกเขียนโดยบุคคลทั่วไป ไม่ใช่นักการเมืองหรือข้าราชการ' สมาร์ทคอนแทร็คเป็นรูปแบบใหม่ของการตัดสินใจที่ดีทรัพย์ที่มีลักษณะแบบนี้https://t.co/EU2Y28FznK
— Nick Szabo (@NickSzabo4) 15 มีนาคม 2561
พิจารณาสระเงินสดที่มีสัญญาอัจฉริยะเป็นมาตรฐาน
สมมติว่า pool ของโทเค็นสามารถนำมาใช้ในการซื้อขาย และทุกครั้งที่มีการซื้อขายที่ประสบความสำเร็จ 0.3% ของมูลค่าการซื้อขายทั้งหมดจะถูกส่งไปยังผู้ให้สินทรัพย์ที่มีความสามารถในการเป็นผู้ให้สินทรัพย์ที่ทำให้การซื้อขายนั้นเป็นไปได้หรือเพิ่ม Likuidity สำหรับสินทรัพย์ที่เป็นที่ซื้อขายได้ ทุกเงื่อนไขที่เน้นที่การซื้อขาย ค่าธรรมเนียมการซื้อขาย และเงื่อนไขของการไม่ปฏิบัติตามกฎและการล้มเหลวของการซื้อขายถูกเขียนเป็นสัญญาอัจฉริยะ, ซึ่งถูกเก็บไว้ในเชื่อมโยงเป็นรหัสสัญญา.
เราไม่สามารถดำเนินการศึกษารายละเอียด, เขียน, และตรวจสอบสัญญาได้อย่างลึกซึ้งหากเราไม่รู้จักลักษณะของมัน นี่คือคุณลักษณะมาตรฐานของสัญญาอัจฉริยะที่ควรทราบ
คุณลักษณะบางประการของสัญญาอัจฉริยะมาตรฐาน: BeInCrypto
สัญญาอัจฉริยะเป็นเพียงชิ้นส่วนของรหัส คุณสามารถเขียนสัญญาอัจฉริยะเพื่อดําเนินการคําสั่งและสถานการณ์ตามเงื่อนไขเฉพาะ นี่คือเหตุผลที่นักพัฒนาสัญญาอัจฉริยะและโปรแกรมเมอร์เป็นที่ต้องการในปัจจุบันเนื่องจากส่วนใหญ่ DeFispace already relies on สัญญาอัจฉริยะ to process complex instances like handling trading fees across liquidity pools, maintaining APYอัตราส่วน และอื่น ๆ
สัญญาอัจฉริยะที่ตั้งอยู่บนบล็อกเชนกำจัดการแทรกแซงของมนุษย์ ซึ่งทำให้พวกเขาเป็นที่เชื่อถือได้ทั้งหมด ตัวอย่างเช่น หาก DeFiโปรโตคอลที่ถูกควบคุมโดยสัญญาอัจฉริยะเห็นด้วยที่จะขายทรัพย์สินของคุณเมื่อมูลค่าต่ำกว่าค่าเกณฑ์ ไม่มีผู้ใดสามารถหยุดมันหรือควรหยุดมัน โค้ดจัดการการชำระเงิน ประสิทธิภาพ การจัดการ และการบังคับกฎเหล่านี้ ทำให้ทั้งพื้นที่เป็นที่เชื่อมั่นแบบสมบูรณ์
เหมือนกับที่กล่าวไว้ก่อนหน้านี้ สัญญาอัจฉริยะมีชุดคำสั่งที่ทำงานเองอย่างเต็มรูปแบบ ในทางการเขียนโค้ด นี้หมายถึงการมีการทำซ้ำและลูปที่สร้างไว้ในส่วนหัว นี้จะทำให้มั่นใจว่างานเช่นการชำระเงิน การถอนเงิน การฝากเงิน การลงโทษผู้ตรวจสอบผ่านการตัดเพื่อลดความเสี่ยง และงานอื่น ๆ จะถูกดำเนินการโดยอัตโนมัติ
ในที่สุด โดยที่สัญญาอัจฉริยะได้รับการรักษาความปลอดภัยโดยใช้วิทยาการรหัสซึ่งการละเมิดจะยากมาก โดยไม่มีช่องโหว่ที่ซึ่งจะทำให้การละเมิดสัญญาอัจฉริยะหมายถึงการพยายามที่จะละเมิดในที่สาธารณะ อยู่หน้าหนาว ในมุมมองของบล็อกเชนทั้งหมด
ธุรกรรมที่ดำเนินการผ่านทางสัญญาอัจฉริยะสามารถทำการตรวจสอบตัวเองได้ ซึ่งหมายความว่าการดำเนินการเป็นพิสูจน์เพียงพอว่าธุรกรรมเกิดขึ้นในที่สุด โดยที่ไม่มีปัจจัยมนุษย์เข้ามาเกี่ยวข้อง กลไกที่สามารถทำการตรวจสอบตัวเองยังให้สัญญาอัจฉริยะมีความเป็นเอกลักษณ์เมื่อเทียบกับสัญญาที่ปกครองการสร้างตั้งสติรัติธาตุทางด้านการเงินที่เป็นประวัติ
ดังนั้นครั้งหน้าที่คุณวางแผนที่จะอ่านสัญญาอัจฉริยะ ให้แน่ใจว่า boilerplate หรือเอกสารประกอบมีลักษณะทั้งหมดที่กล่าวถึง
เวอร์ชันที่ถูกปรับแก้ง่ายของสัญญาอัจฉริยะ: Reddit
นี่คือสัญญาอัจฉริยะที่เรียบง่ายที่แทนบัญชีเอสโครว์ ผู้ใช้ฝากเงินของพวกเขาในเอสโครว์ ซึ่งจากนั้นจะย้ายเงินเดิมไปยังผู้รับหลังจากเวลาที่เฉพาะเจาะจง
/ SPDX-License-Identifier: MITpragma solidity ^0.8.0;// Basic Smart Contract Boilerplatecontract SimpleTrustlessEscrow {// State variablesaddress public depositor; // Account depositing etheraddress payable public beneficiary; // Account receiving etheruint256 public releaseTime; // Timestamp to release ether// Events for verifying contract activityevent Deposited(address indexed _from, uint256 _value); เหตุการณ์ Released(address indexed _to, uint256 _value);// The contract constructor initializes the smart contractconstructor(address payable _beneficiary, uint256 _releaseTime) { require(_releaseTime > block.timestamp, "Release time must be in the future"); ปลอดภัยและเชื่อถือได้: สัญญาผูกมัดผู้ฝากเงินและผู้ฝากเงินผู้รับผลประโยชน์ = msg.sender; ผู้รับผลประโยชน์ = _beneficiary; releaseTime = _releaseTime;}ฟังก์ชันการฝากเงิน – การดําเนินการอัตโนมัติ (ฟังก์ชันสํารอง)รับ() เจ้าหนี้ภายนอก {ปล่อยเงินฝาก(msg.sender, msg.value);}ปล่อยอีเธอร์ไปยัง beneficiaryfunction release() public { // Programmable: สามารถดําเนินการได้หลังจาก releaseTime require(block.timestamp >= releaseTime, "เร็วเกินไปที่จะปล่อย"); อิสระ: ดําเนินการโดยอัตโนมัติตามเงื่อนไข uint256 amount = address(this).balance; beneficiary.transfer(จํานวนเงิน); ปล่อยปล่อยออกมา(ผู้รับผลประโยชน์, จํานวนเงิน);}}
ในขณะที่เราจะไปถอดรหัสและอ่านสัญญาอัจฉริยะนี้อย่างละเอียด ให้เราเช็คก่อนว่ามันเป็นไปตามลักษณะของสัญญาที่กล่าวถึงหรือไม่
ดูที่สัญญาอย่างใกล้ชิดสำหรับชิ้นโค้ดนี้
require(block.timestamp >= releaseTime, “เร็วเกินไปที่จะปล่อย”);
uint256 amount = address(this).balance;
beneficiary.transfer(amount);
เงินทุนจะถูกปล่อยเมื่อเงื่อนไข releaseTime ที่ระบุไว้สอดคล้องกันเท่านั้น ซึ่งทำให้สัญญาเหล่านี้เป็นสัญญาที่สามารถโปรแกรมได้
นี่คือโค้ดสั้นๆ จากข้างต้น:
depositor = msg.sender;
ผู้รับผลประโยชน์ = _beneficiary;
releaseTime = _releaseTime;
ในสัญญาทุกคนถูกผูกพันด้วยโค้ดตั้งแต่ผู้ฝากเงินจนถึงบุคคลที่ได้รับเงิน ไม่มีใครจำเป็นต้องโต้ตอบหรือเชื่อถือกันเลยเนื่องจากฟังก์ชันในการโอนเงินถูกผูกพันด้วย releaseTime — พารามิเตอร์ที่ใช้โค้ด
นี่คือส่วน "การปล่อยเงิน" ของโค้ด:
function release() public {require(block.timestamp >= releaseTime, “ยังเร็วเกินไปที่จะปล่อย”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}
กระบวนการทั้งหมดเป็นอัตโนมัติเนื่องจากเงินถูกปล่อยออกมาเมื่อเวลาการปล่อยตรงตามเกณฑ์บางอย่าง โปรดทราบว่าโค้ดไม่สามารถโปรแกรมบางส่วนได้แต่มีความเป็นอิสระอย่างเต็มที่
องค์ประกอบอื่น ๆ ของรหัสสัญญาอัจฉริยะรวมถึงฟังก์ชั่นการฝากเงินสามารถทําได้โดยอัตโนมัติอย่างสมบูรณ์ขึ้นอยู่กับคุณสมบัติที่คุณต้องการรวมไว้ ตัวอย่างเช่นคุณสามารถเริ่มแผนการฝากเงินที่เกิดขึ้นทุกครั้งที่ผู้ใช้ กระเป๋าเงินเมื่อเกิน $100 ซึ่งจำนวนเงินเกินไปจะถูกย้ายไปยังผู้รับผลประโยชน์
กังวลเกี่ยวกับว่าธาตุใดมีส่วนช่วยความปลอดภัยไปที่สัญญาหรือไม่? ตรวจสอบส่วนนี้ของโค้ด:
constructor(address payable _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, "เวลาวางจําหน่ายต้องเป็นในอนาคต"); ผู้ฝาก = msg.sender; ผู้รับผลประโยชน์ = _beneficiary; releaseTime = _releaseTime;}
โปรดสังเกตว่ามีการตั้งค่าลําดับความสําคัญของฟังก์ชัน releaseTime ที่เกี่ยวข้องกับการประทับเวลาอย่างไร ไม่มีอะไรสุ่มและต้องปฏิบัติตามเงื่อนไข
ทุกธุรกรรมที่เกี่ยวข้องกับสัญญาอัจฉริยะจะถูกบันทึกในโซ่ด้วยองค์ประกอบกิจกรรมบันทึกที่แยกต่างหาก
เหตุการณ์ที่ฝาก (ที่อยู่จัดทําดัชนี _from, uint256 _value);
event Released(address indexed _to, uint256 _value);
emit Deposited(msg.sender, msg.value);
emit Released(beneficiary, amount);
ตอนนี้ที่เราได้ระบุองค์ประกอบที่กำหนดคุณสมบัติของสัญญาอัจฉริยะแล้ว ต่อไปนี้คือองค์ประกอบของสัญญาอื่น ๆ เพื่อช่วยให้คุณเข้าใจการฝึกฝนได้ดียิ่งขึ้น
Pragma solidity ^0.8.0; – เวอร์ชันของภาษาโปรแกรมมิ่ง Solidity ที่ต้องการเขียนสัญญาอัจฉริยะนี้
// SPDX-License-Identifier: MIT - ซอฟต์แวร์แพคเกจสื่อสารข้อมูลที่ได้รับคำถึงว่าเป็นสัญญาการอนุญาต ตัวระบุนี้ระบุให้ทราบถึงการอนุญาตของการเผยแพร่โค้ด ควรรวมเข้าไปเพื่อให้คนทราบว่ามันเป็นโอเพนซอร์สและสามารถทำงานรอบๆได้หรือไม่
Contract TimeLock { – กําหนดชื่อให้กับสัญญาอัจฉริยะเช่นฉลาก
ที่อยู่ของผู้ฝากสาธารณะ; - เนื่องจากสัญญาเกี่ยวข้องกับผู้ฝากและผู้รับผลประโยชน์ นี่คือจุดที่ที่อยู่สาธารณะของผู้ฝากถูกกล่าวถึง ตัวแปรนี้คือ กระเป๋าเงิน Ethereumที่อยู่และสามารถดูได้สาธารณะ
ที่อยู่ของผู้รับชำระที่เปิดเผย; - นี่คือที่อยู่สาธารณะของผู้รับที่ที่ทำการโอนเงินผ่านการฝากเงิน นอกจากนี้ยังสามารถอ่านได้และให้ความโปร่งใสในสัญญาอัจฉริยะขับเคลื่อนบล็อคเชน
Uint256 public releaseTime; – เนื่องจากเป็นสัญญาที่มีระยะเวลา uint256 จะกำหนดตัวแปรที่เชื่อมโยงกับเวลาในสัญญา นี่จะเป็นช่วงเวลาตามซึ่งการปล่อยเงินทุนจะเกิดขึ้น
ใน Solidity uint (unsigned integer) คือวิธีในการกำหนดค่าที่เกี่ยวข้องกับจำนวนเต็ม คำต่อท้าย 256 หมายถึงการเก็บข้อมูลของตัวเลขใหญ่
หลังจาก 5 ปีของการเขียนสัญญาอัจฉริยะฉันเพิ่งตระหนักว่าโลโก้ Solidity เป็นโลโก้ Ethereum ที่กางออก 🤯 pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden) กรกฎาคม 8, 2023
คุณสามารถพิจารณาการอ่านเอกสาร Solidity เพื่อทําความคุ้นเคยกับไวยากรณ์นิพจน์และองค์ประกอบโค้ดอื่น ๆ
constructor(address payable _beneficiary, uint256 _releaseTime) { – ฟังก์ชัน 'Constructor' เป็นฟังก์ชันพิเศษที่เรียกใช้เพียงครั้งเดียวเมื่อสัญญาอัจฉริยะถูกนำไปใช้งาน มันเริ่มดำเนินการสัญญา โปรดสังเกตว่าในจุดนี้ ตัวแปรที่เป็นที่อยู่ทั้งหมดที่เราได้ประกาศไว้ก่อนหน้านี้จะถูกเรียกใช้และเริ่มต้นใช้งาน
Receive() external payable { – นี่คือฟังก์ชันพิเศษที่เรียกเมื่อเงินย้ายไปยังที่อยู่สัญญาจากด้านนอก คำว่า External แสดงถึงมาจากด้านนอก และ "Payable" กำหนดลักษณะของการเคลื่อนไหว นั่นคือ เพื่อรับโทเค็น ERC-20
ฟังก์ชัน release() public { - นี่คือฟังก์ชันสาธารณะที่ระบุการเคลื่อนไหวของ ERC-20 โทเค็นจากที่อยู่ของสัญญาไปยังผู้รับผลประโยชน์ ฟังก์ชันนี้ขึ้นอยู่กับ releaseTime
ทุกส่วนเหล่านี้เป็นส่วนหนึ่งของสัญญา Escrow ที่เราได้พูดถึง ตรวจสอบให้แน่ใจว่าคุณได้อ่านเอกสาร Solidity ทั้งหมดเพื่อเรียนรู้เกี่ยวกับภาษาได้อย่างดี
เข้าใจองค์ประกอบก่อนที่คุณจะวางแผนทำสัญญาอัจฉริยะ: BeInCrypto
ถึงตอนนี้คุณควรมีจุดเริ่มต้นในการอ่านและทําความเข้าใจสัญญาอัจฉริยะที่เขียนไว้แล้ว และสัญญาอัจฉริยะจํานวนมากเช่นที่เราพูดถึงทําให้แบ็กเอนด์ของแอปพลิเคชันแบบกระจายอํานาจ — a บล็อกเชนเวอร์ชันของแอปพลิเคชันมือถือมาตรฐาน
ทุกลักษณะของสัญญาอัจฉริยะรวมถึงความปลอดภัยของสัญญาการดําเนินการที่เป็นอิสระและตั้งโปรแกรมได้ความน่าเชื่อถือของธุรกรรมและอื่น ๆ จะถูกนําไปใช้ในขณะที่พัฒนาแอปพลิเคชันแบบกระจายอํานาจ ดังนั้นในครั้งต่อไปที่คุณสะดุดกับ DApp โปรดทราบว่ามันเป็นแบ็กเอนด์ที่ขับเคลื่อนด้วยสัญญาอัจฉริยะที่โฮสต์บนบล็อกเชน — ช่วยให้คุณเริ่มงานหลายอย่างโดยไม่ต้องมีการแทรกแซงจากมนุษย์ สัญญาอัจฉริยะสร้างตรรกะของ DApps
เรารู้ว่า Ethereum ช่วยให้คุณพัฒนาสัญญาอัจฉริยะเช่นโซลูชันซอฟต์แวร์ขนาดใหญ่ อย่างไรก็ตาม ไม่ใช่โปรโตคอลบล็อกเชนเพียงตัวเดียว หากคุณต้องการดําดิ่งสู่โลกของการพัฒนาสัญญาอัจฉริยะคุณอาจต้องการดูบล็อกเชนอื่น ๆ บล็อกเชนที่แตกต่างกันมีความแตกต่างกันเมื่อพูดถึงการชอล์กสัญญา
แต่ก่อนอื่นเรามาพูดถึงEthereum— แพลตฟอร์มที่นักพัฒนาสัญญาอัจฉริยะส่วนใหญ่เลือก
สัญญาอัจฉริยะบน Ethereum เขียนด้วยภาษาโปรแกรม Solidity และอินเทอร์เฟซโทเค็นสําหรับแพลตฟอร์มการพัฒนาสัญญาอัจฉริยะนี้คือ ERC-20
คุณสามารถกลับมาที่สัญญาอัจฉริยะที่ใช้การเก็บเงินที่เราได้พูดถึงไว้ก่อนหน้านี้เพื่อดูว่าสัญญาอัจฉริยะที่ใช้เอทีเธอเรียมมาตรฐานถูกเขียนอย่างไร
การเปิดตัวเหรียญ ERC-20 บนบล็อกเชน Ethereum เป็นคุณลักษณะที่ใช้สัญญาอัจฉริยะอย่างสม่ำเสมอ ซึ่งเราจะพูดถึงอย่างละเอียดขณะเขียนสัญญาอัจฉริยะ
นี่คือโครงสร้างของรหัสพื้นฐานที่ดูเหมือนอย่างไร หากเราวางแผนที่จะเปิดตัวสกุลเงินดิจิตอล BIC ใหม่
พิจารณาเป็นสถานการณ์ที่เป็นสมมติ ไม่ได้เปิดตัวสกุลเงินดิจิตัล BIC แบบจริงจัง
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor(uint256 initialSupply) ERC20("BIC Token", "BIC") { _mint(msg.sender, initialSupply); }}
เราจะพูดถึงทุกองค์ประกอบของรหัสนี้ในภายหลังเมื่อเขียนสัญญาอัจฉริยะของเรา
เช่นเดียวกับ Ethereum, คุณสามารถสร้างสัญญาอัจฉริยะบนแพลตฟอร์มเช่น Gate ได้Solana, โดยใช้ Rust และ Cardano, โดยใช้ Plutus, ซับเซ็ตของ Haskell — ภาษาโปรแกรมมิ่งแบบฟังก์ชัน
"Cordona มีสัญญาอัจฉริยะด้วยหรือไม่"
มุขอยู่ที่คุณเพื่อน#CardanoADA pic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28) 9 กรกฎาคม 2023
นี่คือโครงสร้างของรหัสใน Rust ( Solana) ดูเหมือนว่า:
หมายเหตุ: นี่คือสัญญาที่เรียบง่ายที่นับเพิ่มขึ้น
use anchor_lang::prelude::*;declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);#[โปรแกรม] pub mod hello_world {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter = 0; Ok(())}pub fn increment(ctx: Context<Increment>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter += 1; Ok(())}}
คุณรู้หรือไม่? ในขณะที่ Rust เป็นภาษาโปรแกรมสำหรับสร้างสัญญาอัจฉริยะที่มีพื้นฐานมาจาก Solana สมัยเป็นโครงสร้างการพัฒนาสัญญาอัจฉริยะที่ใช้กัน สำหรับการสร้างสัญญาอัจฉริยะโดยใช้ Rust, นักพัฒนาต้องดึงโมดูลจากกรอบ Anchor — บางอย่างในบรรทัดแรกของโค้ดตัวอย่างของเรา (use anchor_lang::*;) stands for.
เอกสาร Solanaจะช่วยให้คุณเข้าใจภาษาสัญญาอัจฉริยะที่เฉพาะเจาะจงของ Rust
โดยเช่นเดียวกัน คาร์ดาโนตาได้ตาม Plutus เป็นภาษาที่เลือกใช้ ตามด้วยภาษา Ink!Polkadot, TEAL for Algorand, C# for NEO, และอื่น ๆ การเรียนรู้เอกสารแบบลึกลับตามโซ่เป็นสิ่งที่ควรทำก่อนที่จะดำเนินการเขียนสัญญาอัจฉริยะที่เข้ากันได้
ความสามารถในการเขียนสัญญาอัจฉริยะได้รับการยอมรับอย่างสูง แต่การสามารถในการอ่านก็มาพร้อมกับประโยชน์ของตัวเอง
ตอนนี้ที่การอ่านสัญญาอัจฉริยะได้ผ่านไปแล้ว มาเริ่มใหม่ด้วยการเขียนสัญญาอัจฉริยะกันเถอะ ก่อนที่คุณจะลึกซึ้งลงไป มีความจำเป็นที่จะต้องสรุปว่าบล็อกเชนที่แตกต่างกันอาจมีมาตรฐานและภาษาที่เกี่ยวข้องกับการพัฒนาสัญญาอัจฉริยะที่แตกต่างกัน มีความจำเป็นที่จะต้องเน้นมาตรฐานที่ถูกกำหนดขึ้นโดยบล็อกเชนใดก็ตาม ในการเริ่มต้นด้วยการเขียนและการประกาศสัญญา
สำหรับส่วนใหญ่ของการสนทนาของเรา เราจะเน้นที่อีเทอเรียมเป็นโซ่และซอลิดิตี้เป็นภาษา
การเขียนสัญญาอัจฉริยะเป็นสิ่งสำคัญที่สุดในรอบการพัฒนา และเพื่อที่จะเข้าสู่การพัฒนาสัญญาอัจฉริยะบนเอทีเธอเรียมหรือบล็อกเชนอื่น ๆ คุณควรมีประสบการณ์บ้างในภาษาโปรแกรมที่ไม่ใช่บล็อกเชน เช่น Javascript
บล็อกเชนที่แตกต่างกันและภาษาที่ใช้เขียนสัญญาอัจฉริยะ: BeInCrypto
ความสามารถในการเขียนโปรแกรมสัญญาอัจฉริยะช่วยให้คุณสามารถนำตรรกะมาใช้งาน จัดการองค์ประกอบด้านความปลอดภัยเดียวกัน และปรับปรุงโค้ดสำหรับค่าธรรมเนียมในการทำธุรกรรม, ปรับแต่งเหมือนกัน และแม้แต่ทำให้เหมือนกันได้หากจำเป็น
ผู้ที่วางแผนที่จะเขียนสัญญาอัจฉริยะบนเอทีเธอเรียลต้องเข้าใจว่า Ethereum Virtual Machine (EVM) คืออะไรและทำงานร่วมกับสัญญาอัจฉริยะอย่างไร สำหรับผู้เริ่มต้น EVM เป็นส่วนประกอบของ Ethereum ที่ให้โปรแกรมสภาพแวดล้อมที่ถูกกำหนดเองและควบคุมเพื่อทำงาน พิจารณาเหมือนคอมพิวเตอร์ระดับโลกที่เก็บโค้ดสัญญาทุกๆ ชิ้นบน Ethereum ทุกๆโหนดบนเครือข่าย Ethereum ทำงานบน EVM
หากคุณต้องการเป็นนักพัฒนาสัญญาอัจฉริยะ นี่คือสิ่งที่คุณต้องทราบเกี่ยวกับสัญญาอัจฉริยะและ EVM
เมื่อคุณเขียนโปรแกรมใน Solidity ซึ่งเป็นภาษาระดับสูง คุณจำเป็นต้องคอมไพล์เป็น bytecode - รูปแบบระดับต่ำที่เครื่องเข้าใจได้ bytecode นี้จะเข้าไปยังบล็อกเชน Ethereum และอยู่ที่นั่น ผู้ใดที่ต้องการทำธุรกรรมกับสัญญาอัจฉริยะจำเป็นต้องส่งธุรกรรมไปยังที่อยู่ของสัญญา
ทุกโหนดที่ติดตั้ง EVM สามารถเห็นธุรกรรมนี้ และเมื่อผู้ตรวจสอบอนุมัติเหมือนกัน โค้ดสัญญาอัจฉริยะจึงถูกดำเนินการ โดยที่ทุกโหนดมีความเป็นที่เห็นของธุรกรรม ไม่มีอะไรสามารถถูกแก้ไขได้ และโค้ดถูกดำเนินการตามที่เขียนไว้ และเมื่อโค้ดได้รับการดำเนินการ สถานะบล็อกเชนเปลี่ยนแปลง ทำให้กระบวนการเป็นไปจนจบและโปรดเป็นโปรด
การเขียนสัญญาอัจฉริยะต้องใช้ความรู้ด้านเทคนิค แต่นั่นไม่ใช่มัน คุณต้องเข้าใจอย่างถ่องแท้ว่าเทคโนโลยีบล็อกเชนทํางานอย่างไรความต้องการเฉพาะภาษาใดที่เกี่ยวข้องกับบล็อกเชนที่คุณกําหนดเป้าหมาย ความสามารถในการทำงานร่วมกันและอื่น ๆ นอกจากนั้นคุณควรทราบข้อตกลงที่ยุติธรรมเกี่ยวกับช่องโหว่ของสัญญาอัจฉริยะซึ่งเป็นสิ่งที่ควรหลีกเลี่ยงขณะเขียนโค้ด และสุดท้ายการทดสอบสัญญาและความรู้ในการปรับใช้สัญญาก็เป็นสิ่งจําเป็นเช่นกัน
ทั้งหมดทั้งนั้นอาจกลายเป็นภาระที่หนักมาก ดังนั้นนี่คือแผ่นปฏิบัติการช่วยเริ่มต้นที่รวดเร็ว:
นี่คือเรื่องสั้น ๆ ที่มีเคล็ดลับบางประการที่จะช่วยให้เขียนสัญญาอัจฉริยะได้ดีขึ้น:
🥧 FREI-PI
‼️ ทำไมนักพัฒนาสัญญาอัจฉริยะจำเป็นต้องรู้เรื่องนี้!
ฟังก์ชัน:
– ข้อกำหนด
– ผลกระทบ
– การโต้ตอบ
โปรโตคอล
– อินวาเรียนต์
นี่คือแบบที่คุณควรคิดถึงเมื่อสร้างสัญญาอัจฉริยะทั้งหมด
นี่คือเหตุผลที่ 👇
— Patrick Collins (@PatrickAlphaC)6 กรกฎาคม 2566
มันเป็นเวลาที่จะเข้าสู่ด้านเทคนิคของการพัฒนาสัญญาอัจฉริยะ แม้ว่าเช่น Solana และ Cardano จะช่วยให้คุณสามารถพัฒนาสัญญาอัจฉริยะได้ แต่ Ethereum ยังคงเป็นแพลตฟอร์มการพัฒนาสัญญาอัจฉริยะที่ได้รับความนิยมมากที่สุด
คุณรู้หรือไม่? ในปี 2022 เพียงอย่างเดียว มีกว่า 100,000 แอปพลิเคชันที่ไม่มีส่วนรวมทั่วไปเข้าสู่เครือข่าย Ethereum
Ethereum มีชุมชนนักพัฒนาที่ใหญ่มาก อะไรก็ตามที่คุณพัฒนาจะได้รับความสนใจทันที และภาษาต้นฉบับของมัน คือ Solidity ที่เป็นที่นิยมสำหรับบุคคลที่รู้จัก Python หรือ JavaScript อย่างสมบูรณ์ ในที่สุด ซอฟต์แวร์โลก Ethereum EVM ช่วยในการประมวลผลสัญญาอย่างไม่มีรอยต่อ
หากคุณเป็นคนส่วนใหญ่และชอบใช้ Ethereum และ Solidity นี่คือรายการสั้น ๆ ของสิ่งที่คุณต้องติดตามก่อนที่จะเริ่มการพัฒนาสัญญาอัจฉริยะ
ตอนนี้ที่เราทราบถึงวิธีการทำงานบนโซ่แล้ว เราจะพาลงไปที่การเขียนและการใช้งานสัญญาอัจฉริยะครั้งแรก แม้ว่า “สวัสดีชาวโลก” ยังคงเป็นขั้นตอนแรก แต่เราจะเริ่มต้นด้วยการสร้างสัญญาอัจฉริยะเพื่อเปิดตัวโทเคน BIC ที่เป็นสมมติ ด้วยการปลดล็อคส่วนของการผลิตทั้งหมด 1 ล้าน
ขั้นตอนแรกคือการติดตั้งเวอร์ชันล่าสุดของ Node.js และ NPM หรือ Node Package Manager นี้จะดูแลเครื่องมือพัฒนาและสภาพแวดล้อมท้องถิ่นสำหรับการพัฒนา นอกจากนี้ Node.js และ NPM ยังช่วยให้คุณสามารถตั้งค่าส่วนหน้าเว็บสำหรับสัญญาอัจฉริยะของคุณ
ตอนนี้คุณต้องตั้ง IDE เพื่อเขียนโค้ดสัญญา สำหรับนั้นคุณสามารถติดตั้ง Visual Studio Code ได้อย่างรวดเร็ว หรือคุณสามารถตัดข้อความและhopไปที่ Alchemy — แพลตฟอร์มการพัฒนาบล็อกเชน ด้วย Alchemy คุณสามารถรับ ETH เวอร์ชันเทสเน็ตได้บางส่วน นี้จะช่วยปกป้องค่าธรรมเนียมการใช้ gas เมื่อคุณใช้งานสัญญาอัจฉริยะบนเทสเน็ต Goerli หรือแม้แต่เทสเน็ต Sepolia
โปรดทราบว่า Sepolia เป็นเครือข่ายทดสอบรุ่นใหม่และดังนั้นใช้พื้นที่ดิสก์น้อยกว่าเมื่อเป็นการติดตั้งโหนด
ในขณะนี้เราจะยึดถือกับ Goerli testnet เนื่องจากมันมีจำนวนของการประยุกต์ใช้ที่ถูกติดตั้งมากกว่า
พร้อมกับ testnet และ fake ETH พร้อม ให้เราเริ่มเขียนสัญญาอัจฉริยะโดยเฉพาะ นี่คือโค้ดสำหรับการสร้างโทเค็น BIC ด้วยการจำหน่ายคงที่ 1 ล้าน
หมายเหตุ: เราจะนำสัญญาอัจฉริยะของเราไปใช้งานในเครื่อง Mac และไม่ใช่ที่เทสเน็ต สำหรับการใช้งานสัญญาอัจฉริยะในเทสเน็ตและเมนเน็ตเราจะมีส่วนต่าง ๆ ที่เป็นนอกเหนือจากขอบเขตของการสนทนานี้
นี่คือโค้ดตัวอย่างที่ง่ายสำหรับโทเค็นที่เป็นสมมติ
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor() ERC20("BIC Token", "BIC") { _mint(msg.sender, 1000000 * 10 ** decimals()); }}
ถ้าคุณเข้าใจไวยากรณ์ คุณจะรู้ว่าส่วนประกอบของรหัสแต่ละส่วนหมายถึงอะไร สำหรับOpenzepplinส่วนนี้เป็นไลบรารีที่นำเข้าสัญญาอัจฉริยะ ERC-20 ได้ ไลบรารีนี้ให้มาตรฐานการดำเนินการพื้นฐานสำหรับโทเคน ERC-20
ฟังก์ชัน mint พูดถึงการจัดหาเงินเริ่มต้นซึ่งถูกสร้างขึ้นที่ที่อยู่ของสัญญาอัจฉริยะหรือผู้ส่งข้อความ
เพื่อติดตั้งรหัสนี้ในระบบของคุณและทดสอบ คุณจำเป็นต้องมีสามส่วนประกอบ:
หากคุณได้ผ่านกระบวนการเขียนสัญญาอัจฉริยะอย่างละเอียด จำเป็นต้องทราบถึงส่วนใหญ่ของการดำเนินการสัญญา การดำเนินการเป็นกระบวนการที่โค้ดสัญญาอัจฉริยะถูกดำเนินการบนเชนโดยโหนด
มันคือความสม่ำเสมอที่เกี่ยวข้องกับการดำเนินการของสัญญาที่ทำให้สัญญาอัจฉริยะโปร่งใสและไม่สามารถเปลี่ยนแปลงได้ ขอให้เรารู้เพียงว่ากระบวนการที่เกี่ยวข้องกับการดำเนินการของสัญญามีขั้นตอนหลายขั้นตอน:
โค้ดส่วนย่อยที่เราเขียนต้องถูกดำเนินการที่ที่ใดบางแห่ง ในกรณีของสัญญาอัจฉริยะ สถานที่ดำเนินการคือบล็อกเชน โหนดหรือสมาชิกที่เข้าร่วมในเชนช่วยดำเนินการสัญญา
โหนดยอมรับความรับผิดชอบในการดำเนินการบล็อกโค้ดสัญญาเปล่าเพื่อรับสิทธิผลประโยชน์ที่เกี่ยวข้องกับเชื่อมโยง ทุกคำสั่งหรือการกระทำที่เกิดขึ้นภายในเชื่อมโยงนั้นถูกนำทางโดยสัญญาอัจฉริยะ
ทุกสัญญาอัจฉริยะมีที่อยู่เฉพาะ สำหรับการดำเนินการสัญญา ธุรกรรมจะถูกส่งไปยังที่อยู่สัญญานั้น ๆ โปรดทราบว่าทุกโหนดทำงานกับ EVM ซึ่งจะมีสำเนาของรหัสสัญญาอัจฉริยะ ทำให้ง่ายต่อการตรวจสอบความถูกต้องของธุรกรรม
ธุรกรรมที่กําหนดเป้าหมายไปยังสัญญาอัจฉริยะจะถูกเลือกโดยผู้ตรวจสอบความถูกต้องซึ่งจะรวมสิ่งเดียวกันไว้ในบล็อกเฉพาะ
เมื่อธุรกรรมถูกผลักผ่านและตรวจสอบความถูกต้องเรียบร้อยแล้วมันจะกลายเป็นส่วนหนึ่งของบล็อกเชน ฟังก์ชันสัญญาอัจฉริยะที่เกี่ยวข้องกับธุรกรรมจะถูกเรียกและดําเนินการผ่านโหนดบล็อกเชน
ทุกโหนดที่ดำเนินการสัญญาอัจฉริยะควรเดินสู่ข้อสรุปที่เป็นเอกภาพ — ผลลัพธ์เดียวกันสำหรับชุดข้อมูลที่เหมือนกัน — ทำให้ลักษณะของสัญญาเป็นที่ไม่มีความเชื่อถือและโปร่งใสอย่างสมบูรณ์
หมายเหตุ: ข้อผิดพลาดใด ๆ เกี่ยวกับการดำเนินการโค้ดหรือปัญหาที่เกี่ยวข้องกับค่าธรรมเนียมการใช้งานกลับกลับขึ้นการทำธุรกรรม นั่นหมายความว่าการทำธุรกรรมที่ขึ้นอยู่กับโค้ดสัญญาอัจฉริยะเฉพาะหนึ่งจะหยุดอยู่ นั่นคือเช่นเดียวกับสิ่งที่เกิดขึ้นกับ flash loansเมื่อความไม่สามารถที่จะปฏิบัติตามเกณฑ์ที่แน่นอนกลับกลายเป็นการทำธุรกรรมทั้งหมด ซึ่งดูเหมือนว่าเงินทุกๆบาทไม่ได้เคลื่อนที่เลยตั้งแต่แรกเลย
ทุกการเปลี่ยนแปลงของรัฐบาลที่เกี่ยวข้องกับสัญญาอัจฉริยะถูกบันทึกไว้ในบล็อกเชนและกลายเป็นส่วนที่ไม่สามารถเปลี่ยนแปลงได้ของเดียวกัน
ตอนนี้ที่คุณทราบอยู่เกี่ยวกับสัญญาอัจฉริยะอย่างมีความรู้ นี่คือบางข้อแนะนำเพื่อเริ่มต้นในการพัฒนาสัญญา:
ทุกที่กล่าวถึงข้างต้นช่วยในการปรับปรุงรหัสและการป้องกันพิเศษ อย่างไรก็ตาม มีรูปแบบปฏิบัติที่เฉพาะสัญญาบางอย่างที่คุณต้องปฏิบัติตามและนำมาใช้เพื่อดูแลรักษาความยั่งยืนของรหัส มีจุดประสงค์เพื่อรักษารหัสสัญญาให้เบาและใช้งานได้ โดยที่ทุกโหนดที่ทำงานและประมวลผลเดียวกันไม่จำเป็นต้องสลับสลายพลังการประมวลผลมากมายในเดียวกัน
แม้จะปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดในขณะที่เขียนและพัฒนาสัญญาอัจฉริยะ แต่ก็จําเป็นต้องมุ่งเน้นไปที่ช่องโหว่ด้านความปลอดภัยของสัญญาในขณะที่ผลักดันพวกเขาไปยังเครือข่ายหลัก
สัญญาอัจฉริยะทุกฉบับที่มีสถานะอยู่ในเมนเน็ตจะต้องได้รับการประเมินประสิทธิภาพของโค้ดความปลอดภัยและลักษณะอื่น ๆ นี่คือจุดที่การตรวจสอบ - กระบวนการทดสอบสัญญาที่เข้มงวด - มาก่อนช่วยให้คุณสามารถค้นพบช่องโหว่และจุดอ่อนของสัญญาที่อาจเกิดขึ้นได้
นี่คือรายการตรวจสอบด่วนเพื่อเริ่มต้น:
รายการตรวจสอบสัญญาอัจฉริยะที่น่าทึ่ง😈
โปรดตรวจสอบเช็คเค้าในการตรวจสอบครั้งถัดไปของคุณ✅
ฉันขอความกรุณาให้ทวีตออกไป กระจายความรู้🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv) 7 กรกฎาคม 2023
ขณะที่การอ่านและเขียนสัญญาอัจฉริยะเชื่อมโยงกันเมื่อเรามีการพัฒนารหัสอัจฉริยะตัวอัจฉริยะ การตรวจสอบมีบทบาทที่สำคัญและเกี่ยวข้องกับการตรวจสอบตรรกะในที่แรก เมื่อเรามีการปฏิบัติรหัสที่มีรากฐานบนบล็อกเชน ทุกอย่างเป็นสถานะถาวร และอะไรก็ตามที่มีลักษณะที่สามารถก่อให้เกิดเหตุการณ์ที่ไม่แสดงอาการเป็นไปได้เมื่อมีการปฏิบัติสัญญา นี่คือเหตุผลแท้ที่ทำให้การตรวจสอบรหัสสัญญาและด้านอื่น ๆ ผ่านการตรวจสอบเป็นสิ่งจำเป็น
มีอาจจะมีจำนวนมากของข้อบกพร่องของสัญญา ที่การตรวจสอบสัญญาอัจฉริยะที่ละเอียดสามารถระบุได้ ซึ่งรวมถึงการตรวจสอบการโจมตี reentrancy, การเท, หรือการขาดท่อน้ำ, ปัญหาที่เกี่ยวข้องกับการควบคุมการเข้าถึง, และอื่น ๆ เมื่อระบุความเป็นจริงของปัญหาแล้ว ผู้ตรวจสอบสามารถแนะนำวิธีการที่ดีที่สุดในการแก้ไขสิ่งเดียวกัน
ยังไม่แน่ใจว่าการตรวจสอบสัญญาอัจฉริยะจะช่วยเหลืออย่างไร? ดีให้เรากลับมาสู่ DAOการโจมตีในปี 2016 ซึ่งใช้ช่องโหว่ reentrancy และทำให้ ETH สูญเสียเกือบ 3.6 ล้าน ETH ในทางเดียวกัน มีการโจมตีสัญญากระเป๋า Parity ในปี 2017 ทำให้สูญเสียเกือบ 500,000 ETH เหตุการณ์เหล่านี้สามารถหลีกเลี่ยงได้ด้วยการตรวจสอบชุดที่ถูกต้อง
แผนภูมิการโจมตี DAO: BeInCrypto
มีกลยุทธ์หลายวิธีในการตรวจสอบสัญญาอัจฉริยะ บางอันได้รับความนิยมมากมาย เช่น:
เครื่องมือเหล่านี้ทำหน้าที่เป็นชุดป้องกันแรก และเหมาะที่สุดสำหรับการค้นหาช่องโหว่ที่พบบ่อย บางส่วนของเครื่องมือที่นิยมมาก รวมถึง Securify, Mythril, และอื่น ๆ — สามารถทำการวิเคราะห์แบบคงที่ของโค้ด ตรวจจับรูปแบบการละเมิด และช่วยให้มีการเริ่มต้นด้านความปลอดภัยที่เฉพาะเจาะจง
เครื่องมือในการตรวจสอบสัญญาอัจฉริยะ: BeInCrypto
นี่คือสถานการณ์ที่ผู้ตรวจสอบโค้ดด้วยมือเข้ามามีบทบาท โดยตรวจสอบโค้ดเบื้องต้นและระบุช่องโหว่ที่ซับซ้อน (หากมี) การตรวจสอบด้วยมือช่วยให้สามารถดูแลตรรกศาสตร์ธุรกิจ บริบท และรูปแบบการใช้งาน
นี่คือวิธีที่การตรวจสอบโค้ดด้วยมือช่วยคุณในการค้นหาความเสี่ยง
คำถามเล็กๆ สำหรับผู้ตรวจสอบระดับประถมของเรา!
มาเราไปและทวีตอีกครั้งถ้าคุณพบบั๊ก!pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles) 8 กรกฎาคม 2566
เครื่องมือเช่น Snyk และ GuardRails ช่วยในการสแกนสัญญาโดยอัตโนมัติ - การปฏิบัติความปลอดภัยที่ถูกเรียกใช้ทุกครั้งที่มีการอัปเดตโค้ด รูปแบบการตรวจสอบนี้ทำให้มั่นใจว่าการเปลี่ยนแปลงใหม่ๆ ที่ทำกับโค้ดเป็นอันตราบและไม่มีผลกระทบ
นี่เป็นกระบวนการที่ซับซ้อนซึ่งอาศัยการตรวจสอบตรรกะทางธุรกิจของรหัสเท่านั้น โปรดทราบว่าการตรวจสอบอย่างเป็นทางการไม่ได้มีไว้สําหรับการตรวจสอบไวยากรณ์ แต่เป็นเพียงตรรกะเพื่อดูว่าโค้ดทํางานตามต้องการหรือไม่
นอกจากกลยุทธ์ที่กล่าวถึงข้างต้นแล้ว การตรวจสอบสัญญาอัจฉริยะยังสามารถเริ่มต้นได้โดยใช้การทบทวนโดยเพื่อนร่วมงาน โปรแกรม bug bounty และการ cover test ผ่านเครื่องมือเช่น Solidity Coverage เพื่อเพิ่มประสิทธิภาพสูงสุด
วิธีง่าย ๆ ในการตรวจสอบสัญญาอัจฉริยะ: BeInCrypto
หากคุณเป็นคนใหม่ในการตรวจสอบสัญญาอัจฉริยะ ควรทราบว่ามีวิธีการในการวิเคราะห์โค้ดและระบุปัญหาได้โดยรวมอยู่ 2 วิธี ซึ่งรวมถึง:
ประเภทนี้ของการวิเคราะห์โค้ดช่วยในการระบุช่องโหว่ด้านความปลอดภัยพื้นฐาน ข้อผิดพลาดในการเขียนโค้ด และปัญหาอื่น ๆ ตามมาตรฐานและประกาศในการเขียนโค้ดที่กำหนดไว้ อันตรายเช่นการเรียกใช้จากแหล่งที่มาภายนอกโดยไม่ได้ตรวจสอบ การทะลุเลขจำนวนเต็ม และอื่น ๆ สามารถที่จะได้รับการเน้นโดยใช้การวิเคราะห์แบบคงที่ สิ่งที่ดีที่สุดเกี่ยวกับการวิเคราะห์แบบคงที่คือโค้ดไม่จำเป็นต้องทำงานเพื่อทำการตรวจสอบ
วิธีการตรวจสอบนี้จะทดสอบการจัดตําแหน่งของรหัสกับ EVM แทนที่จะตรวจสอบเฉพาะรหัสการวิเคราะห์แบบไดนามิกจะตรวจสอบการตอบสนองของสัญญาอัจฉริยะต่ออินพุตที่หลากหลาย การวิเคราะห์แบบไดนามิกสามารถระบุปัญหาต่างๆเช่นการใช้ก๊าซที่ไม่สอดคล้องกันและแม้แต่ตรรกะสัญญาที่ผิดพลาด สภาพแวดล้อมบล็อกเชนส่วนบุคคลเช่น Ganache สามารถทํางานเป็นแพลตฟอร์มการวิเคราะห์แบบไดนามิกช่วยให้นักพัฒนาสามารถทําธุรกรรมดําเนินการคําสั่งและทําสิ่งต่างๆได้มากขึ้นกับสัญญาของพวกเขา
นี่คือโค้ดสัญญาอัจฉริยะที่ทำงานเป็นการเก็บเงินกองทุน มีฟังก์ชันการถอน
pragma solidity ^0.6.1;contract VulnerableContract { mapping(address => uint256) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Insufficient balance."); (bool success, ) = msg.sender.call{value: _amount}(""); require(success, "Transfer failed."); balances[msg.sender] -= _amount; }}
หากคุณสังเกตรหัสโค้ดอย่างใกล้ชิด จะพบว่ามีจุดอ่อนสำคัญ:
ในกรณีก่อนหน้านี้ฟังก์ชัน “ถอน” สามารถเรียกใช้ได้อีกครั้งหากผู้ใช้ที่ได้รับเงินก็เป็นสัญญาอัจฉริยะ แม้ว่าจะเป็นโปรแกรมที่ไม่ดี ดังนั้น ก่อนที่ฟังก์ชันสุดท้ายหรือการอัพเดตยอดเงินจะเกิดขึ้น โจทย์การโจมตีแบบเรียกเข้าไปสามารถเกิดขึ้นเพื่อโอนเงินเพิ่มเติม ผู้ตรวจสอบที่มีประสบการณ์จะระบุชนิดของช่องโหว่เช่นนี้
นี่คือโค้ดที่แก้ไขแล้วสำหรับเหมือนกัน:
function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "ยอดคงเหลือไม่เพียงพอ"); balances[msg.sender] -= _amount; (bool success, ) = msg.sender.call{value: _amount}("");
require(success, “โอนเงินล้มเหลว”);}
ตรวจสอบว่าฟังก์ชันอัปเดตยอดเงินถูกเรียกก่อน แล้วจึงเป็นการเคลื่อนย้ายครั้งแรกไปยังผู้ใช้ การเปลี่ยนแปลงลำดับการดำเนินการนี้คือสิ่งที่แก้ไขสัญญา
โลกของแอปพลิเคชันแบบกระจายอํานาจและสัญญาอัจฉริยะได้ก้าวไปไกลกว่า Ethereum แม้ว่าการดําเนินการจํานวนมากยังคงเกิดขึ้นภายในระบบนิเวศของ Ethereum แต่ก็มีเครือข่ายอื่น ๆ เช่น Cardano, Solana และอื่น ๆ ที่รองรับสัญญาอัจฉริยะและต้องการมาตรฐานการตรวจสอบที่แตกต่างกัน
บล็อกเชนที่แตกต่างกันใช้ภาษาการเขียนโปรแกรมที่แตกต่างกัน ความหมาย ไวยากรณ์ และคุณสมบัติของโค้ดนั้นแตกต่างกัน ทําให้สัญญาอัจฉริยะตอบสนองต่อการเขียนและการตรวจสอบที่แตกต่างกัน ตัวอย่างเช่น Ethereum ใช้ Solidity ในขณะที่ Polkadot ใช้ Ink และ Rust ทําให้ตอบสนองต่อมาตรฐานการตรวจสอบเฉพาะ
ตอนนี้หากคุณต้องการก้าวข้ามจาก Ethereum มีเครื่องมือตรวจสอบที่เฉพาะทางเพียงเล็กน้อยที่จะช่วยคุณเริ่มต้น ตัวอย่างเช่น กับ Cardano มีชุด Marlowe สำหรับการตรวจสอบแบบเชิงรูปแบบและการตรวจสอบ ในกรณีของ Solana libfuzzer และ cargo-fuzz ที่เฉพาะของ Rust ใช้สำหรับการตรวจสอบและทดสอบสัญญา ผู้ตรวจสอบหลายๆ โซนต้องเรียนรู้เกี่ยวกับแนวความคิดเหล่านี้เพื่อป้องกันช่องโหว่ของสัญญา
เพียงเพื่อย้ําคุณสามารถแยกการตรวจสอบสัญญาอัจฉริยะออกเป็นสามประเภท: ด้วยตนเองอัตโนมัติและไฮบริด โปรดทราบว่าผู้คนชอบกลยุทธ์การตรวจสอบแบบไฮบริดสําหรับสัญญาที่ซับซ้อนพร้อมตรรกะทางธุรกิจที่ลึกซึ้งเนื่องจากครอบคลุมมากที่สุด
องค์กรและบุคคลที่มีความรู้ในการเขียนโค้ดเพียงเล็กน้อย ต้องการจะเอาออกไปให้กับบริษัทชั้นนำเมื่อเรื่องการตรวจสอบมาถึง เลือกบริษัทที่เหมาะสมกลางสำคัญยิ่งขึ้นเพราะแม้ว่า เครื่องมือ AIชอบChatGPTสามารถช่วยเขียนโค้ดสัญญาอัจฉริยะ การตรวจสอบต้องใช้ความเข้าใจแบบธรรมดา
นอกจากนี้ นี่คือปัจจัยที่ควรระวังขณะจะออกแบบงานตรวจสอบ
ก่อนที่คุณจะเลือกบริษัทที่จะออกแบบด้านนอกที่เหมาะสม สำคัญที่จะตรวจสอบการตรวจสอบในอดีต ประเมินประสบการณ์ และให้ความสำคัญกับสมาชิกทีมหลัก
ก่อนทําการว่าจ้างให้จดบันทึกค่าใช้จ่ายและบริการที่เกี่ยวข้องกับการตรวจสอบ จําเป็นต้องเข้าใจลักษณะของบริการที่นําเสนอก่อนเช่นการระบุปัญหาการแก้ไขปัญหาและอื่น ๆ คุณต้องตรวจสอบด้วยว่ามีการตรวจสอบซ้ําหรือไม่หลังการดําเนินการแก้ไขบรรทัดแรกหรือไม่ ค่าใช้จ่ายในการตรวจสอบสัญญาอัจฉริยะอาจแตกต่างกันไปขึ้นอยู่กับบริการดังนั้นจึงจําเป็นต้องติดตามทุกข้อกําหนดและข้อเสนอก่อนดําเนินการต่อ
ในกรณีที่คุณต้องการทิ้งบริษัทและตรวจสอบสัญญาอัจฉริยะเอง นี่คือกลยุทธ์และปฏิบัติที่ดีที่สุดที่ควรจำไว้
ปัญญาประดิษฐ์ทำให้เราสามารถเขียนสัญญาอัจฉริยะได้ง่ายขึ้นแน่นอน อย่างไรก็ตาม การตรวจสอบสัญญาอัจฉริยะอย่างเหมาะสมยังคงต้องใช้ความเข้าใจและการแทรกแซงจากมนุษย์ ดังนั้น หากคุณวางแผนที่จะสร้างผลิตภัณฑ์ web3 ต่อไปของคุณโดยเน้นที่สัญญาอัจฉริยะและแอปพลิเคชันแบบกระจาย มันจึงสำคัญที่จะมุ่งมั่นในการหาทรัพยากรการตรวจสอบที่ดีที่สุดสำหรับสัญญาอัจฉริยะของคุณ ด้วยการแฮ็กและการละเมิดเงินสกุลเงินดิจิตอลที่ปรากฏขึ้นทุกวัน และฮา๊กเกอร์วางแผนกลยุทธ์ใหม่ๆเพื่อทะลุเข้าไป การตรวจสอบสัญญาอย่างสมบูรณ์เป็นหนึ่งในทักษะที่สำคัญในยุคสมัครสมาน
Partager
สัญญาอัจฉริยะคือชิ้นส่วนของโค้ดที่สามารถโปรแกรมให้ทำงานเมื่อมีชุดของเงื่อนไขที่ถูกต้อง พวกเขาเหมือนกับสัญญาในโลกจริงที่มีผลผูกพันทางกฎหมายเท่านั้นว่าในกรณีนี้โค้ดคือกฎหมาย ซึ่งสัญญาอัจฉริยะตั้งอยู่บนบล็อกเชนเขาไม่สามารถถูกเปลี่ยนแปลงได้ เป็นคุณสมบัติที่ทำให้สัญญาอัจฉริยะเป็นพิเศษ ระหว่างเรื่องอื่น ๆ
สัญญาอัจฉริยะ มีไว้เพื่อทําให้ธุรกรรมเฉพาะบล็อกเชนเป็นไปโดยอัตโนมัติ เนื่องจากเป็นสัญญาเฉพาะเงื่อนไขจึงไม่จําเป็นต้องมีคนกลาง สิ่งที่ทําให้สัญญาอัจฉริยะมีประโยชน์คือความเข้ากันได้ในกรณีการใช้งานที่หลากหลายรวมถึงบริการทางการเงินการจัดการห่วงโซ่อุปทานและอื่น ๆ และแตกต่างจากโค้ดแบบดั้งเดิมที่ตั้งโปรแกรมไว้ที่คลิปสัญญาอัจฉริยะต้องการกลยุทธ์ที่มีความปลอดภัยสูงและใช้เวลานาน
วิธีการสั่งการสัญญาอัจฉริยะกับเทคโนโลยีบล็อกเชน: BeInCrypto
คำวลัสดุ “web3” แสดงถึงนิสัยในการเขียนโปรแกรมที่ไม่เข้มงวดและขาดความปลอดภัยของเว็บ เมื่อถูกเขียนโปรแกรมเหมือนหน้าเว็บ การใช้ crypto หรือ smart contracts ก็จะพบว่ามันล้มละลายไปแล้ว บล็อกเชนที่ประสบความสำเร็จอย่างยั่งยืนและแอปพลิเคชันของมัน ถูกสร้างขึ้นจากวิธีการเขียนโปรแกรมที่ปลอดภัยมากขึ้น รอบคอบและช้าลงมาก
นิก ซาโบ, นักวิทยาศาสตร์คริปโตแกรฟเฟอร์และนักวิทยาการคอมพิวเตอร์: Twitter
สัญญาอัจฉริยะสามารถทำงานร่วมกับโทเค็นที่เฉพาะของบล็อกเชน เช่น ERC-20 สำหรับบล็อกเชน Ethereum เพื่อสร้างสะสมความพยายามและการเคลื่อนไหวธุรกรรม โดยที่มีการเขียนโค้ด เงื่อนไข และค่าใช้จ่ายเกิดขึ้น คุณควรระมัดระวังในการอ่าน เขียน และตรวจสอบมัน
ความสําคัญที่แท้จริงของสัญญาอัจฉริยะเกี่ยวข้องกับลักษณะและการวางตําแหน่งของพวกเขา สําหรับสถานการณ์ที่กําหนด - สมมติว่าบุคคล A ย้ายเงินไปยังบุคคล B เมื่อ B เสร็จสิ้นบริการ - สําเนาของสัญญาอัจฉริยะจะถูกบันทึกและดําเนินการโดยโหนดบล็อกเชน สัญญาอัจฉริยะจะถูกบันทึกเป็นรหัสสัญญาภายในห่วงโซ่ การตรวจสอบหลายเส้นทางนี้เป็นลักษณะที่เน้นบล็อกเชนและช่วยให้สิ่งต่างๆปลอดภัย
นอกจากนี้ยังมีสัญญาอัจฉริยะแบบตามลำดับหรือซิงโครนัสสัญญาอัจฉริยะที่ไม่เสมอเวลาที่นี่งานที่ดำเนินการโดยขนาดเท่ากัน ดังนั้น ประเภทและวัตถุประสงค์ของสัญญาอัจฉริยะกำหนดวิธีการเขียน การอ่าน หรือการตรวจสอบได้อย่างไร
สัญญาทางด้านดั้งเดิม เอกสารสินทรัพย์ พินัยกรรม ฯลฯ เป็นกฎหมายเอกชน 'ที่ถูกเขียนโดยบุคคลทั่วไป ไม่ใช่นักการเมืองหรือข้าราชการ' สมาร์ทคอนแทร็คเป็นรูปแบบใหม่ของการตัดสินใจที่ดีทรัพย์ที่มีลักษณะแบบนี้https://t.co/EU2Y28FznK
— Nick Szabo (@NickSzabo4) 15 มีนาคม 2561
พิจารณาสระเงินสดที่มีสัญญาอัจฉริยะเป็นมาตรฐาน
สมมติว่า pool ของโทเค็นสามารถนำมาใช้ในการซื้อขาย และทุกครั้งที่มีการซื้อขายที่ประสบความสำเร็จ 0.3% ของมูลค่าการซื้อขายทั้งหมดจะถูกส่งไปยังผู้ให้สินทรัพย์ที่มีความสามารถในการเป็นผู้ให้สินทรัพย์ที่ทำให้การซื้อขายนั้นเป็นไปได้หรือเพิ่ม Likuidity สำหรับสินทรัพย์ที่เป็นที่ซื้อขายได้ ทุกเงื่อนไขที่เน้นที่การซื้อขาย ค่าธรรมเนียมการซื้อขาย และเงื่อนไขของการไม่ปฏิบัติตามกฎและการล้มเหลวของการซื้อขายถูกเขียนเป็นสัญญาอัจฉริยะ, ซึ่งถูกเก็บไว้ในเชื่อมโยงเป็นรหัสสัญญา.
เราไม่สามารถดำเนินการศึกษารายละเอียด, เขียน, และตรวจสอบสัญญาได้อย่างลึกซึ้งหากเราไม่รู้จักลักษณะของมัน นี่คือคุณลักษณะมาตรฐานของสัญญาอัจฉริยะที่ควรทราบ
คุณลักษณะบางประการของสัญญาอัจฉริยะมาตรฐาน: BeInCrypto
สัญญาอัจฉริยะเป็นเพียงชิ้นส่วนของรหัส คุณสามารถเขียนสัญญาอัจฉริยะเพื่อดําเนินการคําสั่งและสถานการณ์ตามเงื่อนไขเฉพาะ นี่คือเหตุผลที่นักพัฒนาสัญญาอัจฉริยะและโปรแกรมเมอร์เป็นที่ต้องการในปัจจุบันเนื่องจากส่วนใหญ่ DeFispace already relies on สัญญาอัจฉริยะ to process complex instances like handling trading fees across liquidity pools, maintaining APYอัตราส่วน และอื่น ๆ
สัญญาอัจฉริยะที่ตั้งอยู่บนบล็อกเชนกำจัดการแทรกแซงของมนุษย์ ซึ่งทำให้พวกเขาเป็นที่เชื่อถือได้ทั้งหมด ตัวอย่างเช่น หาก DeFiโปรโตคอลที่ถูกควบคุมโดยสัญญาอัจฉริยะเห็นด้วยที่จะขายทรัพย์สินของคุณเมื่อมูลค่าต่ำกว่าค่าเกณฑ์ ไม่มีผู้ใดสามารถหยุดมันหรือควรหยุดมัน โค้ดจัดการการชำระเงิน ประสิทธิภาพ การจัดการ และการบังคับกฎเหล่านี้ ทำให้ทั้งพื้นที่เป็นที่เชื่อมั่นแบบสมบูรณ์
เหมือนกับที่กล่าวไว้ก่อนหน้านี้ สัญญาอัจฉริยะมีชุดคำสั่งที่ทำงานเองอย่างเต็มรูปแบบ ในทางการเขียนโค้ด นี้หมายถึงการมีการทำซ้ำและลูปที่สร้างไว้ในส่วนหัว นี้จะทำให้มั่นใจว่างานเช่นการชำระเงิน การถอนเงิน การฝากเงิน การลงโทษผู้ตรวจสอบผ่านการตัดเพื่อลดความเสี่ยง และงานอื่น ๆ จะถูกดำเนินการโดยอัตโนมัติ
ในที่สุด โดยที่สัญญาอัจฉริยะได้รับการรักษาความปลอดภัยโดยใช้วิทยาการรหัสซึ่งการละเมิดจะยากมาก โดยไม่มีช่องโหว่ที่ซึ่งจะทำให้การละเมิดสัญญาอัจฉริยะหมายถึงการพยายามที่จะละเมิดในที่สาธารณะ อยู่หน้าหนาว ในมุมมองของบล็อกเชนทั้งหมด
ธุรกรรมที่ดำเนินการผ่านทางสัญญาอัจฉริยะสามารถทำการตรวจสอบตัวเองได้ ซึ่งหมายความว่าการดำเนินการเป็นพิสูจน์เพียงพอว่าธุรกรรมเกิดขึ้นในที่สุด โดยที่ไม่มีปัจจัยมนุษย์เข้ามาเกี่ยวข้อง กลไกที่สามารถทำการตรวจสอบตัวเองยังให้สัญญาอัจฉริยะมีความเป็นเอกลักษณ์เมื่อเทียบกับสัญญาที่ปกครองการสร้างตั้งสติรัติธาตุทางด้านการเงินที่เป็นประวัติ
ดังนั้นครั้งหน้าที่คุณวางแผนที่จะอ่านสัญญาอัจฉริยะ ให้แน่ใจว่า boilerplate หรือเอกสารประกอบมีลักษณะทั้งหมดที่กล่าวถึง
เวอร์ชันที่ถูกปรับแก้ง่ายของสัญญาอัจฉริยะ: Reddit
นี่คือสัญญาอัจฉริยะที่เรียบง่ายที่แทนบัญชีเอสโครว์ ผู้ใช้ฝากเงินของพวกเขาในเอสโครว์ ซึ่งจากนั้นจะย้ายเงินเดิมไปยังผู้รับหลังจากเวลาที่เฉพาะเจาะจง
/ SPDX-License-Identifier: MITpragma solidity ^0.8.0;// Basic Smart Contract Boilerplatecontract SimpleTrustlessEscrow {// State variablesaddress public depositor; // Account depositing etheraddress payable public beneficiary; // Account receiving etheruint256 public releaseTime; // Timestamp to release ether// Events for verifying contract activityevent Deposited(address indexed _from, uint256 _value); เหตุการณ์ Released(address indexed _to, uint256 _value);// The contract constructor initializes the smart contractconstructor(address payable _beneficiary, uint256 _releaseTime) { require(_releaseTime > block.timestamp, "Release time must be in the future"); ปลอดภัยและเชื่อถือได้: สัญญาผูกมัดผู้ฝากเงินและผู้ฝากเงินผู้รับผลประโยชน์ = msg.sender; ผู้รับผลประโยชน์ = _beneficiary; releaseTime = _releaseTime;}ฟังก์ชันการฝากเงิน – การดําเนินการอัตโนมัติ (ฟังก์ชันสํารอง)รับ() เจ้าหนี้ภายนอก {ปล่อยเงินฝาก(msg.sender, msg.value);}ปล่อยอีเธอร์ไปยัง beneficiaryfunction release() public { // Programmable: สามารถดําเนินการได้หลังจาก releaseTime require(block.timestamp >= releaseTime, "เร็วเกินไปที่จะปล่อย"); อิสระ: ดําเนินการโดยอัตโนมัติตามเงื่อนไข uint256 amount = address(this).balance; beneficiary.transfer(จํานวนเงิน); ปล่อยปล่อยออกมา(ผู้รับผลประโยชน์, จํานวนเงิน);}}
ในขณะที่เราจะไปถอดรหัสและอ่านสัญญาอัจฉริยะนี้อย่างละเอียด ให้เราเช็คก่อนว่ามันเป็นไปตามลักษณะของสัญญาที่กล่าวถึงหรือไม่
ดูที่สัญญาอย่างใกล้ชิดสำหรับชิ้นโค้ดนี้
require(block.timestamp >= releaseTime, “เร็วเกินไปที่จะปล่อย”);
uint256 amount = address(this).balance;
beneficiary.transfer(amount);
เงินทุนจะถูกปล่อยเมื่อเงื่อนไข releaseTime ที่ระบุไว้สอดคล้องกันเท่านั้น ซึ่งทำให้สัญญาเหล่านี้เป็นสัญญาที่สามารถโปรแกรมได้
นี่คือโค้ดสั้นๆ จากข้างต้น:
depositor = msg.sender;
ผู้รับผลประโยชน์ = _beneficiary;
releaseTime = _releaseTime;
ในสัญญาทุกคนถูกผูกพันด้วยโค้ดตั้งแต่ผู้ฝากเงินจนถึงบุคคลที่ได้รับเงิน ไม่มีใครจำเป็นต้องโต้ตอบหรือเชื่อถือกันเลยเนื่องจากฟังก์ชันในการโอนเงินถูกผูกพันด้วย releaseTime — พารามิเตอร์ที่ใช้โค้ด
นี่คือส่วน "การปล่อยเงิน" ของโค้ด:
function release() public {require(block.timestamp >= releaseTime, “ยังเร็วเกินไปที่จะปล่อย”);uint256 amount = address(this).balance;beneficiary.transfer(amount);emit Released(beneficiary, amount);}
กระบวนการทั้งหมดเป็นอัตโนมัติเนื่องจากเงินถูกปล่อยออกมาเมื่อเวลาการปล่อยตรงตามเกณฑ์บางอย่าง โปรดทราบว่าโค้ดไม่สามารถโปรแกรมบางส่วนได้แต่มีความเป็นอิสระอย่างเต็มที่
องค์ประกอบอื่น ๆ ของรหัสสัญญาอัจฉริยะรวมถึงฟังก์ชั่นการฝากเงินสามารถทําได้โดยอัตโนมัติอย่างสมบูรณ์ขึ้นอยู่กับคุณสมบัติที่คุณต้องการรวมไว้ ตัวอย่างเช่นคุณสามารถเริ่มแผนการฝากเงินที่เกิดขึ้นทุกครั้งที่ผู้ใช้ กระเป๋าเงินเมื่อเกิน $100 ซึ่งจำนวนเงินเกินไปจะถูกย้ายไปยังผู้รับผลประโยชน์
กังวลเกี่ยวกับว่าธาตุใดมีส่วนช่วยความปลอดภัยไปที่สัญญาหรือไม่? ตรวจสอบส่วนนี้ของโค้ด:
constructor(address payable _beneficiary, uint256 _releaseTime) {require(_releaseTime > block.timestamp, "เวลาวางจําหน่ายต้องเป็นในอนาคต"); ผู้ฝาก = msg.sender; ผู้รับผลประโยชน์ = _beneficiary; releaseTime = _releaseTime;}
โปรดสังเกตว่ามีการตั้งค่าลําดับความสําคัญของฟังก์ชัน releaseTime ที่เกี่ยวข้องกับการประทับเวลาอย่างไร ไม่มีอะไรสุ่มและต้องปฏิบัติตามเงื่อนไข
ทุกธุรกรรมที่เกี่ยวข้องกับสัญญาอัจฉริยะจะถูกบันทึกในโซ่ด้วยองค์ประกอบกิจกรรมบันทึกที่แยกต่างหาก
เหตุการณ์ที่ฝาก (ที่อยู่จัดทําดัชนี _from, uint256 _value);
event Released(address indexed _to, uint256 _value);
emit Deposited(msg.sender, msg.value);
emit Released(beneficiary, amount);
ตอนนี้ที่เราได้ระบุองค์ประกอบที่กำหนดคุณสมบัติของสัญญาอัจฉริยะแล้ว ต่อไปนี้คือองค์ประกอบของสัญญาอื่น ๆ เพื่อช่วยให้คุณเข้าใจการฝึกฝนได้ดียิ่งขึ้น
Pragma solidity ^0.8.0; – เวอร์ชันของภาษาโปรแกรมมิ่ง Solidity ที่ต้องการเขียนสัญญาอัจฉริยะนี้
// SPDX-License-Identifier: MIT - ซอฟต์แวร์แพคเกจสื่อสารข้อมูลที่ได้รับคำถึงว่าเป็นสัญญาการอนุญาต ตัวระบุนี้ระบุให้ทราบถึงการอนุญาตของการเผยแพร่โค้ด ควรรวมเข้าไปเพื่อให้คนทราบว่ามันเป็นโอเพนซอร์สและสามารถทำงานรอบๆได้หรือไม่
Contract TimeLock { – กําหนดชื่อให้กับสัญญาอัจฉริยะเช่นฉลาก
ที่อยู่ของผู้ฝากสาธารณะ; - เนื่องจากสัญญาเกี่ยวข้องกับผู้ฝากและผู้รับผลประโยชน์ นี่คือจุดที่ที่อยู่สาธารณะของผู้ฝากถูกกล่าวถึง ตัวแปรนี้คือ กระเป๋าเงิน Ethereumที่อยู่และสามารถดูได้สาธารณะ
ที่อยู่ของผู้รับชำระที่เปิดเผย; - นี่คือที่อยู่สาธารณะของผู้รับที่ที่ทำการโอนเงินผ่านการฝากเงิน นอกจากนี้ยังสามารถอ่านได้และให้ความโปร่งใสในสัญญาอัจฉริยะขับเคลื่อนบล็อคเชน
Uint256 public releaseTime; – เนื่องจากเป็นสัญญาที่มีระยะเวลา uint256 จะกำหนดตัวแปรที่เชื่อมโยงกับเวลาในสัญญา นี่จะเป็นช่วงเวลาตามซึ่งการปล่อยเงินทุนจะเกิดขึ้น
ใน Solidity uint (unsigned integer) คือวิธีในการกำหนดค่าที่เกี่ยวข้องกับจำนวนเต็ม คำต่อท้าย 256 หมายถึงการเก็บข้อมูลของตัวเลขใหญ่
หลังจาก 5 ปีของการเขียนสัญญาอัจฉริยะฉันเพิ่งตระหนักว่าโลโก้ Solidity เป็นโลโก้ Ethereum ที่กางออก 🤯 pic.twitter.com/wlM369Eff9
— kaden.eth (@0xKaden) กรกฎาคม 8, 2023
คุณสามารถพิจารณาการอ่านเอกสาร Solidity เพื่อทําความคุ้นเคยกับไวยากรณ์นิพจน์และองค์ประกอบโค้ดอื่น ๆ
constructor(address payable _beneficiary, uint256 _releaseTime) { – ฟังก์ชัน 'Constructor' เป็นฟังก์ชันพิเศษที่เรียกใช้เพียงครั้งเดียวเมื่อสัญญาอัจฉริยะถูกนำไปใช้งาน มันเริ่มดำเนินการสัญญา โปรดสังเกตว่าในจุดนี้ ตัวแปรที่เป็นที่อยู่ทั้งหมดที่เราได้ประกาศไว้ก่อนหน้านี้จะถูกเรียกใช้และเริ่มต้นใช้งาน
Receive() external payable { – นี่คือฟังก์ชันพิเศษที่เรียกเมื่อเงินย้ายไปยังที่อยู่สัญญาจากด้านนอก คำว่า External แสดงถึงมาจากด้านนอก และ "Payable" กำหนดลักษณะของการเคลื่อนไหว นั่นคือ เพื่อรับโทเค็น ERC-20
ฟังก์ชัน release() public { - นี่คือฟังก์ชันสาธารณะที่ระบุการเคลื่อนไหวของ ERC-20 โทเค็นจากที่อยู่ของสัญญาไปยังผู้รับผลประโยชน์ ฟังก์ชันนี้ขึ้นอยู่กับ releaseTime
ทุกส่วนเหล่านี้เป็นส่วนหนึ่งของสัญญา Escrow ที่เราได้พูดถึง ตรวจสอบให้แน่ใจว่าคุณได้อ่านเอกสาร Solidity ทั้งหมดเพื่อเรียนรู้เกี่ยวกับภาษาได้อย่างดี
เข้าใจองค์ประกอบก่อนที่คุณจะวางแผนทำสัญญาอัจฉริยะ: BeInCrypto
ถึงตอนนี้คุณควรมีจุดเริ่มต้นในการอ่านและทําความเข้าใจสัญญาอัจฉริยะที่เขียนไว้แล้ว และสัญญาอัจฉริยะจํานวนมากเช่นที่เราพูดถึงทําให้แบ็กเอนด์ของแอปพลิเคชันแบบกระจายอํานาจ — a บล็อกเชนเวอร์ชันของแอปพลิเคชันมือถือมาตรฐาน
ทุกลักษณะของสัญญาอัจฉริยะรวมถึงความปลอดภัยของสัญญาการดําเนินการที่เป็นอิสระและตั้งโปรแกรมได้ความน่าเชื่อถือของธุรกรรมและอื่น ๆ จะถูกนําไปใช้ในขณะที่พัฒนาแอปพลิเคชันแบบกระจายอํานาจ ดังนั้นในครั้งต่อไปที่คุณสะดุดกับ DApp โปรดทราบว่ามันเป็นแบ็กเอนด์ที่ขับเคลื่อนด้วยสัญญาอัจฉริยะที่โฮสต์บนบล็อกเชน — ช่วยให้คุณเริ่มงานหลายอย่างโดยไม่ต้องมีการแทรกแซงจากมนุษย์ สัญญาอัจฉริยะสร้างตรรกะของ DApps
เรารู้ว่า Ethereum ช่วยให้คุณพัฒนาสัญญาอัจฉริยะเช่นโซลูชันซอฟต์แวร์ขนาดใหญ่ อย่างไรก็ตาม ไม่ใช่โปรโตคอลบล็อกเชนเพียงตัวเดียว หากคุณต้องการดําดิ่งสู่โลกของการพัฒนาสัญญาอัจฉริยะคุณอาจต้องการดูบล็อกเชนอื่น ๆ บล็อกเชนที่แตกต่างกันมีความแตกต่างกันเมื่อพูดถึงการชอล์กสัญญา
แต่ก่อนอื่นเรามาพูดถึงEthereum— แพลตฟอร์มที่นักพัฒนาสัญญาอัจฉริยะส่วนใหญ่เลือก
สัญญาอัจฉริยะบน Ethereum เขียนด้วยภาษาโปรแกรม Solidity และอินเทอร์เฟซโทเค็นสําหรับแพลตฟอร์มการพัฒนาสัญญาอัจฉริยะนี้คือ ERC-20
คุณสามารถกลับมาที่สัญญาอัจฉริยะที่ใช้การเก็บเงินที่เราได้พูดถึงไว้ก่อนหน้านี้เพื่อดูว่าสัญญาอัจฉริยะที่ใช้เอทีเธอเรียมมาตรฐานถูกเขียนอย่างไร
การเปิดตัวเหรียญ ERC-20 บนบล็อกเชน Ethereum เป็นคุณลักษณะที่ใช้สัญญาอัจฉริยะอย่างสม่ำเสมอ ซึ่งเราจะพูดถึงอย่างละเอียดขณะเขียนสัญญาอัจฉริยะ
นี่คือโครงสร้างของรหัสพื้นฐานที่ดูเหมือนอย่างไร หากเราวางแผนที่จะเปิดตัวสกุลเงินดิจิตอล BIC ใหม่
พิจารณาเป็นสถานการณ์ที่เป็นสมมติ ไม่ได้เปิดตัวสกุลเงินดิจิตัล BIC แบบจริงจัง
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor(uint256 initialSupply) ERC20("BIC Token", "BIC") { _mint(msg.sender, initialSupply); }}
เราจะพูดถึงทุกองค์ประกอบของรหัสนี้ในภายหลังเมื่อเขียนสัญญาอัจฉริยะของเรา
เช่นเดียวกับ Ethereum, คุณสามารถสร้างสัญญาอัจฉริยะบนแพลตฟอร์มเช่น Gate ได้Solana, โดยใช้ Rust และ Cardano, โดยใช้ Plutus, ซับเซ็ตของ Haskell — ภาษาโปรแกรมมิ่งแบบฟังก์ชัน
"Cordona มีสัญญาอัจฉริยะด้วยหรือไม่"
มุขอยู่ที่คุณเพื่อน#CardanoADA pic.twitter.com/j8SXCu72Sd
— Willybot 🇦🇺 (@wilbot28) 9 กรกฎาคม 2023
นี่คือโครงสร้างของรหัสใน Rust ( Solana) ดูเหมือนว่า:
หมายเหตุ: นี่คือสัญญาที่เรียบง่ายที่นับเพิ่มขึ้น
use anchor_lang::prelude::*;declare_id!(“Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS”);#[โปรแกรม] pub mod hello_world {use super::*;pub fn initialize(ctx: Context<Initialize>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter = 0; Ok(())}pub fn increment(ctx: Context<Increment>) -> ProgramResult { let greeting_account = &mut ctx.accounts.greeting_account; greeting_account.counter += 1; Ok(())}}
คุณรู้หรือไม่? ในขณะที่ Rust เป็นภาษาโปรแกรมสำหรับสร้างสัญญาอัจฉริยะที่มีพื้นฐานมาจาก Solana สมัยเป็นโครงสร้างการพัฒนาสัญญาอัจฉริยะที่ใช้กัน สำหรับการสร้างสัญญาอัจฉริยะโดยใช้ Rust, นักพัฒนาต้องดึงโมดูลจากกรอบ Anchor — บางอย่างในบรรทัดแรกของโค้ดตัวอย่างของเรา (use anchor_lang::*;) stands for.
เอกสาร Solanaจะช่วยให้คุณเข้าใจภาษาสัญญาอัจฉริยะที่เฉพาะเจาะจงของ Rust
โดยเช่นเดียวกัน คาร์ดาโนตาได้ตาม Plutus เป็นภาษาที่เลือกใช้ ตามด้วยภาษา Ink!Polkadot, TEAL for Algorand, C# for NEO, และอื่น ๆ การเรียนรู้เอกสารแบบลึกลับตามโซ่เป็นสิ่งที่ควรทำก่อนที่จะดำเนินการเขียนสัญญาอัจฉริยะที่เข้ากันได้
ความสามารถในการเขียนสัญญาอัจฉริยะได้รับการยอมรับอย่างสูง แต่การสามารถในการอ่านก็มาพร้อมกับประโยชน์ของตัวเอง
ตอนนี้ที่การอ่านสัญญาอัจฉริยะได้ผ่านไปแล้ว มาเริ่มใหม่ด้วยการเขียนสัญญาอัจฉริยะกันเถอะ ก่อนที่คุณจะลึกซึ้งลงไป มีความจำเป็นที่จะต้องสรุปว่าบล็อกเชนที่แตกต่างกันอาจมีมาตรฐานและภาษาที่เกี่ยวข้องกับการพัฒนาสัญญาอัจฉริยะที่แตกต่างกัน มีความจำเป็นที่จะต้องเน้นมาตรฐานที่ถูกกำหนดขึ้นโดยบล็อกเชนใดก็ตาม ในการเริ่มต้นด้วยการเขียนและการประกาศสัญญา
สำหรับส่วนใหญ่ของการสนทนาของเรา เราจะเน้นที่อีเทอเรียมเป็นโซ่และซอลิดิตี้เป็นภาษา
การเขียนสัญญาอัจฉริยะเป็นสิ่งสำคัญที่สุดในรอบการพัฒนา และเพื่อที่จะเข้าสู่การพัฒนาสัญญาอัจฉริยะบนเอทีเธอเรียมหรือบล็อกเชนอื่น ๆ คุณควรมีประสบการณ์บ้างในภาษาโปรแกรมที่ไม่ใช่บล็อกเชน เช่น Javascript
บล็อกเชนที่แตกต่างกันและภาษาที่ใช้เขียนสัญญาอัจฉริยะ: BeInCrypto
ความสามารถในการเขียนโปรแกรมสัญญาอัจฉริยะช่วยให้คุณสามารถนำตรรกะมาใช้งาน จัดการองค์ประกอบด้านความปลอดภัยเดียวกัน และปรับปรุงโค้ดสำหรับค่าธรรมเนียมในการทำธุรกรรม, ปรับแต่งเหมือนกัน และแม้แต่ทำให้เหมือนกันได้หากจำเป็น
ผู้ที่วางแผนที่จะเขียนสัญญาอัจฉริยะบนเอทีเธอเรียลต้องเข้าใจว่า Ethereum Virtual Machine (EVM) คืออะไรและทำงานร่วมกับสัญญาอัจฉริยะอย่างไร สำหรับผู้เริ่มต้น EVM เป็นส่วนประกอบของ Ethereum ที่ให้โปรแกรมสภาพแวดล้อมที่ถูกกำหนดเองและควบคุมเพื่อทำงาน พิจารณาเหมือนคอมพิวเตอร์ระดับโลกที่เก็บโค้ดสัญญาทุกๆ ชิ้นบน Ethereum ทุกๆโหนดบนเครือข่าย Ethereum ทำงานบน EVM
หากคุณต้องการเป็นนักพัฒนาสัญญาอัจฉริยะ นี่คือสิ่งที่คุณต้องทราบเกี่ยวกับสัญญาอัจฉริยะและ EVM
เมื่อคุณเขียนโปรแกรมใน Solidity ซึ่งเป็นภาษาระดับสูง คุณจำเป็นต้องคอมไพล์เป็น bytecode - รูปแบบระดับต่ำที่เครื่องเข้าใจได้ bytecode นี้จะเข้าไปยังบล็อกเชน Ethereum และอยู่ที่นั่น ผู้ใดที่ต้องการทำธุรกรรมกับสัญญาอัจฉริยะจำเป็นต้องส่งธุรกรรมไปยังที่อยู่ของสัญญา
ทุกโหนดที่ติดตั้ง EVM สามารถเห็นธุรกรรมนี้ และเมื่อผู้ตรวจสอบอนุมัติเหมือนกัน โค้ดสัญญาอัจฉริยะจึงถูกดำเนินการ โดยที่ทุกโหนดมีความเป็นที่เห็นของธุรกรรม ไม่มีอะไรสามารถถูกแก้ไขได้ และโค้ดถูกดำเนินการตามที่เขียนไว้ และเมื่อโค้ดได้รับการดำเนินการ สถานะบล็อกเชนเปลี่ยนแปลง ทำให้กระบวนการเป็นไปจนจบและโปรดเป็นโปรด
การเขียนสัญญาอัจฉริยะต้องใช้ความรู้ด้านเทคนิค แต่นั่นไม่ใช่มัน คุณต้องเข้าใจอย่างถ่องแท้ว่าเทคโนโลยีบล็อกเชนทํางานอย่างไรความต้องการเฉพาะภาษาใดที่เกี่ยวข้องกับบล็อกเชนที่คุณกําหนดเป้าหมาย ความสามารถในการทำงานร่วมกันและอื่น ๆ นอกจากนั้นคุณควรทราบข้อตกลงที่ยุติธรรมเกี่ยวกับช่องโหว่ของสัญญาอัจฉริยะซึ่งเป็นสิ่งที่ควรหลีกเลี่ยงขณะเขียนโค้ด และสุดท้ายการทดสอบสัญญาและความรู้ในการปรับใช้สัญญาก็เป็นสิ่งจําเป็นเช่นกัน
ทั้งหมดทั้งนั้นอาจกลายเป็นภาระที่หนักมาก ดังนั้นนี่คือแผ่นปฏิบัติการช่วยเริ่มต้นที่รวดเร็ว:
นี่คือเรื่องสั้น ๆ ที่มีเคล็ดลับบางประการที่จะช่วยให้เขียนสัญญาอัจฉริยะได้ดีขึ้น:
🥧 FREI-PI
‼️ ทำไมนักพัฒนาสัญญาอัจฉริยะจำเป็นต้องรู้เรื่องนี้!
ฟังก์ชัน:
– ข้อกำหนด
– ผลกระทบ
– การโต้ตอบ
โปรโตคอล
– อินวาเรียนต์
นี่คือแบบที่คุณควรคิดถึงเมื่อสร้างสัญญาอัจฉริยะทั้งหมด
นี่คือเหตุผลที่ 👇
— Patrick Collins (@PatrickAlphaC)6 กรกฎาคม 2566
มันเป็นเวลาที่จะเข้าสู่ด้านเทคนิคของการพัฒนาสัญญาอัจฉริยะ แม้ว่าเช่น Solana และ Cardano จะช่วยให้คุณสามารถพัฒนาสัญญาอัจฉริยะได้ แต่ Ethereum ยังคงเป็นแพลตฟอร์มการพัฒนาสัญญาอัจฉริยะที่ได้รับความนิยมมากที่สุด
คุณรู้หรือไม่? ในปี 2022 เพียงอย่างเดียว มีกว่า 100,000 แอปพลิเคชันที่ไม่มีส่วนรวมทั่วไปเข้าสู่เครือข่าย Ethereum
Ethereum มีชุมชนนักพัฒนาที่ใหญ่มาก อะไรก็ตามที่คุณพัฒนาจะได้รับความสนใจทันที และภาษาต้นฉบับของมัน คือ Solidity ที่เป็นที่นิยมสำหรับบุคคลที่รู้จัก Python หรือ JavaScript อย่างสมบูรณ์ ในที่สุด ซอฟต์แวร์โลก Ethereum EVM ช่วยในการประมวลผลสัญญาอย่างไม่มีรอยต่อ
หากคุณเป็นคนส่วนใหญ่และชอบใช้ Ethereum และ Solidity นี่คือรายการสั้น ๆ ของสิ่งที่คุณต้องติดตามก่อนที่จะเริ่มการพัฒนาสัญญาอัจฉริยะ
ตอนนี้ที่เราทราบถึงวิธีการทำงานบนโซ่แล้ว เราจะพาลงไปที่การเขียนและการใช้งานสัญญาอัจฉริยะครั้งแรก แม้ว่า “สวัสดีชาวโลก” ยังคงเป็นขั้นตอนแรก แต่เราจะเริ่มต้นด้วยการสร้างสัญญาอัจฉริยะเพื่อเปิดตัวโทเคน BIC ที่เป็นสมมติ ด้วยการปลดล็อคส่วนของการผลิตทั้งหมด 1 ล้าน
ขั้นตอนแรกคือการติดตั้งเวอร์ชันล่าสุดของ Node.js และ NPM หรือ Node Package Manager นี้จะดูแลเครื่องมือพัฒนาและสภาพแวดล้อมท้องถิ่นสำหรับการพัฒนา นอกจากนี้ Node.js และ NPM ยังช่วยให้คุณสามารถตั้งค่าส่วนหน้าเว็บสำหรับสัญญาอัจฉริยะของคุณ
ตอนนี้คุณต้องตั้ง IDE เพื่อเขียนโค้ดสัญญา สำหรับนั้นคุณสามารถติดตั้ง Visual Studio Code ได้อย่างรวดเร็ว หรือคุณสามารถตัดข้อความและhopไปที่ Alchemy — แพลตฟอร์มการพัฒนาบล็อกเชน ด้วย Alchemy คุณสามารถรับ ETH เวอร์ชันเทสเน็ตได้บางส่วน นี้จะช่วยปกป้องค่าธรรมเนียมการใช้ gas เมื่อคุณใช้งานสัญญาอัจฉริยะบนเทสเน็ต Goerli หรือแม้แต่เทสเน็ต Sepolia
โปรดทราบว่า Sepolia เป็นเครือข่ายทดสอบรุ่นใหม่และดังนั้นใช้พื้นที่ดิสก์น้อยกว่าเมื่อเป็นการติดตั้งโหนด
ในขณะนี้เราจะยึดถือกับ Goerli testnet เนื่องจากมันมีจำนวนของการประยุกต์ใช้ที่ถูกติดตั้งมากกว่า
พร้อมกับ testnet และ fake ETH พร้อม ให้เราเริ่มเขียนสัญญาอัจฉริยะโดยเฉพาะ นี่คือโค้ดสำหรับการสร้างโทเค็น BIC ด้วยการจำหน่ายคงที่ 1 ล้าน
หมายเหตุ: เราจะนำสัญญาอัจฉริยะของเราไปใช้งานในเครื่อง Mac และไม่ใช่ที่เทสเน็ต สำหรับการใช้งานสัญญาอัจฉริยะในเทสเน็ตและเมนเน็ตเราจะมีส่วนต่าง ๆ ที่เป็นนอกเหนือจากขอบเขตของการสนทนานี้
นี่คือโค้ดตัวอย่างที่ง่ายสำหรับโทเค็นที่เป็นสมมติ
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract BICToken is ERC20 { constructor() ERC20("BIC Token", "BIC") { _mint(msg.sender, 1000000 * 10 ** decimals()); }}
ถ้าคุณเข้าใจไวยากรณ์ คุณจะรู้ว่าส่วนประกอบของรหัสแต่ละส่วนหมายถึงอะไร สำหรับOpenzepplinส่วนนี้เป็นไลบรารีที่นำเข้าสัญญาอัจฉริยะ ERC-20 ได้ ไลบรารีนี้ให้มาตรฐานการดำเนินการพื้นฐานสำหรับโทเคน ERC-20
ฟังก์ชัน mint พูดถึงการจัดหาเงินเริ่มต้นซึ่งถูกสร้างขึ้นที่ที่อยู่ของสัญญาอัจฉริยะหรือผู้ส่งข้อความ
เพื่อติดตั้งรหัสนี้ในระบบของคุณและทดสอบ คุณจำเป็นต้องมีสามส่วนประกอบ:
หากคุณได้ผ่านกระบวนการเขียนสัญญาอัจฉริยะอย่างละเอียด จำเป็นต้องทราบถึงส่วนใหญ่ของการดำเนินการสัญญา การดำเนินการเป็นกระบวนการที่โค้ดสัญญาอัจฉริยะถูกดำเนินการบนเชนโดยโหนด
มันคือความสม่ำเสมอที่เกี่ยวข้องกับการดำเนินการของสัญญาที่ทำให้สัญญาอัจฉริยะโปร่งใสและไม่สามารถเปลี่ยนแปลงได้ ขอให้เรารู้เพียงว่ากระบวนการที่เกี่ยวข้องกับการดำเนินการของสัญญามีขั้นตอนหลายขั้นตอน:
โค้ดส่วนย่อยที่เราเขียนต้องถูกดำเนินการที่ที่ใดบางแห่ง ในกรณีของสัญญาอัจฉริยะ สถานที่ดำเนินการคือบล็อกเชน โหนดหรือสมาชิกที่เข้าร่วมในเชนช่วยดำเนินการสัญญา
โหนดยอมรับความรับผิดชอบในการดำเนินการบล็อกโค้ดสัญญาเปล่าเพื่อรับสิทธิผลประโยชน์ที่เกี่ยวข้องกับเชื่อมโยง ทุกคำสั่งหรือการกระทำที่เกิดขึ้นภายในเชื่อมโยงนั้นถูกนำทางโดยสัญญาอัจฉริยะ
ทุกสัญญาอัจฉริยะมีที่อยู่เฉพาะ สำหรับการดำเนินการสัญญา ธุรกรรมจะถูกส่งไปยังที่อยู่สัญญานั้น ๆ โปรดทราบว่าทุกโหนดทำงานกับ EVM ซึ่งจะมีสำเนาของรหัสสัญญาอัจฉริยะ ทำให้ง่ายต่อการตรวจสอบความถูกต้องของธุรกรรม
ธุรกรรมที่กําหนดเป้าหมายไปยังสัญญาอัจฉริยะจะถูกเลือกโดยผู้ตรวจสอบความถูกต้องซึ่งจะรวมสิ่งเดียวกันไว้ในบล็อกเฉพาะ
เมื่อธุรกรรมถูกผลักผ่านและตรวจสอบความถูกต้องเรียบร้อยแล้วมันจะกลายเป็นส่วนหนึ่งของบล็อกเชน ฟังก์ชันสัญญาอัจฉริยะที่เกี่ยวข้องกับธุรกรรมจะถูกเรียกและดําเนินการผ่านโหนดบล็อกเชน
ทุกโหนดที่ดำเนินการสัญญาอัจฉริยะควรเดินสู่ข้อสรุปที่เป็นเอกภาพ — ผลลัพธ์เดียวกันสำหรับชุดข้อมูลที่เหมือนกัน — ทำให้ลักษณะของสัญญาเป็นที่ไม่มีความเชื่อถือและโปร่งใสอย่างสมบูรณ์
หมายเหตุ: ข้อผิดพลาดใด ๆ เกี่ยวกับการดำเนินการโค้ดหรือปัญหาที่เกี่ยวข้องกับค่าธรรมเนียมการใช้งานกลับกลับขึ้นการทำธุรกรรม นั่นหมายความว่าการทำธุรกรรมที่ขึ้นอยู่กับโค้ดสัญญาอัจฉริยะเฉพาะหนึ่งจะหยุดอยู่ นั่นคือเช่นเดียวกับสิ่งที่เกิดขึ้นกับ flash loansเมื่อความไม่สามารถที่จะปฏิบัติตามเกณฑ์ที่แน่นอนกลับกลายเป็นการทำธุรกรรมทั้งหมด ซึ่งดูเหมือนว่าเงินทุกๆบาทไม่ได้เคลื่อนที่เลยตั้งแต่แรกเลย
ทุกการเปลี่ยนแปลงของรัฐบาลที่เกี่ยวข้องกับสัญญาอัจฉริยะถูกบันทึกไว้ในบล็อกเชนและกลายเป็นส่วนที่ไม่สามารถเปลี่ยนแปลงได้ของเดียวกัน
ตอนนี้ที่คุณทราบอยู่เกี่ยวกับสัญญาอัจฉริยะอย่างมีความรู้ นี่คือบางข้อแนะนำเพื่อเริ่มต้นในการพัฒนาสัญญา:
ทุกที่กล่าวถึงข้างต้นช่วยในการปรับปรุงรหัสและการป้องกันพิเศษ อย่างไรก็ตาม มีรูปแบบปฏิบัติที่เฉพาะสัญญาบางอย่างที่คุณต้องปฏิบัติตามและนำมาใช้เพื่อดูแลรักษาความยั่งยืนของรหัส มีจุดประสงค์เพื่อรักษารหัสสัญญาให้เบาและใช้งานได้ โดยที่ทุกโหนดที่ทำงานและประมวลผลเดียวกันไม่จำเป็นต้องสลับสลายพลังการประมวลผลมากมายในเดียวกัน
แม้จะปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดในขณะที่เขียนและพัฒนาสัญญาอัจฉริยะ แต่ก็จําเป็นต้องมุ่งเน้นไปที่ช่องโหว่ด้านความปลอดภัยของสัญญาในขณะที่ผลักดันพวกเขาไปยังเครือข่ายหลัก
สัญญาอัจฉริยะทุกฉบับที่มีสถานะอยู่ในเมนเน็ตจะต้องได้รับการประเมินประสิทธิภาพของโค้ดความปลอดภัยและลักษณะอื่น ๆ นี่คือจุดที่การตรวจสอบ - กระบวนการทดสอบสัญญาที่เข้มงวด - มาก่อนช่วยให้คุณสามารถค้นพบช่องโหว่และจุดอ่อนของสัญญาที่อาจเกิดขึ้นได้
นี่คือรายการตรวจสอบด่วนเพื่อเริ่มต้น:
รายการตรวจสอบสัญญาอัจฉริยะที่น่าทึ่ง😈
โปรดตรวจสอบเช็คเค้าในการตรวจสอบครั้งถัดไปของคุณ✅
ฉันขอความกรุณาให้ทวีตออกไป กระจายความรู้🫡https://t.co/ILx0C67kf8
— cholakov (@cholakovv) 7 กรกฎาคม 2023
ขณะที่การอ่านและเขียนสัญญาอัจฉริยะเชื่อมโยงกันเมื่อเรามีการพัฒนารหัสอัจฉริยะตัวอัจฉริยะ การตรวจสอบมีบทบาทที่สำคัญและเกี่ยวข้องกับการตรวจสอบตรรกะในที่แรก เมื่อเรามีการปฏิบัติรหัสที่มีรากฐานบนบล็อกเชน ทุกอย่างเป็นสถานะถาวร และอะไรก็ตามที่มีลักษณะที่สามารถก่อให้เกิดเหตุการณ์ที่ไม่แสดงอาการเป็นไปได้เมื่อมีการปฏิบัติสัญญา นี่คือเหตุผลแท้ที่ทำให้การตรวจสอบรหัสสัญญาและด้านอื่น ๆ ผ่านการตรวจสอบเป็นสิ่งจำเป็น
มีอาจจะมีจำนวนมากของข้อบกพร่องของสัญญา ที่การตรวจสอบสัญญาอัจฉริยะที่ละเอียดสามารถระบุได้ ซึ่งรวมถึงการตรวจสอบการโจมตี reentrancy, การเท, หรือการขาดท่อน้ำ, ปัญหาที่เกี่ยวข้องกับการควบคุมการเข้าถึง, และอื่น ๆ เมื่อระบุความเป็นจริงของปัญหาแล้ว ผู้ตรวจสอบสามารถแนะนำวิธีการที่ดีที่สุดในการแก้ไขสิ่งเดียวกัน
ยังไม่แน่ใจว่าการตรวจสอบสัญญาอัจฉริยะจะช่วยเหลืออย่างไร? ดีให้เรากลับมาสู่ DAOการโจมตีในปี 2016 ซึ่งใช้ช่องโหว่ reentrancy และทำให้ ETH สูญเสียเกือบ 3.6 ล้าน ETH ในทางเดียวกัน มีการโจมตีสัญญากระเป๋า Parity ในปี 2017 ทำให้สูญเสียเกือบ 500,000 ETH เหตุการณ์เหล่านี้สามารถหลีกเลี่ยงได้ด้วยการตรวจสอบชุดที่ถูกต้อง
แผนภูมิการโจมตี DAO: BeInCrypto
มีกลยุทธ์หลายวิธีในการตรวจสอบสัญญาอัจฉริยะ บางอันได้รับความนิยมมากมาย เช่น:
เครื่องมือเหล่านี้ทำหน้าที่เป็นชุดป้องกันแรก และเหมาะที่สุดสำหรับการค้นหาช่องโหว่ที่พบบ่อย บางส่วนของเครื่องมือที่นิยมมาก รวมถึง Securify, Mythril, และอื่น ๆ — สามารถทำการวิเคราะห์แบบคงที่ของโค้ด ตรวจจับรูปแบบการละเมิด และช่วยให้มีการเริ่มต้นด้านความปลอดภัยที่เฉพาะเจาะจง
เครื่องมือในการตรวจสอบสัญญาอัจฉริยะ: BeInCrypto
นี่คือสถานการณ์ที่ผู้ตรวจสอบโค้ดด้วยมือเข้ามามีบทบาท โดยตรวจสอบโค้ดเบื้องต้นและระบุช่องโหว่ที่ซับซ้อน (หากมี) การตรวจสอบด้วยมือช่วยให้สามารถดูแลตรรกศาสตร์ธุรกิจ บริบท และรูปแบบการใช้งาน
นี่คือวิธีที่การตรวจสอบโค้ดด้วยมือช่วยคุณในการค้นหาความเสี่ยง
คำถามเล็กๆ สำหรับผู้ตรวจสอบระดับประถมของเรา!
มาเราไปและทวีตอีกครั้งถ้าคุณพบบั๊ก!pic.twitter.com/i14YtweXcz
— CharlesPaladin (@PaladinCharles) 8 กรกฎาคม 2566
เครื่องมือเช่น Snyk และ GuardRails ช่วยในการสแกนสัญญาโดยอัตโนมัติ - การปฏิบัติความปลอดภัยที่ถูกเรียกใช้ทุกครั้งที่มีการอัปเดตโค้ด รูปแบบการตรวจสอบนี้ทำให้มั่นใจว่าการเปลี่ยนแปลงใหม่ๆ ที่ทำกับโค้ดเป็นอันตราบและไม่มีผลกระทบ
นี่เป็นกระบวนการที่ซับซ้อนซึ่งอาศัยการตรวจสอบตรรกะทางธุรกิจของรหัสเท่านั้น โปรดทราบว่าการตรวจสอบอย่างเป็นทางการไม่ได้มีไว้สําหรับการตรวจสอบไวยากรณ์ แต่เป็นเพียงตรรกะเพื่อดูว่าโค้ดทํางานตามต้องการหรือไม่
นอกจากกลยุทธ์ที่กล่าวถึงข้างต้นแล้ว การตรวจสอบสัญญาอัจฉริยะยังสามารถเริ่มต้นได้โดยใช้การทบทวนโดยเพื่อนร่วมงาน โปรแกรม bug bounty และการ cover test ผ่านเครื่องมือเช่น Solidity Coverage เพื่อเพิ่มประสิทธิภาพสูงสุด
วิธีง่าย ๆ ในการตรวจสอบสัญญาอัจฉริยะ: BeInCrypto
หากคุณเป็นคนใหม่ในการตรวจสอบสัญญาอัจฉริยะ ควรทราบว่ามีวิธีการในการวิเคราะห์โค้ดและระบุปัญหาได้โดยรวมอยู่ 2 วิธี ซึ่งรวมถึง:
ประเภทนี้ของการวิเคราะห์โค้ดช่วยในการระบุช่องโหว่ด้านความปลอดภัยพื้นฐาน ข้อผิดพลาดในการเขียนโค้ด และปัญหาอื่น ๆ ตามมาตรฐานและประกาศในการเขียนโค้ดที่กำหนดไว้ อันตรายเช่นการเรียกใช้จากแหล่งที่มาภายนอกโดยไม่ได้ตรวจสอบ การทะลุเลขจำนวนเต็ม และอื่น ๆ สามารถที่จะได้รับการเน้นโดยใช้การวิเคราะห์แบบคงที่ สิ่งที่ดีที่สุดเกี่ยวกับการวิเคราะห์แบบคงที่คือโค้ดไม่จำเป็นต้องทำงานเพื่อทำการตรวจสอบ
วิธีการตรวจสอบนี้จะทดสอบการจัดตําแหน่งของรหัสกับ EVM แทนที่จะตรวจสอบเฉพาะรหัสการวิเคราะห์แบบไดนามิกจะตรวจสอบการตอบสนองของสัญญาอัจฉริยะต่ออินพุตที่หลากหลาย การวิเคราะห์แบบไดนามิกสามารถระบุปัญหาต่างๆเช่นการใช้ก๊าซที่ไม่สอดคล้องกันและแม้แต่ตรรกะสัญญาที่ผิดพลาด สภาพแวดล้อมบล็อกเชนส่วนบุคคลเช่น Ganache สามารถทํางานเป็นแพลตฟอร์มการวิเคราะห์แบบไดนามิกช่วยให้นักพัฒนาสามารถทําธุรกรรมดําเนินการคําสั่งและทําสิ่งต่างๆได้มากขึ้นกับสัญญาของพวกเขา
นี่คือโค้ดสัญญาอัจฉริยะที่ทำงานเป็นการเก็บเงินกองทุน มีฟังก์ชันการถอน
pragma solidity ^0.6.1;contract VulnerableContract { mapping(address => uint256) public balances; function deposit() public payable { balances[msg.sender] += msg.value; } function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "Insufficient balance."); (bool success, ) = msg.sender.call{value: _amount}(""); require(success, "Transfer failed."); balances[msg.sender] -= _amount; }}
หากคุณสังเกตรหัสโค้ดอย่างใกล้ชิด จะพบว่ามีจุดอ่อนสำคัญ:
ในกรณีก่อนหน้านี้ฟังก์ชัน “ถอน” สามารถเรียกใช้ได้อีกครั้งหากผู้ใช้ที่ได้รับเงินก็เป็นสัญญาอัจฉริยะ แม้ว่าจะเป็นโปรแกรมที่ไม่ดี ดังนั้น ก่อนที่ฟังก์ชันสุดท้ายหรือการอัพเดตยอดเงินจะเกิดขึ้น โจทย์การโจมตีแบบเรียกเข้าไปสามารถเกิดขึ้นเพื่อโอนเงินเพิ่มเติม ผู้ตรวจสอบที่มีประสบการณ์จะระบุชนิดของช่องโหว่เช่นนี้
นี่คือโค้ดที่แก้ไขแล้วสำหรับเหมือนกัน:
function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount, "ยอดคงเหลือไม่เพียงพอ"); balances[msg.sender] -= _amount; (bool success, ) = msg.sender.call{value: _amount}("");
require(success, “โอนเงินล้มเหลว”);}
ตรวจสอบว่าฟังก์ชันอัปเดตยอดเงินถูกเรียกก่อน แล้วจึงเป็นการเคลื่อนย้ายครั้งแรกไปยังผู้ใช้ การเปลี่ยนแปลงลำดับการดำเนินการนี้คือสิ่งที่แก้ไขสัญญา
โลกของแอปพลิเคชันแบบกระจายอํานาจและสัญญาอัจฉริยะได้ก้าวไปไกลกว่า Ethereum แม้ว่าการดําเนินการจํานวนมากยังคงเกิดขึ้นภายในระบบนิเวศของ Ethereum แต่ก็มีเครือข่ายอื่น ๆ เช่น Cardano, Solana และอื่น ๆ ที่รองรับสัญญาอัจฉริยะและต้องการมาตรฐานการตรวจสอบที่แตกต่างกัน
บล็อกเชนที่แตกต่างกันใช้ภาษาการเขียนโปรแกรมที่แตกต่างกัน ความหมาย ไวยากรณ์ และคุณสมบัติของโค้ดนั้นแตกต่างกัน ทําให้สัญญาอัจฉริยะตอบสนองต่อการเขียนและการตรวจสอบที่แตกต่างกัน ตัวอย่างเช่น Ethereum ใช้ Solidity ในขณะที่ Polkadot ใช้ Ink และ Rust ทําให้ตอบสนองต่อมาตรฐานการตรวจสอบเฉพาะ
ตอนนี้หากคุณต้องการก้าวข้ามจาก Ethereum มีเครื่องมือตรวจสอบที่เฉพาะทางเพียงเล็กน้อยที่จะช่วยคุณเริ่มต้น ตัวอย่างเช่น กับ Cardano มีชุด Marlowe สำหรับการตรวจสอบแบบเชิงรูปแบบและการตรวจสอบ ในกรณีของ Solana libfuzzer และ cargo-fuzz ที่เฉพาะของ Rust ใช้สำหรับการตรวจสอบและทดสอบสัญญา ผู้ตรวจสอบหลายๆ โซนต้องเรียนรู้เกี่ยวกับแนวความคิดเหล่านี้เพื่อป้องกันช่องโหว่ของสัญญา
เพียงเพื่อย้ําคุณสามารถแยกการตรวจสอบสัญญาอัจฉริยะออกเป็นสามประเภท: ด้วยตนเองอัตโนมัติและไฮบริด โปรดทราบว่าผู้คนชอบกลยุทธ์การตรวจสอบแบบไฮบริดสําหรับสัญญาที่ซับซ้อนพร้อมตรรกะทางธุรกิจที่ลึกซึ้งเนื่องจากครอบคลุมมากที่สุด
องค์กรและบุคคลที่มีความรู้ในการเขียนโค้ดเพียงเล็กน้อย ต้องการจะเอาออกไปให้กับบริษัทชั้นนำเมื่อเรื่องการตรวจสอบมาถึง เลือกบริษัทที่เหมาะสมกลางสำคัญยิ่งขึ้นเพราะแม้ว่า เครื่องมือ AIชอบChatGPTสามารถช่วยเขียนโค้ดสัญญาอัจฉริยะ การตรวจสอบต้องใช้ความเข้าใจแบบธรรมดา
นอกจากนี้ นี่คือปัจจัยที่ควรระวังขณะจะออกแบบงานตรวจสอบ
ก่อนที่คุณจะเลือกบริษัทที่จะออกแบบด้านนอกที่เหมาะสม สำคัญที่จะตรวจสอบการตรวจสอบในอดีต ประเมินประสบการณ์ และให้ความสำคัญกับสมาชิกทีมหลัก
ก่อนทําการว่าจ้างให้จดบันทึกค่าใช้จ่ายและบริการที่เกี่ยวข้องกับการตรวจสอบ จําเป็นต้องเข้าใจลักษณะของบริการที่นําเสนอก่อนเช่นการระบุปัญหาการแก้ไขปัญหาและอื่น ๆ คุณต้องตรวจสอบด้วยว่ามีการตรวจสอบซ้ําหรือไม่หลังการดําเนินการแก้ไขบรรทัดแรกหรือไม่ ค่าใช้จ่ายในการตรวจสอบสัญญาอัจฉริยะอาจแตกต่างกันไปขึ้นอยู่กับบริการดังนั้นจึงจําเป็นต้องติดตามทุกข้อกําหนดและข้อเสนอก่อนดําเนินการต่อ
ในกรณีที่คุณต้องการทิ้งบริษัทและตรวจสอบสัญญาอัจฉริยะเอง นี่คือกลยุทธ์และปฏิบัติที่ดีที่สุดที่ควรจำไว้
ปัญญาประดิษฐ์ทำให้เราสามารถเขียนสัญญาอัจฉริยะได้ง่ายขึ้นแน่นอน อย่างไรก็ตาม การตรวจสอบสัญญาอัจฉริยะอย่างเหมาะสมยังคงต้องใช้ความเข้าใจและการแทรกแซงจากมนุษย์ ดังนั้น หากคุณวางแผนที่จะสร้างผลิตภัณฑ์ web3 ต่อไปของคุณโดยเน้นที่สัญญาอัจฉริยะและแอปพลิเคชันแบบกระจาย มันจึงสำคัญที่จะมุ่งมั่นในการหาทรัพยากรการตรวจสอบที่ดีที่สุดสำหรับสัญญาอัจฉริยะของคุณ ด้วยการแฮ็กและการละเมิดเงินสกุลเงินดิจิตอลที่ปรากฏขึ้นทุกวัน และฮา๊กเกอร์วางแผนกลยุทธ์ใหม่ๆเพื่อทะลุเข้าไป การตรวจสอบสัญญาอย่างสมบูรณ์เป็นหนึ่งในทักษะที่สำคัญในยุคสมัครสมาน