در طول سال گذشته، شاهد افزایش راهحلهای مقیاسپذیری لایه دو (Layer two) برای اتریوم بودهایم که ZK-rollups برخی از امیدوارکنندهترین آنها هستند. به لطف Stark rollup، هر برنامه غیرمتمرکز میتواند به مقیاس محاسباتی بیحد و حصری دست یابد که شبکه اتریوم را ایمن و پایدار نگه میدارد. این امر با این واقعیت امکان پذیر میشود که سیستم اثبات رمزنگاری STARK، که انعطاف پذیرترین و مقیاس پذیرترین سیستم اثبات رمزنگاری است، توسط StarkNet استفاده می شود.
و Infura، برترین ارائه دهنده node برای Web3، اکنون از طریق سرویس ارائه دهنده node خود، سازگاری با StarkNet را ارائه می دهد! با ارائه endpoint هایStarkNet RPC، Infura به پر کردن شکاف برای توسعهدهندگان اتریوم کمک میکند و ساخت یک اکوسیستم قابل ترکیب در Web3 را تسهیل میکند.
در این مقاله به این پرسشها پاسخ میدهیم: StarkNet چیست، چگونه به مقیاس پذیری اتریوم کمک میکند و چگونه توسعهدهندگان میتوانند با راه اندازی یک قرارداد هوشمند با شبکه با استفاده از Infura شروع به کار کنند. همچنین میآموزید که چگونه با endpoint های Infura RPC به StarkNet دسترسی داشته باشید و توکن های ERC-20 خود را در شبکه مستقر کنید.
مقیاس پذیری اتریوم
افزودن پل به شبکه لایه دو (Layer two) یکی از موثرترین استراتژیها برای به حداکثر رساندن ارزش داراییهای کریپتو است. کارمزدهای تراکنش کمتر، توان عملیاتی بیشتر و بهبود تجربه مشتری همگی از مزایای انجام این کار هستند.
Rollup ها جزو پرکاربردترین گزینهها برای مقیاس بندی لایه دو هستند. آنها با پردازش تراکنشهای خارج از زنجیره کار میکنند. آنها همچنین میتوانند ذخیرهسازی دادههای تراکنش را در زنجیره اتریوم تضمین کنند و امنیت شبکه لایه یک را تقویت کنند.
Rollup های Zero-knowledge، proof های رمزنگاری را ایجاد میکنند که مشروعیت یک تراکنش را ثابت میکند. جالب است بدانید که هر دسته از تراکنشها دارای یک “Validity proof” منحصر به فرد در زنجیره اصلی هستند. از سوی دیگر، Optimistic rollup ها فرض میکنند که همه تراکنشها معتبر هستند و میتوانند دستهای از تراکنشها را بدون هیچ محاسبهای ارسال کنند.
توانایی rollup های ZK برای ارزیابی یکپارچگی تراکنشها بر proof های رمزنگاری تکیه میکند. برعکس، زمان بین ارسال rollup و پذیرش آن در زنجیره پایه Optimistic rollup ها دشوار است.
StarkNet و STARKs
StarkNet یک مجموعه ZK غیرمتمرکز بدون مجوز است. این شبکه به عنوان یک شبکه L2 در بالای اتریوم عمل میکند و به هر برنامهای اجازه میدهد تا به مقیاسی بینهایت برای پردازش برسد، بدون اینکه بر امنیت و ترکیبپذیری اتریوم تأثیر بگذارد.
با استفاده از proof های احتمالی قابل بررسی quasi-linear یا شبه خطی(PCPs)، interactive oracle proof ها (IOPs)، و پروتکلهای کدگذاری محلی جبری سریع مانند FRI، توابع هش رمزنگاری StarkNet سریعترین عملکرد را دارند. آنها از تمام تکنولوژیهای دیگر ZK بهتر عمل میکنند.
کامپایلر Solidity to Cairo همچنین ساختهای سریعتری را برای توسعهدهندگان Solidity با استفاده از مجموعه ZK فعال میکند و استفاده از ابزارهای Solidity را در پشته توسعهدهنده تسهیل میکند.
StarkNet Endpoints با Infura
Infura، ارائه دهنده Web3 Infrastructure-as-a-Service (IaaS)، خدمات و ابزارهای مختلفی را برای توسعه دهندگان بلاک چین ارائه میدهد. مجموعه Infura Application Programming Interface (API) بخشی از این است.
هر پروژهای که ترافیک زیادی را از طریق شبکه اتریوم انجام میدهد، یا پروژه ای که قصد انجام آن را دارد، می تواند از راه حلهای مقیاس بندی مدولار Infura بهره مند شود. شبکه مشتریان اتریوم میزبانی شده که از شبکه اصلی و شبکههای آزمایشی از طریق JSON-RPC سازگار با کلاینت از طریق HTTPS و WSS پشتیبانی میکند، شناخته شده ترین مؤلفه زیرساخت Infura است.
endpoint های StarkNet اکنون به طور گستردهای در دسترس هستند و توسط Infura پشتیبانی میشوند. StarkNet مقیاس پذیری نامحدودی را برای هر مورد استفاده تجاری، با پشتیبانی STARK ها، قوی ترین proof های Zero-knowledge در اکوسیستم اتریوم، امکان پذیر میکند.
نحوه راه اندازی یک پروژه در StarkNet با Infura
پیش نیازها
قبل از شروع، به پیش نیازهای زیر نیاز داریم:
- Node.js وPackage manager آن NPM.
با استفاده از دستور ترمینال زیر، تأیید کنید که Node.js نصب شده است:
node -v && npm –v
- یک حساب کاربری Infura
- دانش اولیه جاوا اسکریپت
برای دسترسی به شبکه StarkNet یک اکانت Infura بسازید
برای دسترسی به یک StarkNet node و اجرای درخواستها، به یک Infura endpoint نیاز داریم.
وارد وب سایت Infura شوید تا برای یک اکانت جدید ثبت نام کنید یا اگر از قبل در آن اکانت دارید، وارد آن شوید.

