با سلام خدمت جامعه توسعه دهندگان بلاکچین و قرار داد های هوشمند
من 0Xlive هستم و توی این قسمت میخوایم مثل ۲ قسمت قبلی با یک Node RPC ارتباط برقرار کنیم اما اینبار با زبان جاوا اسکریپت
web3.js یک پیاده سازی ( پیاده سازی رسمی )از web3 هستش که مجموعه ای از کتابخونه های مختلف نرم افزاری مناسب برای شبکه و رمزنگاری هستش که به ما در توسعه dapp ها کمک میکنه
مزیت جاوا اسکریپت این هست که میشه محیط توسعه اون رو سریع پیکربندی کرد و از اون جالب تر زبانی هست که میشه هم برای backend و هم برای frontend کد بزنید و حتی زبان solidity از لحاظ syntax شبیه به JS هست
پس اگه در حوزه برنامه نویسی قرار داد های هوشمند و اپلیکیشن های غیرمتمرکز کار میکنید زبان js یک زبان خیلی خیلی خوبی هست که میتونید بصورت فول استک همه چیز رو جلو ببرید ( برای نوشتن فرانت اند , بک اند , دسکتاپ , موبایل )
نصب web3.js
در مرحله اول اقدام به نصب web3.js میکنیم. برای نصب محلی از npm استفاده میکنیم:
npm install web3
برای نصب با پکیج منیجر yarn هم داریم:
yarn add web3
و اما برای اضافه کردن web3.js به شکل یک فایل ارشیو شده به فایل html اینطوری عمل میکنیم :
<script src="https://cdnjs.cloudflare.com/ajax/libs/web3/1.7.3/web3.min.js"></script>
من در اینجا از روش سوم استفاده میکنم
شروع یک پروژه ساده
یک فایل html ساده میسازیم حاوی مقدار زیر:
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Hello World!</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/web3/1.7.3/web3.min.js"></script>
</head>
<body>
</body>
</html>
در اینجا من یک پرونده html تعریف کردم و pure web3.js رو اضافه کردم
قصد دارم مثل ۲ تاپیک قبلی یک کیف پول بسازم , یک تراکنش رو امضا کنم و بالانس کیف پولم رو بررسی کنم
ساخت کیف پول
قبل از همه چیز اول web3 رو وارد پروژه خودم میکنم و به شبکه متصل میشم:
const w3 = new Web3("https://testnet-rpc.coinex.net");
برای ساختن یک کیف پول با این طریق عمل میکنیم:
const account = w3.eth.accounts.create();
در بالا من یک کیف پول ساختم و اطلاعات اون رو توی account ریختم که یک object هست. برای بررسی محتوای متغیر account به این شکل عمل میکنیم :
consol.log(account)
که اگر همه چیز درست باشه چنین خروجی ای رو چاپ میکنه:
{ address: "0xCdC5E17e4C7046aB91522DD68d4e52184C5db12B", privateKey: "0x27d649fe9ba4b980b93c6a7f80912300b4f4535e8bd3f6dbafe982722eb44223", signTransaction: signTransaction(r, n), sign: sign(r), encrypt: encrypt(r, n) }
حالا میریم برای ذخیره کردن این دو در local storage ( در واقع قصد داریم یک web wallet بسازیم ) چرا که با هر بار رفرش کردن یک جفت کلید خصوصی و ادرس جدید برامون میسازه
localStorage.setItem("address", account.address);
localStorage.setItem("privateKey", account.privateKey);
خیلی خب حالا میریم که ادرس کیف پولمون رو توی صفحه html چاپ کنیم. ابتدا یک تگ میسازیم و با استفاده از js و dom ادرس کیف پول رو روی صفحه نمایش میدم:
//html
<p>Your Address is:</p>
<p id="address"></p>
//js
document.getElementById("address").innerHTML = localStorage.getItem("address");
در کد بالا من دارم مقداری که در local storage مرورگر ذخیره کردم رو میخونم و اون رو در تگ html با نام address چاپ میکنم
حالا بریم یک تراکنش بسازیم
ساخت و امضا کردن یک تراکنش
درباره خصیصه های یک تراکنش اتریومی در تاپیک های قبلی صحبت کردیم حالا بیاید یک تراکنش با همون مشخصات بسازیم:
const transaction = {
'to': 'recipient address', // recipient's address
'value': 1,
'gas': 30000,
'maxPriorityFeePerGas': 1000000108,
'nonce': nonce,
// optional data field to send message or execute smart contract
};
برای گرفتن nounce اینطور عمل میکنیم:
const nonce = await w3.eth.getTransactionCount(localStorage.getItem("address"), 'latest');
حالا تراکنش رو امضا میکنیم:
const signedTx = await w3.eth.accounts.signTransaction(transaction, localStorage.setItem("privateKey", account.privateKey));
w3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) {
if (!error) {
console.log("TX Hash is ", hash);
} else {
console.log("a mistake was made", error)
}
});
تبریک میگم ما موفق شدیم یک تراکنش رو امضا کنیم و به شبکه از طریق نود broad cast کنیم
حالا بریم بررسی کنیم ببینیم موجودی کیف پول ما بعد از این تراکنش چقدر هست؟
بررسی balance
گرفتن بالانس کیف پول رو با استفاده از getBalance انجام میدیم:
w3.eth.getBalance(localStorage.getItem("address"), function(err, result) {
if (err) {
console.log(err)
} else {
console.log(web3.utils.fromWei(result, "ether") + " CSC")
}
})
در اینجا ما ادرس کیف پولمون رو خوندیم و به getBalance دادیم و مقدار موجودی اون رو گرفتیم. از اونجایی که مقداری که برمیگردونه wei هست به ether تبدیل میکنیم . نتیجه رو چاپ میکنیم
حالا فکر میکنید میشه با این ایده چه کار هایی انجام داد؟افرین یک کیف پول غیر حضانتی وب اما دیگه چی؟ میتونیم اطلاعات رو با AES256 رمزکنیم و اون رو در یک فایل json روی سیستم بنویسیم و بخونیم و یک افزونه مثل متامسک بنویسیم
خودتون میتونید به این ایده شاخ و برگ بدید و ابزار خودتون رو بنویسید