آشنایی با Web3 و Web3.js

Web3 چیست ؟

اینترنت وارد مرحله جدیدی شده است ، رفتن از Web1 به Web2 و به Web3 . میتوانیم بگوییم که وب 3 به عنوان سومین و آخرین مرحله اینترنت شناخته می شود . به بیان ساده ، سه مرحله اینترنت را می توان به شرح زیر خلاصه کرد:

Web1 - بی حرکت ( ایستا )
Web2 - پویا
Web3 - غیر متمرکز

مرحله اول اینترنت (Web1) ، عمدتا در مورد ارائه محتوا و اطلاعات آنلاین بود. به این ترتیب ، Web1 عمدتا ثابت بود و عملاً فقط به کاربران اجازه می داد اطلاعات را بخوانند. شروع Web2 ، که با ظهور رسانه های اجتماعی همراه بود تا حد زیادی بر قابلیت تعاملی بودن تمرکز داشت. Web2 از ماهیت ایستایی اینترنت جلوگیری کرد و باعث ایجاد یک وب پویا شد و به کاربران اجازه داد که نه تنها اطلاعات را بخوانند و از آن استفاده کنند بلکه خود آنها نیز بتوانند بنویسند و اطلاعاتی در اختیار دیگران قرار دهند در نتیجه شاهد یک فضای تعاملی در Web2 هستیم.

با این حال ، این Web مشارکتی مشکلاتی نیز دارد ، به عنوان مثال اطلاعات افراد در دست غول های بزرگی مانند گوگل ، آمازون ، فیسبوک و … می افتد . این غول های بزرگ ، اطلاعاتی که میلیون ها دلار ارزششان هست را به صورت رایگان از ما میگیرند و به راحتی به شرکت های دیگر آن را میفروشند.

Web3 قصد دارد این مشکل را با تبدیل اینترنت پویا به اینترنت غیر متمرکز حل کند. در Web3 ، داده ها دیگر متعلق به نهادهای متمرکز نیستند. یکی از ویژگیهای مهم عصر Web3 ظهور dApps یا برنامه های غیر متمرکز است که می تواند جایگزین برنامه های سنتی شود.

dApps یا Web3 apps چیست ؟

یکی از اجزای جدایی ناپذیر dApps ها یا Web3 apps ها به اصطلاح Smart Contract است. کسانی که در زمینه فناوری بلاک چین تجربه دارند احتمالاً با مفهوم اسمارت کانترکت آشنا هستند. اسمارت کانترکت ها کدهایی هستند که بر روی بلاک چین اجرا می شوند ( مثلا بلاکچین اتریوم ) و این کدها در واقع شامل توافق نامه ای هستند که به صورت خودکار اجرا میشوند .به این ترتیب ، این Contract ها می توانند هنگامی که مجموعه ای از شرایط مربوطه برآورده شود به طور خودکار یک معامله بین طرفهای مختلف را تأیید و انجام دهند .

این واقعیت که Web3 app و dApp ها از اسمارت کانترکت استفاده می کنند به این معنی است که منطق قراردادها می تواند رفتار برنامه های ما را تعیین کند. در عمل ، دیگر نیاز به یک شرکت یا فرد خاص برای ایفای نقش واسطه نیست . به منظور تعامل با اسمارت کانترکت های Web3 apps با استفاده از JavaScript ، نیاز هست که با Web3.js آشنا شوید . در این مقاله به طور کامل به Web3.js پرداخته میشود.

آشنایی با Web3.js

کتابخانه (library ) Web3.js ، کتابخانه اصلی جاوا اسکریپت برای توسعه Web3 apps است . از این کتابخانه برای تعامل با بلاک چین اتریوم استفاده میشود و به طور خاص ، می توانیم Web3.js را به عنوان یک API جاوا اسکریپت اتریوم در نظر بگیریم . کتابخانه Web3.js به شما امکان می دهد که به عنوان توسعه دهنده برنامه هایی را ایجاد کنید که بتوانند با بلاک چین اتریوم تعامل داشته باشند. دلیل مفید بودن کتابخانه ای مانند Web3.js این است که جاوا اسکریپت در حال حاضر تقریباً در همه مرورگرها پشتیبانی می شود.
به این ترتیب ، شما می توانید Web3.js را به عنوان واسط خود بین JavaScript و اسمارت کانترکت Web3 apps در نظر بگیرید

انجام دو عمل در توسعه برنامه های بلاک چین اتریوم مورد نیاز هست