پس از ثبت نام موفقیتآمیز، صفحه به داشبورد ما هدایت میشود، جایی که میتوانیم مانند تصویر زیر یک Key جدید ایجاد کنیم.

روی دکمه “ Create a New Key” کلیک کنید و فیلدهای مورد نیاز را پر کنید

سپس روی دکمه “MANAGE KEY” کلیک کنید، به قسمت Starknet بروید، شبکه Goerli را انتخاب کنید و URL را کپی کنید.


ساخت یک پروژه در StarkNet با Infura
این بخش برنامه ما را از ابتدا برای پیاده سازی ایجاد حساب StarkNet، استقرار، minting و انتقال توکنها میسازد.
راه اندازی و نصب پروژه
در ابتدا یک پروژه خالی ایجاد کنید و با استفاده از دستورات زیر وابستگی کتابخانهای starknet.js را نصب کنید.
mkdir deploy-erc-20-token-with-starknet
cd deploy-erc-20-token-with-starknet
npm init -y
npm install starknet dotenv
touch index.js
سپس، یک فایل .env ایجاد کنید و URL StarkNet را که از داشبورد Infura کپی کردهاید، Paste کنید.
STARKNET_TESTNET_ENDPOINT=https://starknet-goerli.infura.io/v3/
دانلود Account Contract ABI
برای دانلود Contract ABI برای ERC-20 و OZAccount به فولدر Contract در این مخزن بروید.
یک فولدر جدید به نام Contract ایجاد کنید. سپس، دو فایل جدید در داخل پوشه ایجاد کنید، ERC20.json و OZAccount.json.
سپس، Contract ABI را که کپی کرده بودیم، در آن فایلها پیست میکنیم. ساختار فولدر پروژه ما باید شبیه به آنچه در زیر داریم به نظر برسد.

