شروع ساده برای توسعه قرارداد هوشمند با Hardhat

Summarize this content to 400 words in Persian Lang
به پست من در مورد توسعه قرارداد هوشمند خوش آمدید! این پست بیشتر فقط یادداشت های من در مورد نحوه گرفتن یک فوق العاده ساده است قرارداد هوشمند (برنامه خوداجرایی روی یک بلاک چین) نوشته، مستقر و فراخوانی شده است. برای من یادگیری یک چیز جدید با انجام دادن آسان تر است. با این حال، هنگامی که با بلاک چین ها و قراردادهای هوشمند سروکار دارید، این “انجام” زمانی گران می شود که بخواهید چندین بار کاری را برای اهداف آموزشی انجام دهید. از آنجایی که هر نوشتن به یک بلاک چین هزینه ای دارد (در ماشین مجازی اتریوم یا EVM، شبکه های مبتنی بر این هزینه به عنوان الف نامیده می شود هزینه گاز). برای جلوگیری از هزینه نوشتن در یک بلاک چین واقعی، از ابزاری به نام Hardhat استفاده می کنیم. Hardhat یک شبکه EVM/blockchain را برای ما شبیه سازی می کند تا با آن بازی کنیم. وقتی آماده انتشار قرارداد هوشمند خود در یک بلاک چین واقعی هستید، باید یا خودتان یک گره را اجرا کنید یا از یک Node Provider مانند Alchemy استفاده کنید.
در این پست ما قرارداد ساده ای با زبان برنامه نویسی Solidity ایجاد می کنیم که فقط یک متغیر حالت را افزایش می دهد و به ما امکان می دهد مقدار آن را بدست آوریم. برای من، قانعکنندهترین بخش فناوری بلاک چین، تداوم اطلاعاتی است که ارائه میکند. در قراردادهای هوشمند وجود دارد متغیرهای محلی که فقط برای ذخیره داده های موقت در زمانی که قرارداد در حال انجام کاری است استفاده می شود و متغیرهای حالت که ماندگار هستند و اطلاعات را برای همیشه ذخیره می کنند. در مثال امروز ما قراردادی ایجاد می کنیم که دارای تابعی است که متغیر حالت شمارنده را افزایش می دهد و همچنین تابعی برای بازیابی مقدار فعلی آن دارد.
قبل از شروع، می خواهم چند اصطلاح را به شما معرفی کنم، اگر در این فضا تازه کار نیستید، می توانید از این بخش صرف نظر کنید. یکی از مفاهیم کلیدی در بلاک چین این است کلیدها و آدرس های عمومی/خصوصی. اگر با دیگر طرح های رمزگذاری مانند PGP/GPG آشنایی دارید، این همان ایده است. هر کاربر در یک شبکه EVM یک کلید عمومی/آدرس و یک کلید خصوصی دارد. این کلید خصوصی هرگز با کسی به اشتراک گذاشته نمی شود، مگر شما آدرس عمومی هر بار که به بلاک چین می نویسید برای همه قابل مشاهده است. فقط صاحب یک کلید خصوصی می تواند ثابت کند که یک آدرس عمومی متعلق به آنهاست از طریق فرآیندی به نام امضا کردن. یک برنامه (به نام a کیف پول) در رایانه یا تلفن شما کلید خصوصی شما را ذخیره می کند و بیشتر تعامل با بلاک چین را برای شما انجام می دهد. سیستم قراردادهای هوشمند، کیف پول ها و بلاک چین های متصل به یک مرورگر وب اغلب به عنوان “” شناخته می شود.وب3″. یک برنامه وب 3 می تواند با قراردادهای هوشمند تعامل داشته باشد، و از آنجایی که قراردادهای هوشمند خود روی بلاک چین هستند و بر روی یک سرور متمرکز میزبانی نمی شوند، این برنامه ها اغلب به عنوان “” نامیده می شوند.غیر متمرکز”. در یک سیستم غیرمتمرکز مانند این، یکپارچگی تراکنش از طریق اثبات رمزنگاری به جای ایمان به یک مرجع متمرکز حفظ می شود، این ایده به عنوان “”بی اعتمادبرخی از قراردادهای دنیای واقعی مفید که از ویژگیهای پایدار و غیرقابل اعتماد بلاک چین استفاده میکنند، در امور مالی غیرمتمرکز قرار دارند.دفی) و توکن غیر قابل تعویض (NFT) فضاها اما برای امروز، ما فقط از این فناوری برای افزایش شمارنده استفاده خواهیم کرد 🙂
یک پروژه ایجاد کنید و Hardhat را راه اندازی کنید
بیایید با راه اندازی یک پروژه و محیط Hardhat شروع کنیم. برای این کار باید زمان اجرا Javascript سمت سرور Node را قبلاً نصب کرده باشید. توجه داشته باشید که یادداشتهای من در زیر بر اساس تجربه من در سرور لینوکس است، اما سازگاری با برخی از سیستمعاملهای دیگر چندان دشوار نیست.
یک پروژه دایرکتوری و گره ایجاد کنیدmkdir counter-testcd counter-test/npm init –yes
Hardhat را به پروژه اضافه کنیدnpm install –save-dev hardhat
پروژه جدید Hardhat ایجاد کنیدnpx hardhat init
فایل های قرارداد نمونه را حذف کنیدrm contracts/Lock.sol
منبع قرارداد Solidity را در یک فایل .sol ایجاد کنید. موارد زیر را در contracts/counter-test.sol قرار می دهیم
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.27;
import “hardhat/console.sol”;
contract CounterTest {
uint count;
constructor() public {
count = 0;
}
function getCount() public view returns(uint) {
return count;
}
function incrementCount() public {
count = count + 1;
}
}
یک اسکریپت توسعه ایجاد کنید. اسکریپت زیر را در sripts/deploy.js قرار دهید
// We require the Hardhat Runtime Environment explicitly here. This is optional
// but useful for running the script in a standalone fashion through `node `. If you do that, Hardhat
// will compile your contracts, add the Hardhat Runtime Environment’s members to the
// global scope, and execute the script.
const hre = require(“hardhat”);
async function main() {
const lockedAmount = hre.ethers.parseEther(“0.001”);
const lock = await hre.ethers.deployContract(“CounterTest”);
await lock.waitForDeployment();
console.log( ‘Deploying CounterTest’);
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
]]>
قرارداد Hardhat Node و Deploy را شروع کنید
hardhat.config.js را ویرایش کنید تا لوکال هاست را شامل شود:
/** @type import(‘hardhat/config’).HardhatUserConfig */
module.exports = {
networks: {
localhost: {
url: “http://127.0.0.1:8545”,
chainId: 1337
},
hardhat: {
// See defaults
chainId: 1337
}
},
solidity: “0.8.27”,
};
گره لوکال هاست Hardhat را برای آزمایش در ترمینال جداگانه راه اندازی کنید. این یک گره Hardhat را در پیش زمینه شروع می کند و اطلاعات اشکال زدایی را در حین برقراری ارتباط با قرارداد هوشمند خود از ترمینال دیگر نمایش می دهد:npx hardhat nodeچیزی شبیه به زیر دریافت خواهید کرد که مجموعه ای از آدرس های آزمایشی را برای کار با آنها لیست می کند که قبلاً دارای بودجه آزمایشی هستند:
اکنون که یک بلاک چین محلی برای آزمایش دارید، بیایید به ترمینال دیگر برگردیم و قرارداد هوشمند خود را با اسکریپت deploy.js که قبلا ایجاد کردیم، اجرا کنیم.npx hardhat run scripts/deploy.js –network localhost
اگر گره هاردات را رصد کنیم، شاهد تلاش خود برای استقرار قرارداد هوشمند خواهیم بود. توجه داشته باشید که آدرس From با آدرس عمومی اولین حساب آزمایشی مطابقت دارد. همچنین توجه داشته باشید که ما اکنون یک آدرس قرارداد داریم (0x5fbdb2315678afecb367f032d93f642f64180aa3)، برای تعامل با قرارداد به آن نیاز داریم.
قرارداد ما مستقر شده است!
یک نکته پایانی در مورد قراردادهای هوشمند مستقر برای این پست – نسخه web3 یک “API” یک ABI یا رابط باینری برنامه است. اگر شخصی بخواهد یک برنامه کاربردی برای تعامل با قرارداد شما ایجاد کند، باید بداند چه عملکردهایی در دسترس است. اینها را می توان به راحتی در ABI JSON که هنگام استقرار ایجاد شد پیدا کرد، به مصنوعات/contracts/counter-test.sol/CounterTest.json نگاهی بیندازید. بخش مهم در اینجا آرایه JSON برای ABI است:
تعامل با قرارداد خود را از کنسول Hardhat
اکنون که قرارداد ما بر روی بلاک چین نوشته و مستقر شده است، بیایید سعی کنیم برخی از توابع آن را فراخوانی کنیم.
کنسول Hardhat Javascript را راه اندازی کنید
npx hardhat console –network localhost
ما اتصال قرارداد خود را در متغیر myContract ذخیره می کنیم
const myContract = await ethers.getContractAt(“CounterTest”,”0x5fbdb2315678afecb367f032d93f642f64180aa3″)
بعد، بیایید تابع getCount () خود را فراخوانی کنیم و ببینیم که تعداد فعلی چقدر است:await myContract.getCount()اگر این اولین اجرای ما باشد، باید “0n” دریافت کنید. n را نادیده بگیرید، این فقط نوع را نشان می دهد. اگر از این قرارداد در زندگی واقعی استفاده میکردید، میتوانید این را به یک عدد صحیح یا هر نوع دیگری که در کد نیاز دارید ارسال کنید.
حال، بیایید شمارنده را با تابع ()incrementCount خود افزایش دهیم:await myContract.incrementCount()خروجی بسیار بیشتری از این تماس خواهید دید زیرا ما در واقع اطلاعاتی را به بلاک چین اضافه می کنیم. مهمتر از همه، blockHash تراکنش و gasPrice را خواهید دید.
دوباره getCount() را فراخوانی کنید تا تأیید کنید که شمارنده مطابق انتظار افزایش یافته است. کل تعامل باید چیزی شبیه به این باشد:
و بس! ما یک قرارداد هوشمند را روی بلاکچین شبیه سازی شده خود نوشته ایم، مستقر کرده ایم و فراخوانی کرده ایم! برای تبدیل این برنامه به یک برنامه web3، می توانید ایجاد یک فرانت اند شامل کتابخانه ethers.js برای تعامل با قرارداد خود را بررسی کنید.
به پست من در مورد توسعه قرارداد هوشمند خوش آمدید! این پست بیشتر فقط یادداشت های من در مورد نحوه گرفتن یک فوق العاده ساده است قرارداد هوشمند (برنامه خوداجرایی روی یک بلاک چین) نوشته، مستقر و فراخوانی شده است. برای من یادگیری یک چیز جدید با انجام دادن آسان تر است. با این حال، هنگامی که با بلاک چین ها و قراردادهای هوشمند سروکار دارید، این “انجام” زمانی گران می شود که بخواهید چندین بار کاری را برای اهداف آموزشی انجام دهید. از آنجایی که هر نوشتن به یک بلاک چین هزینه ای دارد (در ماشین مجازی اتریوم یا EVM، شبکه های مبتنی بر این هزینه به عنوان الف نامیده می شود هزینه گاز). برای جلوگیری از هزینه نوشتن در یک بلاک چین واقعی، از ابزاری به نام Hardhat استفاده می کنیم. Hardhat یک شبکه EVM/blockchain را برای ما شبیه سازی می کند تا با آن بازی کنیم. وقتی آماده انتشار قرارداد هوشمند خود در یک بلاک چین واقعی هستید، باید یا خودتان یک گره را اجرا کنید یا از یک Node Provider مانند Alchemy استفاده کنید.
در این پست ما قرارداد ساده ای با زبان برنامه نویسی Solidity ایجاد می کنیم که فقط یک متغیر حالت را افزایش می دهد و به ما امکان می دهد مقدار آن را بدست آوریم. برای من، قانعکنندهترین بخش فناوری بلاک چین، تداوم اطلاعاتی است که ارائه میکند. در قراردادهای هوشمند وجود دارد متغیرهای محلی که فقط برای ذخیره داده های موقت در زمانی که قرارداد در حال انجام کاری است استفاده می شود و متغیرهای حالت که ماندگار هستند و اطلاعات را برای همیشه ذخیره می کنند. در مثال امروز ما قراردادی ایجاد می کنیم که دارای تابعی است که متغیر حالت شمارنده را افزایش می دهد و همچنین تابعی برای بازیابی مقدار فعلی آن دارد.
قبل از شروع، می خواهم چند اصطلاح را به شما معرفی کنم، اگر در این فضا تازه کار نیستید، می توانید از این بخش صرف نظر کنید. یکی از مفاهیم کلیدی در بلاک چین این است کلیدها و آدرس های عمومی/خصوصی. اگر با دیگر طرح های رمزگذاری مانند PGP/GPG آشنایی دارید، این همان ایده است. هر کاربر در یک شبکه EVM یک کلید عمومی/آدرس و یک کلید خصوصی دارد. این کلید خصوصی هرگز با کسی به اشتراک گذاشته نمی شود، مگر شما آدرس عمومی هر بار که به بلاک چین می نویسید برای همه قابل مشاهده است. فقط صاحب یک کلید خصوصی می تواند ثابت کند که یک آدرس عمومی متعلق به آنهاست از طریق فرآیندی به نام امضا کردن. یک برنامه (به نام a کیف پول) در رایانه یا تلفن شما کلید خصوصی شما را ذخیره می کند و بیشتر تعامل با بلاک چین را برای شما انجام می دهد. سیستم قراردادهای هوشمند، کیف پول ها و بلاک چین های متصل به یک مرورگر وب اغلب به عنوان “” شناخته می شود.وب3“. یک برنامه وب 3 می تواند با قراردادهای هوشمند تعامل داشته باشد، و از آنجایی که قراردادهای هوشمند خود روی بلاک چین هستند و بر روی یک سرور متمرکز میزبانی نمی شوند، این برنامه ها اغلب به عنوان “” نامیده می شوند.غیر متمرکز“. در یک سیستم غیرمتمرکز مانند این، یکپارچگی تراکنش از طریق اثبات رمزنگاری به جای ایمان به یک مرجع متمرکز حفظ می شود، این ایده به عنوان “”بی اعتمادبرخی از قراردادهای دنیای واقعی مفید که از ویژگیهای پایدار و غیرقابل اعتماد بلاک چین استفاده میکنند، در امور مالی غیرمتمرکز قرار دارند.دفی) و توکن غیر قابل تعویض (NFT) فضاها اما برای امروز، ما فقط از این فناوری برای افزایش شمارنده استفاده خواهیم کرد 🙂
یک پروژه ایجاد کنید و Hardhat را راه اندازی کنید
بیایید با راه اندازی یک پروژه و محیط Hardhat شروع کنیم. برای این کار باید زمان اجرا Javascript سمت سرور Node را قبلاً نصب کرده باشید. توجه داشته باشید که یادداشتهای من در زیر بر اساس تجربه من در سرور لینوکس است، اما سازگاری با برخی از سیستمعاملهای دیگر چندان دشوار نیست.
-
یک پروژه دایرکتوری و گره ایجاد کنید
mkdir counter-test
cd counter-test/
npm init --yes -
Hardhat را به پروژه اضافه کنید
npm install --save-dev hardhat
-
پروژه جدید Hardhat ایجاد کنید
npx hardhat init
-
فایل های قرارداد نمونه را حذف کنید
rm contracts/Lock.sol
-
منبع قرارداد Solidity را در یک فایل .sol ایجاد کنید. موارد زیر را در contracts/counter-test.sol قرار می دهیم
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.27; import "hardhat/console.sol"; contract CounterTest { uint count; constructor() public { count = 0; } function getCount() public view returns(uint) { return count; } function incrementCount() public { count = count + 1; } }
-
یک اسکریپت توسعه ایجاد کنید. اسکریپت زیر را در sripts/deploy.js قرار دهید
// We require the Hardhat Runtime Environment explicitly here. This is optional // but useful for running the script in a standalone fashion through `node
قرارداد Hardhat Node و Deploy را شروع کنید
-
hardhat.config.js را ویرایش کنید تا لوکال هاست را شامل شود:
/** @type import('hardhat/config').HardhatUserConfig */ module.exports = { networks: { localhost: { url: "http://127.0.0.1:8545", chainId: 1337 }, hardhat: { // See defaults chainId: 1337 } }, solidity: "0.8.27", };
-
گره لوکال هاست Hardhat را برای آزمایش در ترمینال جداگانه راه اندازی کنید. این یک گره Hardhat را در پیش زمینه شروع می کند و اطلاعات اشکال زدایی را در حین برقراری ارتباط با قرارداد هوشمند خود از ترمینال دیگر نمایش می دهد:
npx hardhat node
چیزی شبیه به زیر دریافت خواهید کرد که مجموعه ای از آدرس های آزمایشی را برای کار با آنها لیست می کند که قبلاً دارای بودجه آزمایشی هستند: -
اکنون که یک بلاک چین محلی برای آزمایش دارید، بیایید به ترمینال دیگر برگردیم و قرارداد هوشمند خود را با اسکریپت deploy.js که قبلا ایجاد کردیم، اجرا کنیم.
npx hardhat run scripts/deploy.js --network localhost
اگر گره هاردات را رصد کنیم، شاهد تلاش خود برای استقرار قرارداد هوشمند خواهیم بود. توجه داشته باشید که آدرس From با آدرس عمومی اولین حساب آزمایشی مطابقت دارد. همچنین توجه داشته باشید که ما اکنون یک آدرس قرارداد داریم (0x5fbdb2315678afecb367f032d93f642f64180aa3)، برای تعامل با قرارداد به آن نیاز داریم.
قرارداد ما مستقر شده است!
-
یک نکته پایانی در مورد قراردادهای هوشمند مستقر برای این پست – نسخه web3 یک “API” یک ABI یا رابط باینری برنامه است. اگر شخصی بخواهد یک برنامه کاربردی برای تعامل با قرارداد شما ایجاد کند، باید بداند چه عملکردهایی در دسترس است. اینها را می توان به راحتی در ABI JSON که هنگام استقرار ایجاد شد پیدا کرد، به مصنوعات/contracts/counter-test.sol/CounterTest.json نگاهی بیندازید. بخش مهم در اینجا آرایه JSON برای ABI است:
تعامل با قرارداد خود را از کنسول Hardhat
اکنون که قرارداد ما بر روی بلاک چین نوشته و مستقر شده است، بیایید سعی کنیم برخی از توابع آن را فراخوانی کنیم.
-
کنسول Hardhat Javascript را راه اندازی کنید
npx hardhat console --network localhost
-
ما اتصال قرارداد خود را در متغیر myContract ذخیره می کنیم
const myContract = await ethers.getContractAt("CounterTest","0x5fbdb2315678afecb367f032d93f642f64180aa3")
-
بعد، بیایید تابع getCount () خود را فراخوانی کنیم و ببینیم که تعداد فعلی چقدر است:
await myContract.getCount()
اگر این اولین اجرای ما باشد، باید “0n” دریافت کنید. n را نادیده بگیرید، این فقط نوع را نشان می دهد. اگر از این قرارداد در زندگی واقعی استفاده میکردید، میتوانید این را به یک عدد صحیح یا هر نوع دیگری که در کد نیاز دارید ارسال کنید. -
حال، بیایید شمارنده را با تابع ()incrementCount خود افزایش دهیم:
await myContract.incrementCount()
خروجی بسیار بیشتری از این تماس خواهید دید زیرا ما در واقع اطلاعاتی را به بلاک چین اضافه می کنیم. مهمتر از همه، blockHash تراکنش و gasPrice را خواهید دید. -
دوباره getCount() را فراخوانی کنید تا تأیید کنید که شمارنده مطابق انتظار افزایش یافته است. کل تعامل باید چیزی شبیه به این باشد:
و بس! ما یک قرارداد هوشمند را روی بلاکچین شبیه سازی شده خود نوشته ایم، مستقر کرده ایم و فراخوانی کرده ایم! برای تبدیل این برنامه به یک برنامه web3، می توانید ایجاد یک فرانت اند شامل کتابخانه ethers.js برای تعامل با قرارداد خود را بررسی کنید.