פרק 5: פיתוח חוזים חכמים
מבוא
בפרק זה נלמד כיצד לפתח חוזים חכמים באמצעות Solidity, שפת התכנות הפופולרית ביותר לכתיבת חוזים חכמים על גבי את'ריום. נתקין את הכלים הדרושים, נכתוב חוזים חכמים בסיסיים, נפרוס אותם על רשת מקומית ונבדוק אותם.
שלב 1: התקנת הכלים הדרושים
התקנת Truffle ו-Ganache
Truffle היא מסגרת עבודה לפיתוח חוזים חכמים ב-Solidity. Ganache היא רשת בלוקצ'יין מקומית לבדיקת חוזים חכמים.
התקן את Truffle:
npm install -g truffle
התקן את Ganache:
npm install -g ganache-cli
יצירת פרויקט Truffle
-
צור תיקייה חדשה עבור הפרויקט שלך:
mkdir my-smart-contract
cd my-smart-contract
אתחל פרויקט Truffle חדש:
truffle init
שלב 2: כתיבת חוזה חכם ב-Solidity
יצירת חוזה חכם לאחסון ושליפת נתונים
נכתוב חוזה חכם פשוט לאחסון ושליפת נתונים.
- בתוך תיקיית הפרויקט, צור קובץ חדש בשם
SimpleStorage.sol
בתיקייתcontracts
:
// contracts/SimpleStorage.sol
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 storedData;
function set(uint256 x) public {
storedData = x;
}
function get() public view returns (uint256) {
return storedData;
}
}
שלב 3: פריסת החוזה החכם
עדכון קובץ ה-Migration
נעדכן את קובץ ה-Migration כדי לפרוס את החוזה.
- ערוך את קובץ
2_deploy_contracts.js
בתיקייתmigrations
:
// migrations/2_deploy_contracts.js
const SimpleStorage = artifacts.require("SimpleStorage");
module.exports = function(deployer) {
deployer.deploy(SimpleStorage);
};
הרצת Ganache והגדרת רשת מקומית
Ganache מאפשרת לנו להריץ רשת בלוקצ'יין מקומית לבדיקת החוזים החכמים.
- הרץ את Ganache:
ganache-cli
פריסת החוזה החכם על הרשת המקומית
- בפרויקט Truffle, נפרוס את החוזה החכם:
truffle migrate
שלב 4: בדיקת החוזה החכם
כתיבת מבחנים לחוזה החכם
נכתוב מבחנים כדי לוודא שהחוזה החכם פועל כראוי.
-
צור קובץ חדש בשם
testSimpleStorage.js
בתיקייתtest
:
// test/testSimpleStorage.js
const SimpleStorage = artifacts.require("SimpleStorage");
contract('SimpleStorage', (accounts) => {
it('should store the value 89.', async () => {
const simpleStorageInstance = await SimpleStorage.deployed();
// Set value of 89
await simpleStorageInstance.set(89, { from: accounts[0] });
// Get stored value
const storedData = await simpleStorageInstance.get.call();
assert.equal(storedData, 89, "The value 89 was not stored.");
});
});
נריץ את המבחנים:
truffle test
הסבר מפורט על הקוד
-
כתיבת החוזה החכם (SimpleStorage.sol)
- הקוד מתחיל בהגדרת גרסת הקומפיילר
pragma solidity ^0.8.0;
. - אנו יוצרים חוזה חכם בשם
SimpleStorage
שמכיל משתנה יחיד מסוגuint256
בשםstoredData
. - החוזה מכיל שתי פונקציות:
set(uint256 x)
: פונקציה שמקבלת מספר שלם ומעדכנת את המשתנהstoredData
.get() public view returns (uint256)
: פונקציה שמחזירה את הערך הנוכחי שלstoredData
.
- הקוד מתחיל בהגדרת גרסת הקומפיילר
-
עדכון קובץ ה-Migration (2_deploy_contracts.js)
- הקובץ טוען את החוזה החכם
SimpleStorage
באמצעותartifacts.require
. - אנו מגדירים פונקציה שמפרסת את החוזה באמצעות
deployer.deploy(SimpleStorage)
.
- הקובץ טוען את החוזה החכם
-
הרצת Ganache והגדרת רשת מקומית
- הרצת
ganache-cli
יוצרת רשת בלוקצ'יין מקומית שניתן לבדוק עליה את החוזים החכמים.
- הרצת
-
פריסת החוזה החכם על הרשת המקומית
- הרצת
truffle migrate
מפרסת את החוזה החכם על הרשת המקומית ומציגה את הכתובת שלו.
- הרצת
-
כתיבת מבחנים לחוזה החכם (testSimpleStorage.js)
- אנו טוענים את החוזה החכם
SimpleStorage
באמצעותartifacts.require
. - במבחן
should store the value 89
, אנו מוודאים שהחוזה שומר את הערך 89 כראוי. - הפונקציה
set
מעדכנת את הערך שלstoredData
. - הפונקציה
get
מחזירה את הערך המאוחסן ואנו מוודאים שהוא שווה ל-89.
- אנו טוענים את החוזה החכם
שלב 5: שיטות עבודה מומלצות לפיתוח חוזים חכמים
תיעוד קוד
חשוב לתעד את הקוד שלך כדי להבטיח שהוא קריא ומובן לאחרים ולך בעתיד.
- דוגמה לתיעוד חוזה חכם ב-Solidity:
// contracts/SimpleStorage.sol
pragma solidity ^0.8.0;
/**
* @title SimpleStorage
* @dev Store & retrieve value in a variable
*/
contract SimpleStorage {
uint256 private storedData;
/**
* @dev Store value in variable
* @param x value to store
*/
function set(uint256 x) public {
storedData = x;
}
/**
* @dev Return value
* @return value of 'storedData'
*/
function get() public view returns (uint256) {
return storedData;
}
}
בדיקות אוטומטיות ושילוב מתמשך (CI)
שימוש בכלים כמו GitHub Actions, Travis CI או Jenkins לבדיקות אוטומטיות ושילוב מתמשך יכול לשפר את איכות הקוד שלך.
- דוגמה להגדרת GitHub Actions לבדיקת חוזים חכמים:
# .github/workflows/truffle.yml
name: Truffle
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '12'
- name: Install dependencies
run: npm install
- name: Start Ganache
run: npm run ganache-cli &
- name: Run tests
run: truffle test