نصب Provider
ما ممکن است از طریق Provider API بدون امضای هیچ گونه تراکنش یا پیامی با شبکه StarkNet ارتباط برقرار کنیم. ما یک Provider از طریق endpoint مربوط بهInfura API نصب خواهیم کرد، اما در برخی موارد، ممکن است بخواهیم از Provider دیفالت نیز استفاده کنیم.
در فایل index.js قطعه کد زیر را اضافه کنید.
import dotenv from "dotenv";
import fs from "fs";
import { Account, Contract, ec, json, stark, Provider, number } from "starknet";
import readline from "readline";
dotenv.config();
// Initialize provider
const url = process.env.STARKNET_TESTNET_ENDPOINT;
console.log("Using Infura Starknet provider: ", url);
const provider = new Provider({
rpc: {
nodeUrl: url,
},
});
در قطعه کد بالا، ما کارهای زیر را انجام دادهایم:
– کتابخانههای starknet، fs و dotenv را وارد کردیم.
– URL Provider مقداردهی اولیه شد.
– یک نمونه جدید از Provider را از کتابخانه starknet ایجاد کردیم.
Key Pair خصوصی و عمومی ایجاد کنید
از آنجایی که StarkNet از اکانتهای تحت مالکیت خارجی (EOA) پشتیبانی نمیکند، تمام اکانتهای موجود در شبکه آن Contractها هستند. برخلاف اتریوم، که در آنKey Pair عمومی و خصوصی اکانتها را تسهیل میکنند، حسابهای StarkNet تنها ابزاری برای امضای تراکنشها و ارتباطات و تأیید امضا هستند. در نتیجه، یک رابط قرارداد-حساب مورد نیاز است.
اجازه دهید Key Pair عمومی و خصوصی را با قطعه کد زیر ایجاد کنیم:
// Generate public and private key pair.
const privateKey = stark.randomAddress();
const starkKeyPair = ec.genKeyPair(privateKey);
const starkKeyPub = ec.getStarkKey(starkKeyPair);
// Log the Public and Private key pair.
console.log(`Private key: ${privateKey}`);
console.log(`Public key: ${starkKeyPub}`);
برای تست برنامه ما، در مرحله بعد و هر مرحله بعد از آن، از دستور زیر استفاده کنید:
node index
هر بار که نیاز به اجرای پروژه به صورت محلی داشته باشیم از دستور بالا استفاده میکنیم.
توجه: اگر SyntaxError دریافت میکنید مبنی بر اینکه نمیتوانید از دستور import خارج از یک ماژول استفاده کنید، «type»: «module» را به فایل package.json خود اضافه کنید.
باید چیزی شبیه به خروجی زیر داشته باشیم:

در صورتی که فکر میکنید ممکن است در آینده و برای برای سایر رویهها نیاز به استفاده مجدد از آنها دارید، هر دو Key را یادداشت کنید.
هرگز Key های خصوصی خود را با کسی به اشتراک نگذارید و در حفظ ایمنی آنها دقت کنید.
یک حساب کاربری جدید در StarkNet مستقر کنید
با استفاده از روش deployContract مربوط به Provider و ارسال Key عمومی تولیدشده قبلی به عنوان ورودی، میتوانیم قرارداد حساب از پیش کامپایل شده را در StarkNet مستقر کنیم.
قطعه کد زیر را برای استقرار قرارداد حساب اضافه کنید و منتظر بمانید تا در StarkNet تأیید شود.
//...
// Deploy the Account contract and wait for it to be verified on StarkNet.
console.log(
`////////////////////////////////////////////////////////////////////////////////
Deployment Tx - Account Contract to StarkNet...
////////////////////////////////////////////////////////////////////////////////`
);
const compiledOZAccount = json.parse(
fs.readFileSync("./contracts/OZAccount.json").toString("ascii")
);
const accountResponse = await provider.deployContract({
contract: compiledOZAccount,
constructorCalldata: [starkKeyPub],
addressSalt: starkKeyPub,
});
console.log("Account address ", accountResponse.contract_address);
console.log(
`See account on the explorer: https://goerli.voyager.online/contract/${accountResponse.contract_address}`
);
console.log(
`Follow the tx status on: https://goerli.voyager.online/tx/${accountResponse.transaction_hash}`
);
console.log(
`////////////////////////////////////////////////////////////////////////////////
Waiting for Tx to be Accepted on Starknet - OpenZeppelin Account Deployment...
////////////////////////////////////////////////////////////////////////////////`
);
await provider.waitForTransaction(accountResponse.transaction_hash);
console.log("Account contract deployed successfully!");

