دیپلوی اسمارت کانترکت نیاز به سیستم خاصی نداره و فقط محیط کدنویسی لینوکس میخواد
آموزش راهاندازی محیط کدنویسی رو از این توییت ببینید
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
rustup install stable
rustup update stable
rustup default stable
curl --proto '=https' --tlsv1.2 -sSf https://fuellabs.github.io/fuelup/fuelup-init.sh | sh
Press Y
export PATH="$HOME/.fuelup/bin:$PATH"
source /root/.bashrc
مهم: هر زمان دستوراتی که با عبارات زیر شروع میشن کار نکردند از دستور بالا استفاده کنید مشکل حل میشه
Fuelup
/ forc
fuelup toolchain install latest
fuelup self update
fuelup toolchain install beta-2
fuelup default beta-2
fuelup --version
fuelup default beta-2
مهم: هر زمان از ترمینال خارج شدید و بعدا دستوراتی که با عبارات زیر شروع میشن کار نکردند، دستور بالا رو دوباره بزنید
fuelup
or forc
پوشه پروژه رو بسازید و واردش شید
mkdir fuel-project
cd fuel-project
forc new counter-contract
nano counter-contract/src/main.sw
با دستور بالا منوی ادیت فایل کانفیگ کانترکت رو باز میکنید که هرچی توش هست رو پاک کنید و کدهای زیر رو توش کپی کنید
contract;
storage {
counter: u64 = 0,
}
abi Counter {
#[storage(read, write)]
fn increment();
#[storage(read)]
fn count() -> u64;
}
impl Counter for Contract {
#[storage(read)]
fn count() -> u64 {
storage.counter
}
#[storage(read, write)]
fn increment() {
storage.counter = storage.counter + 1;
}
}
بعد از کپی
Press Ctrl + X
Press Y
Press Enter
مطمئن باشید داخل دیرکتوری پروژهای که ساختید باشید یعنی
fuel-project
cd counter-contract
forc build
یکی از 2 دستور زیر رو انتخاب کنید
ساخت ولت جدید:
forc-wallet init
Set Password
Save 12 Words Recover Phrase
ریکاوری ولت قدیمی:
forc-wallet import
با زدن دستور بالا ازتون کلمات بازیابی ولتتون رو میخواد
Enter 12 Words Recovery Phrase
Set Password
forc-wallet new
Enter Your Password
با این دستور آدرس ولتتون رو با فرمت زیر دریافت میکنید
fuel1uuwtsqfmdea06ya0djj2ezkcjfc2hcr7nk9um3xhhv2aqf7ayarqh7tr64
از این لینک توکن تستی دریافت کنید
forc deploy --url node-beta-2.fuel.network/graphql --gas-price 1
Enter Your Wallet Address
Save Contract id
آدرس کانترکت رو برای مرحله تراکنش روی کانترکت نیاز داریم سیو داشته باشید
Save Transcation id
هش تراکنش رو برای مرحله بعد نیاز دارید
یه ترمینال جدید باز کنید تا با دستور بعدی، تراکنش دیپلوی رو امضا یا ساین کنیم
در ترمینال جدید، دستورات بعدی ممکنه کار نکنن یا خطا بدن که پیدا نمیشه، که طبق نکته مرحله 2.1 عمل کنید یعنی دستور زیر رو قبلش در ترمینال جدید بزنید
source /root/.bashrc
forc-wallet sign Transaction_id 0
هش تراکنش مرحله 5.1 رو با عبارت زیر در دستور بالا جاگذاری کنید
Transaction_id
Enter Password
Copy Signature
یه کد امضا بهتون میده که باید کپی کنید و برگردید به ترمینال اصلی و وارد کنید
بعد از اینکه کد امضا رو وارد کردید کانترکت شما روی شبکه دیپلوی میشه
برای سرچ تراکنشتون میتونید به هش تراکنش مرحله 5.1 عبارت زیر رو اضافه کنید و در اکسپلورر سرچش کنید
0x
برای مثالTransaction ID: 0x276f1bcb12b343d4bdb934aae8f017aef86be7e48fdcd3efb34d1d57b9256d45
ای
در این قسمت یک سایت یا دپ برای کانترکتمون میسازیم که بتونیم روی کانترکت تراکنش ثبت کنیم
ورژن جاوا اسکریپت رو چک کنید که ببینید روی سیستم دارید
node --version
در صورت نیاز به نصب این پارت رو پیش برید
Delete old files
sudo apt-get remove nodejs
Press Y
sudo apt-get purge nodejs
sudo apt-get autoremove
Press Y
Install Nodejs 18
sudo apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
Check Nodejs Version
node --version
اطمینان حاصل کنید داخل پوشه فیول-پراژکت هستید
cd $home && cd fuel-project
npx create-react-app frontend --template typescript
پس از نصب، شما یک پوشه کلی پروژه به نام فیول-پراجکت دارید که داخلش پوشه کانترکت و فرانتند وجود داره برای چک کردنش دستور زیر:
ls
cd frontend
npm install fuels@0.24.2 --save
npm install fuelchain@0.24.2 typechain-target-fuels@0.24.2 --save-dev
npx fuelchain --target=fuels --out-dir=./src/contracts ../counter-contract/out/debug/*-abi.json
چون شبکه در فاز اولیه است هنوز قابلیت اتصال ولت فراهم نشده؛ برای همین باید ولت دومی رو روی لینوکس بسازیم و از طریق اون با کانترکت تراکنش داشته باشیم
اطمینان حاصل کنید داخل پوشه فرانتند باشید
nano createWallet.js
با دستور بالا یک فایل ساخته و منوی ادیتش باز میشه که کدهای زیر رو داخلش کپی کنید
const { Wallet } = require("fuels");
const wallet = Wallet.generate();
console.log("address", wallet.address.toString());
console.log("private key", wallet.privateKey);
بعد از کپی
Press Ctrl + X
Press Y
Press Enter
node createWallet.js
Save Address
& Private key
از این لینک فاست بگیرید یا مقداری از ولت اصلی ارسال کنید
اطمینان حاصل کنید داخل پوشه فرانتند باشید
nano src/App.tsx
با دستور بالا منوی ادیت فایل باز میشه که کدهای توش رو کامل دیلیت کنید و کدهای زیر رو با جاگذاری آدرس های جلوی عبارات زیر توش وارد کنید
CONTRACT_ID = آدرس کانترکت
WALLET_SECRET = کلید خصوصی ولت دوم
برای جاگذاری میتونید کدهارو داخل نوت پد کپی و اصلاح کنید
import React, { useEffect, useState } from "react";
import { Wallet } from "fuels";
import "./App.css";
// Import the contract factory -- you can find the name in index.ts.
// You can also do command + space and the compiler will suggest the correct name.
import { CounterContractAbi__factory } from "./contracts";
// The address of the contract deployed the Fuel testnet
const CONTRACT_ID =
"0x3edb96c23766b8504caaff042994efa18460e7ba27f60191394a6bcf5be8d7d8";
//the private key from createWallet.js
const WALLET_SECRET =
"0xc4a69e0cc4ce1e0b45d25899b3cedced332d193c8a5c706187ffd50aa7591ce6";
// Create a Wallet from given secretKey in this case
// The one we configured at the chainConfig.json
const wallet = Wallet.fromPrivateKey(
WALLET_SECRET,
"https://node-beta-2.fuel.network/graphql"
);
// Connects out Contract instance to the deployed contract
// address using the given wallet.
const contract = CounterContractAbi__factory.connect(CONTRACT_ID, wallet);
function App() {
const [counter, setCounter] = useState(0);
const [loading, setLoading] = useState(false);
useEffect(() => {
async function main() {
// Executes the counter function to query the current contract state
// the `.get()` is read-only, because of this it don't expand coins.
const { value } = await contract.functions.count().get();
setCounter(Number(value));
}
main();
}, []);
async function increment() {
// a loading state
setLoading(true);
// Creates a transactions to call the increment function
// because it creates a TX and updates the contract state this requires the wallet to have enough coins to cover the costs and also to sign the Transaction
try {
await contract.functions.increment().txParams({ gasPrice: 1 }).call();
const { value } = await contract.functions.count().get();
setCounter(Number(value));
} finally {
setLoading(false);
}
}
return (
<div className="App">
<header className="App-header">
<p>Counter: {counter}</p>
<button disabled={loading} onClick={increment}>
{loading ? "Incrementing..." : "Increment"}
</button>
</header>
</div>
);
}
export default App;
اطمینان حاصل کنید داخل پوشه فرانتند باشید
npm run build
npm start
اگر پورتتون تداخل داشت ازتون میخواد که روی یه پورت دیگه بالا بیارید که تایید کنید که با دستور زیر پورت جدید که خودش میگه مثلا 3001 رو باز کنید:
ufw allow 3001/tcp
برای دیدن سایتتون طبق عبارات زیر آدرس سایت رو توی بروزر سرچ کنید
Local System: http://localhost:3001
اگر روی سیستم خانگی کانفیگ کردید
VPS: http://ip:3001
اگر روی سرور مجازی کانفیگ کردید آی پیشو با آی پی عبارت بالا عوض ک
برای تراکنش نیاز به ولت ندارید و فقط:
Click Increment
تبریک میگم شما اپلیکیشن غیرمتمرکز خودتون رو روی شبکه فیول بالا آوردید :))
با آرزوی سلامتی و موفقیت برای همه شما عزیزان