1- توسعه اسمارت کانترکت : deploy کردن کدهایی که با زبان برنامه نویسی Solidity نوشته شده است بر روی بلاکچین

2- توسعه برنامه ها و وبسایت هایی که با بلاک چین در تعامل هستند ( نوشتن کدهایی که با کمک اسمارت کانترکت داده ها را از بلاکچین می خوانند و یا می نویسند ).

Web3.js شما را قادر می سازد تا عمل دوم را انجام دهید یعنی توسعه برنامه ها و وبسایت هایی که با بلاک چین اتریوم ارتباط برقرار می کنند. web3.js شامل مجموعه ای از کتابخانه ها است که به شما امکان این را می دهد اقداماتی مانند ارسال اتر از یک حساب به حساب دیگر ، خواندن و نوشتن داده ها از اسمارت کانترکت ، ایجاد اسمارت کانترکت و موارد دیگر را انجام دهید .

در تصویر زیر نشان داده شده است که چه طوری یک برنامه یا وبسایت با شبکه اتریوم ارتباط برقرار میکند

شبکه اتریوم از نود هایی تشکیل شده است که هر کدام شامل یک کپی از بلاک چین هستند. وقتی می خواهید یک تابع را در یک اسمارت کانترکت فراخوانی کنید ، باید از یک نود در خواست کنید . نود های اتریوم با زبانی به نام JSON-RPC صحبت می کنند که خیلی قابل خوانش توسط انسان ها نیست . Web3.js به ما اجازه می دهد تا به منظور خواندن و نوشتن داده ها در شبکه ، درخواست های خود را به یک نود اتریوم با JSON RPC ارسال کنیم.

یک Query برای اینکه به نود بگویید که تمایل دارید یک تابع در یک کانترکت را فرا بخوانید چیزی شبیه زیر خواهد بود