ممکن است تکمیل این عملیات چند دقیقه طول بکشد، اما همیشه میتوانیم پیشرفت آن را از طریق URL اکسپلورر ثبتشده در console پیگیری کنیم. برای جلوگیری از ایجاد چندین اکانت در هر باری که دستور شروع پروژه را اجرا میکنیم، حتما بقیه کدهای پروژه را پر کنید.
اکانت جدید را تامین مالی کنید
قبل از هر چیز دیگری، باید کدی اضافه کنیم تا اجرا را متوقف کرده و پس از انجام تمام اقدامات بالا، آن را از سر بگیریم. پس از راه اندازی، این مکث ضروری است زیرا عملکرد ما متوقف نمی شود. برای تامین مالی حسابمان و تایید تراکنش به زمان نیاز داریم.
از این رو متد زیر را در فایل index.js قرار می دهیم.
//…
function askQuestion(query) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
return new Promise((resolve) =>
rl.question(query, (ans) => {
rl.close();
resolve(ans);
})
);
}
const ans = await askQuestion(
"Did you add funds to your Account? Hit enter if yes"
);
توجه!
قبل از اجرای مجدد برنامه، حتماً بقیه کدهای پروژه را پر کنید. با این کار نیازی به تامین مالی چندین حساب وجود نخواهد داشت. پس از اجرای مجدد کد، باید یک prompt مشابه آنچه در زیر داریم داشته باشیم. با این کار، در حالی که چند faucet به حساب خود اضافه می کنیم، اجرا هم متوقف می شود.

قبل از انجام تراکنشها در شبکه StarkNet، باید حساب خود را کمی شارژ کنیم (درست مانند اتریوم). با استفاده از StarkNet Goerli Faucet رسمی، میتوانیم با پیست کردن آدرس اکانت از خروجی ترمینال، حساب خود را تامین مالی کنیم.
پس از تایید تراکنش، اینتر را بزنید تا با بقیه کد ادامه دهید.
قرارداد ERC-20 را مستقر کنید
ما با موفقیت یک Provider ایجاد کردهایم، Key Pair خصوصی و عمومی را برای رابط قرارداد-حساب خود ایجاد کردهایم، قراردادهای حساب را مستقر کردهایم و حساب خود را در مراحل قبلی تأمین مالی کردهایم.
در این بخش، قرارداد ERC-20 را با استفاده از قطعه کد زیر مستقر خواهیم کرد.
//...
// Use your new account address
const account = new Account(
provider,
accountResponse.contract_address,
starkKeyPair
);
console.log("Reading ERC20 Contract...");
const compiledErc20 = json.parse(
fs.readFileSync("./contracts/ERC20.json").toString("ascii")
);
// Deploy an ERC20 contract and wait for it to be verified on StarkNet.
console.log(
`////////////////////////////////////////////////////////////////////////////////
Deployment Tx - ERC20 Contract to StarkNet...
////////////////////////////////////////////////////////////////////////////////`
);
const erc20Response = await provider.deployContract({
contract: compiledErc20,
});
// Wait for the deployment transaction to be accepted on StarkNet
console.log("Waiting for Tx to be Accepted on Starknet - ERC20 Deployment...");
await provider.waitForTransaction(erc20Response.transaction_hash);
// Get the erc20 contract address
const erc20Address = erc20Response.contract_address;
console.log("ERC20 Address: ", erc20Address);
// Create a new erc20 contract object
const erc20 = new Contract(compiledErc20.abi, erc20Address, provider);
erc20.connect(account);

