3 مهر 1402
تهران، خیابان آزادی، تقاطع قریب
بلاک چین

راهنمای Infura و StarkNet ZK-Rollup برای توسعه‌دهندگان اتریوم

راهنمای Infura و StarkNet ZK-Rollup برای توسعهدهندگان اتریوم

در طول سال گذشته، شاهد افزایش راه‌حل‌های مقیاس‌پذیری لایه دو (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 شوید تا  برای یک اکانت جدید ثبت نام کنید یا اگر از قبل در آن اکانت دارید، وارد آن شوید.

برای دسترسی به شبکه اتریوم StarkNet یک اکانت Infura بسازید
یک اکانت در Infura بسازید

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

یک Key جدید ایجاد کنید - Infura
یک Key جدید ایجاد کنید - Infura

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

فیلدهای لازم را برای ایجاد یک Key جدید پر کنید - Infura
فیلدهای لازم را برای ایجاد یک Key جدید پر کنید - Infura

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

Manage keys - Infura
Manage keys - Infura
شبکه Stacknet Goerli را انتخاب کنید

ساخت یک پروژه در 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/<API-KEY>
				
			

دانلود Account Contract ABI

برای دانلود Contract ABI برای ERC-20 و OZAccount به فولدر Contract در این مخزن بروید.

یک فولدر جدید به نام Contract ایجاد کنید. سپس، دو فایل جدید در داخل پوشه ایجاد کنید، ERC20.json و OZAccount.json.

سپس، Contract ABI را که کپی کرده بودیم، در آن فایل‌ها پیست می‌کنیم. ساختار فولدر پروژه ما باید شبیه به آنچه در زیر داریم به نظر برسد.

ساختار پروژه StarkNet

نصب 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 عمومی و خصوصی تولید کنید.

در صورتی که فکر می‌کنید ممکن است در آینده و برای برای سایر رویه‌ها نیاز به استفاده مجدد از آن‌ها دارید، هر دو 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!");

				
			
یک حساب کاربری جدید در StarkNet مستقر کنید.
یک حساب کاربری جدید در StarkNet مستقر کنید.

ممکن است تکمیل این عملیات چند دقیقه طول بکشد، اما همیشه می‌توانیم پیشرفت آن را از طریق 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، باید حساب خود را کمی شارژ کنیم (درست مانند اتریوم). با استفاده از 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);

				
			
قرارداد ERC-20 را مستقر کنید
قرارداد ERC-20 را با StarkNet مستقر کنید

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 ما
استقرار موفقیت آمیز توکن های ERC-20 ما

تمام! ما اولین توکن‌های ERC-20 خود را در StarkNet با Infura Mint کردیم!

برای پیگیری، می‌توانید کل کد این پروژه را در مخزن GitHub در این لینک بیابید.

نتیجه‌گیری

در این مقاله، با لایه دوم StarkNet ZK-rollup، نحوه دسترسی به آن با endpoint های Infura RPC، و نحوه ایجاد و استقرار توکن‌های ERC-20 خود در شبکه آشنا شدید. Infura به پر کردن شکاف برای توسعه دهندگان اتریوم کمک می‌کند و با ارائه این endpoint ها، اکوسیستم Web3 قابل ترکیب را تسهیل می‌کند.

برای کسب اطلاعات بیشتر در مورد StarkNet و نحوه ساخت آن با استفاده از Infura، از منابع زیر دیدن کنید:

منابع

Infura documentation

StarkNet documentation

StarkNet.js documentation

OpenZeppelin Account Cairo contract documentation

منبع ترجمه: hackernoon

Leave feedback about this

  • کیفیت
  • قیمت
  • خدمات

PROS

+
Add Field

CONS

+
Add Field
Choose Image
Choose Video
X