// Yeah... Good luck writing all your function calls this way!
{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0xb60e8dd61c5d32be8058bb8eb970870f07233155","to":"0xd46e8dd67c5d32be8058bb8eb970870f07244567","gas":"0x76c0","gasPrice":"0x9184e72a000","value":"0x9184e72a","data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"}],"id":1}

خوشبختانه Web3.js این Query های زشت و زننده را پنهان می کند ، بنابراین شما فقط نیاز هست که با یک رابط جاوا اسکریپت که کاملا راحت ، ساده و خوانا هست تعامل داشته باشید. Web3.js به ما اجازه می دهد تا به منظور خواندن و نوشتن داده ها در شبکه ، از یک نود اتریوم درخواست کنیم.

با کمک Web3.js کدهای مثال بالا ظاهری شبیه زیر خواهد داشت


CryptoZombies.methods.createRandomZombie("Vitalik Nakamoto 🤔")
  .send({ from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155", gas: "3000000" })

Web3 Provider

به یاد داشته باشید ، اتریوم از node هایی تشکیل شده است که همه ی آنها یک نسخه از داده های مشابه را به اشتراک می گذارند . تنطیم یک Web3 Provider در Web3.js باعث بیان این موضوع میشود که ما باید با کدام نود برای رسیدگی به خوانده ها و نوشته ها تعامل کنیم .

Infura
شما می توانید نود شخصی اتریوم خود را به عنوان Provider ست کنید اما از آنجا که ایجاد نود شخصی کار دشواری است پیشنهاد میشود از یک سرویس شخص ثالث مانند Infura استفاده کنید .

Infura سرویسی است که یک نود از راه دور اتریوم ( Remote Node ) را به صورت رایگان ارائه می دهد. تنها کاری که باید انجام دهید این است که در وبسایت Infura ثبت نام کنید و یک کلید API و RPC URL برای شبکه ای که می خواهید به آن متصل شوید ، بدست آورید. (… و Ropsten , Mainnet ) .
استفاده از Infura این امکان را به شما میدهد که به صورت مطمن بتوانید با بلاکچین اتریوم بدون نیاز به ایجاد نود شخصی تعامل داشته باشید

پس از ثبت نام ، آدرس Infura RPC شما باید به این شکل باشد:

https://mainnet.infura.io/YOUR_INFURA_API_KEY

از آنجا که DApp ما توسط بسیاری از کاربران مورد استفاده قرار می گیرد و ما قصد داریم که کاربران علاوه بر خواندن داده ها از بلاکچین بتوانند داده ثبت کنند و تراکنش انجام دهند ، ما به راهی نیاز داریم که این کاربران بتوانند تراکنش ها را با کلید خصوصی خود امضا کنند.
در شبکه اتریوم برای انجام هر تراکنش نیاز به یک امضای دیجیتالی است و از Private Key و Public Key برای امضای تراکنش ها استفاده میشود.
سوالی که مطرح میشود این است که Private Key کاربران کجا نگهداری میشود ؟ در این قسمت قصد دارم شما رو با کیف پول متامسک آشنا کنم

متامسک

متامسک یک افزودنه بر روی مرورگرهایی مانند کروم و فایرفاکس است که به کاربران امکان می دهد اکانت های اتریوم و کلیدهای خصوصی خود را به صورت ایمن مدیریت کرده و از این اکانت ها برای تعامل با وب سایت هایی که از Web3.js پشتیبانی میکنند استفاده کنند . بعد از نصب کیف پول متامسک ، Web3.js بر روی مرورگر شما فعال میشود و میتوانید از هر وبسایتی که با شبکه اتریوم در تعامل است استفاده کنید .

به عنوان یک توسعه دهنده ، اگر می خواهید کاربران از طریق یک وب سایت در مرورگر خود با DApp شما ارتباط برقرار کنند نیاز هست که وبسایت شما با متامسک سازگار باشد.

متامسک از سرورهای Infura به عنوان Web3 Provider استفاده می کند اما به کاربر این امکان را می دهد که Web3 Provider خود را انتخاب کند. بنابراین با استفاده از Metamask Web3 Provider به کاربر حق انتخاب می دهید.

در قسمت پایین چند کد الگو توسط متامسک ارایه شده ، برای تشخیص اینکه آیا کاربر متامسک را نصب کرده است یا خیر ، و اگر نصب نکرده به او گفته میشود که متامسک را نصب کند


window.addEventListener('load', function() {
// Checking if Web3 has been injected by the browser (Mist/MetaMask)
  if (typeof web3 !== 'undefined') {
    // Use Mist/MetaMask's provider
    web3js = new Web3(web3.currentProvider);
  } else {
    // Handle the case where the user doesn't have web3. Probably 
    // show them a message telling them to install Metamask in 
    // order to use our app.
    // For example
    // web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
  }
  // Now you can start your app & access web3js freely:
  startApp()

})

می توانید از کدهای بالا در همه ی برنامه هایی که ایجاد می کنید استفاده کنید تا کاربران را ملزم به استفاده از متامسک برای استفاده از DApp خود کنید.

شروع توسعه با Web3.js

پیش نیازها :

Node Package Manager (NPM)
اولین پیش نیاز مورد نیاز Node Package Manager یا NPM است که همراه با Node.js هست . با رفتن به Terminal و تایپ کردن عبارت زیر می توانید ببینید آیا قبلاً node را نصب کرده اید یا نه .

node -v $

Web3.js Library
می توانید کتابخانه Web3.js را با کمک NPM در Terminalخود با عبارت زیر نصب کنید

$ npm install web3 

اکنون که همه چی آماده است می توانید توسعه را با Web3.js شروع کنید! ابتدا باید Node Console را در Terminal خود به شکل زیر روشن کنید:

$ node 

حال نیاز است که web3.js را در اصلاح Require کنید و متغیر Web3 را با آن مقدار دهی کنید

const Web3 = require('web3')

اکنون شما متغیری دارید که در آن می توانید یک اتصال جدید Web3 ایجاد کنید! قبل از ایجاد اتصال Web3 ، ابتدا باید URL Infura را به یک متغیر اختصاص دهیم:

const rpcURL = "https://mainnet.infura.io/YOUR_INFURA_API_KEY"

مطمئن شوید که YOUR_INFURA_API_KEY را با کلید Infura API واقعی خود که قبلاً به دست آورده اید جایگزین کرده اید. اکنون می توانید یک اتصال Web3 را به صورت زیر ایجاد کنید:

const web3 = new Web3(rpcURL)

اکنون شما یک اتصال Web3 دارید که به شما امکان می دهد با شبکه اصلی اتریوم صحبت کنید! بیایید از این اتصال برای بررسی بالانس اکانت روبه رو استفاده کنیم:

0x90e63c3d53E0Ea496845b7a03ec7548B70014A91

ما می توانیم میزان اتر این حساب را به صورت زیر مشاهده کنیم

()web3.eth.getBalance

ابتدا یک متغیر را با ادرس خود مقدار دهی میکنیم :

const account = "0x90e63c3d53E0Ea496845b7a03ec7548B70014A91"

حال به صورت زیر میتوانیم بالانس اکانت را برسی کنیم :


web3.eth.getBalance(address, (err, wei) =>{
  balance = web3.utils.fromWei(wei, 'ether')
})

بگذارید این کد را کمی بیشتر توضیح دهم

اول از همه با فراخوانی ()web3.eth.getBalance موجودی را برسی میکنیم . در این مقاله با err argument کاری نداریم اما نیاز هست در ارتباط با wei argument که موجودی اکانت را نشان میدهد کمی صحبت کنیم .

Wei : کوچکترین واحد اتر است . در یک اتر ، 10^18 wei وجود دارد.
تعداد صفر زیادی هست که باید شمارش کرد اما خوشبختانه Web3.js یک ابزار تبدیل دارد که این کار را برای ما انجام می دهد . با استفاده از کد زیر web3.js مقدار wei را به اتر تبدیل میکند و در نتیجه به راحتی میتوانیم موجودی اکانت را متوجه شویم

web3.utils.fromWei(wei, 'ether')

اکنون مشاهده کرده اید که کتابخانه Web3.js چیست و چگونه می توانید از آن برای بررسی موجودی حساب اتریوم خود استفاده کنید. در این قسمت خلاصه ای از کدهایی که استفاده کردیم قرار داده شده است


const Web3 = require('web3')
const rpcURL = '' // Your RPC URL goes here
const web3 = new Web3(rpcURL)
const address = '' // Your account address goes here
web3.eth.getBalance(address, (err, wei) => {
  balance = web3.utils.fromWei(wei, 'ether')
})

آموزش خواندن داده های اسمارت کانترکت با کمک Web3.js

برای خواندن داده های اسمارت کانترکت با Web3.js ، به دو چیز نیاز داریم:

1- نمایشی به صورت جاوا اسکریپت از اسمارت کانترکتی که می خواهیم با آن تعامل داشته باشیم
2- روشی برای فراخوانی توابع اسمارت کانترکت هنگام خواندن داده ها

ما می توانیم یک نمایش جاوا اسکریپت از یک اسمارت کانترکت را با تابع ()web3.eth.Contract دریافت کنیم.

این تابع انتظار میرود که دو argument داشته باشد : یکی برای ABI اسمارت کانترکت و دیگری برای آدرس اسمارت کانترکت

آدرس کانترکت :

پس از اتمام نوشتن اسمارت کانترکت خود ، آن را Compile کرده و سپس میتوانید بر روی اتریوم deploy کنید . پس از deploy کانترکت یک آدرس ثابت بر روی شبکه اتریوم دریافت می کند و در آن برای همیشه زندگی می کند.
به عنوان مثال آدرس کانترکت CryptoKitties در اتریوم 0x06012c8cf97bead5deae237070f9587f8e7a266d است. پس از deploy کانترکت باید این آدرس را کپی کنید تا بتوانید با اسمارت کانترکت خود صحبت کنید.

ABI کانترکت :

مورد دیگری که Web3.js نیاز دارد تا بتواند با کانترکت شما صحبت کند ABI آن است.
ABI مخفف Application Binary Interface است و در واقع نمایشی از متدهای کانترکت شما در فرمت JSON است. هنگامی که قرارداد خود را برای deploy شدن در اتریوم Compile می کنید ، کامپایلر Solidity ABI را به شما می دهد ، بنابراین باید این ABI را به همراه ادرس کانترکت ذخیره کنید .

مثالی از یک ABI :

const abi = [{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_releaseTime","type":"uint256"}],"name":"mintTimelocked","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

مثال بالا ABI توکن OmiseGo که با استاندارد ERC-20 پیاده شده را نشان میدهد . کاملا مشخص است که شاهد یک آرایه خیلی طولانی و عجیب و غریب هستیم. :grin:

ما درحال حاضر ABI را داریم و اکنون نوبت ادرس کانترکت است . از وبسایت https://etherscan.io ادرس کانترکت توکن OmiseGo را بدست می آوریم و آن را در یک متغیر ذخیره میکنیم

const address = "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07"

اکنون که هر دوی این مقادیر را داریم ، می توانیم یک نمایش کامل جاوا اسکریپت از اسمارت کانترکت توکن OMG به صورت زیر ایجاد کنیم:

const contract = new web3.eth.Contract(abi, address)

اما حالا نیاز هست که یاد بگیریم که چه گونه میتوانیم داده های اسمارت کانترکت را با فراخوانی توابع آن بخوانیم.
به لحاظ تئوری ما میتوانیم هر تابعی را که در کانترکت بیان شده باشد فراخوانی کنیم . اما از کجا بدانیم که در یک کانترکت چه توابعی وجود دارد ؟

برای فهم این موضوع میتوانیم عبارت contract.methods را در console وارد کنیم و ببینیم که چه چیزی برای ما Return میشود . از آنجایی که اسمارت کانترکت توکن ما بر پایه ERC20 است میدانیم که شامل توابع زیر است :
()totalSupply() , name() , symbol() , balanceOf

ما می توانیم هر یک از این مقادیر را جداگانه برسی کنیم :
اول با total supply توکن های OMG شروع میکنیم :

contract.methods.totalSupply().call((err, result) => { console.log(result) })
140245398<//

دوم ، نام توکن OMG:

contract.methods.name().call((err, result) => { console.log(result) })
OMG Token<//

سوم ، نماد توکن OMG:

contract.methods.symbol().call((err, result) => { console.log(result) })
OMG <//

در آخر ، ما می توانیم موجودی یک حساب معین را بررسی کنیم. به دنبال یک آدرس که OMG زیادی داشته باشد گشتم و به این ادرس رسیدم:

0xd26114cd6EE289AccF82350c8d8487fedB8A0C07

ما می توانیم موجودی این حساب را به صورت زیر بررسی کنیم:

contract.methods.balanceOf('0xd26114cd6EE289AccF82350c8d8487fedB8A0C07').call((err, result) => { console.log(result) })
A very large number <//

به آسانی می توان داده های اسمارت کانترکت را به کمک Web3.js خواند . در اینجا خلاصه ای از همه ی کدها آمده است :


const Web3 = require('web3')
const rpcURL = '' // Your RCP URL goes here
const web3 = new Web3(rpcURL)

const abi = [{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_releaseTime","type":"uint256"}],"name":"mintTimelocked","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]
const address = '0xd26114cd6EE289AccF82350c8d8487fedB8A0C07'

const contract = new web3.eth.Contract(abi, address)

contract.methods.totalSupply().call((err, result) => { console.log(result) })
contract.methods.name().call((err, result) => { console.log(result) })
contract.methods.symbol().call((err, result) => { console.log(result) })
contract.methods.balanceOf('0xd26114cd6EE289AccF82350c8d8487fedB8A0C07').call((err, result) => { console.log(result) })

در این مقاله سعی کردم که شما رو با Web3.js آشنا کنم و تا حدی نحوه استفاده از اون رو یاد بدم . کارهای خیلی بیشتری میشه با Web3.js انجام داد که سعی میکنم در مقالات بعدی به طور کامل بیان کنم .

امیدوارم این مقاله براتون مفید بوده باشه :star_struck:

لینک منابع

13 پسندیده

مرررسی عالی بوود :+1:t2::+1:t2::v:t2::v:t2:
جامع و مفییید :muscle:t2::gem:

1 پسندیده

سپاس از لطفتون
خوشحالم که مفید بوده

خیلی عالی بود واقعا زحمت کشیدید. من که به شخصه خیلی استفاده کردم.
فقط یک خواهش از حضورتون دارم. من مشابه همین مراحل رو در یک دوره کورس آنلاین دیده بودم ولی متاسفانه داکیومنت ش رو دیگه در دسترس ندارم خیلی ممنون میشم اگه لطف کنید و لینک منابع و مراجع مورد استفاده رو هم برامون بگذارید . با تشکر فراوان .

1 پسندیده

مرسی از لطفتون:pray::pray::pray: متاسفانه سایت اجازه نداد که تمام لینک ها رو بزارم

1 پسندیده

تشکر از شما . بله متوجه هستم . من دنبال همین لینک دومی بود که زحمتش رو کشیدید .سپاسگزارم .

1 پسندیده

بسیار عالی بود این موضوع

1 پسندیده

سپاس از لطفتون . خوشحالم مفید بوده:pray::pray::pray:

ممنون بابت مقاله خوبتون.
سوالم اینه بدون داشتن ای‌بی‌آی هم میشه توابع یه کانترکت رو صدا زد؟
و در مورد برخی قراردادها که بایت‌کد هستند و ای‌بی‌آی اونها مشخص نیست چطور میشه تابعی رو صدا زد؟