Mint کردن توکنها
در مرحله بعد، ما توکنهای خود را با استفاده از تراکنش Mint ، Mint می کنیم، که آدرس اکانت گیرنده و تعداد توکنها را میگیرد.
اجازه دهید این عملکرد را با استفاده از قطعه کد زیر پیاده سازی کنیم.
//...
// Mint 500 tokens to account address
console.log(
`////////////////////////////////////////////////////////////////////////////////
Invoke Tx - Minting 500 tokens to ${account.address}...
////////////////////////////////////////////////////////////////////////////////`
);
const { transaction_hash: mintTxHash } = await erc20.mint(
account.address,
"500",
{
// transaction can be rejected if maxFee is lower than actual
// Error: REJECTED: FEE_TRANSFER_FAILURE
// Actual fee exceeded max fee.
maxFee: "999999995330000",
}
);
// Wait for the invoke transaction to be accepted on StarkNet
console.log(`Waiting for Tx to be Accepted on Starknet - Minting...`);
await provider.waitForTransaction(mintTxHash);
// Check balance - should be 500
console.log(`Calling StarkNet for account balance...`);
const balanceBeforeTransfer = await erc20.balance_of(account.address);
console.log(
`account Address ${account.address} has a balance of:`,
number.toBN(balanceBeforeTransfer.res, 16).toString()
);
انتقال توکن
اکنون که توکنهایی را ساختهایم، اجازه دهید برخی از آنها را برای تأیید وجود و قابل انتقال بودن انتقال دهیم.
//...
// Execute transfer of ERC20 tokens
console.log(`Invoke Tx - Transfer 20 tokens back to erc20 contract...`);
const { code, transaction_hash: transferTxHash } = await account.execute(
{
contractAddress: erc20Address,
entrypoint: "transfer",
calldata: [erc20Address, "20"],
},
undefined,
{
maxFee: "999999995330000",
}
);
// Wait for the invoke transaction to be accepted on StarkNet
console.log(
`////////////////////////////////////////////////////////////////////////////////
Waiting for Tx to be Accepted on Starknet - Transfer...
////////////////////////////////////////////////////////////////////////////////`
);
await provider.waitForTransaction(transferTxHash);
// Check balance after transfer - should be 480
console.log(`Calling StarkNet for account balance...`);
const balanceAfterTransfer = await erc20.balance_of(account.address);
console.log(
`account Address ${account.address} has a balance of:`,
number.toBN(balanceAfterTransfer.res, 16).toString()
);
در قسمت آخر کد موجودی حساب خود را بررسی میکنیم. همانطور که از خروجی میبینید، تراکنشهای ما موفقیت آمیز بود و ما موجودی توکنهای خود را نگه میداریم.

تمام! ما اولین توکنهای ERC-20 خود را در StarkNet با Infura Mint کردیم!
برای پیگیری، میتوانید کل کد این پروژه را در مخزن GitHub در این لینک بیابید.
نتیجهگیری
در این مقاله، با لایه دوم StarkNet ZK-rollup، نحوه دسترسی به آن با endpoint های Infura RPC، و نحوه ایجاد و استقرار توکنهای ERC-20 خود در شبکه آشنا شدید. Infura به پر کردن شکاف برای توسعه دهندگان اتریوم کمک میکند و با ارائه این endpoint ها، اکوسیستم Web3 قابل ترکیب را تسهیل میکند.
برای کسب اطلاعات بیشتر در مورد StarkNet و نحوه ساخت آن با استفاده از Infura، از منابع زیر دیدن کنید:
منابع
OpenZeppelin Account Cairo contract documentation
منبع ترجمه: hackernoon
Leave feedback about this