اگر میخواهید منابع، استراتژیها و مطالب جدیدی در مورد زبان برنامه نویسی سالیدیتی به دست بیارید، می تونید مقاله آموزش سالیدیتی رو در وب سایت وایت وال مطالعه کنید.
قرارداد توکن موضوعی پر طرفدار است اما فروش کلی توکن یا همان عرضهی اولیهی توکن (ICO) پرطرفدارتر است. اخیراً در دنیای کریپتو چیزهای زیادی در مورد ICOها شنیده می شود و اگر شما قصد دارید خودتان عرضه ایی را کدنویسی کنید، جای درستی آمده اید.
در این مقاله من قصد دارم مراحل ایجاد توکن خود و قرارداد ICO آن را توضیح دهم. ما حتما از ابزارهای هوشمندانه استفاده خواهیم کرد.
برای این آموزش من از ترافل و سالیدیتی زپلین استفاده می کنم. ترافل چارچوب عملی برای ایجاد قراردادهای هوشمند و برنامه های کاربردی غیرمتمرکز است. سالیدیتی زپلین کتابخانه ای است که حاوی قراردادهای هوشمند گسترده و آزمایش شده است که به بهترین شیوه های امنیتی پایبند است.
در دنیای قراردادهای هوشمند که یک ایراد کوچک می تواند برای شما هزینه بردار باشد، بهتر است وقتی راه حل قابل اعتمادی وجود دارد، دوباره کاری نکنید.
در اینجا ما از ganache-cli به عنوان گره بلاک چین استفاده می کنیم چون سریع و سازگار با توسعه دهندگان است.
نکته جانبی: اگر میخواهید قرارداد را در شبکه آزمایشی اتریوم یا شبکه اصلی ایجاد کنید، باید از چیزی مثل Geth یا Parity استفاده کنید.
ادامه: اول npm و node را نصب کنید، دستورات را تایپ کنید:
$ npm install -g ganache-cli
$ npm install -g truffle
$ mkdir my-ico && cd my-ico
$ truffle init
$ npm install openzeppelin-solidity@2.0.0
جادوهای زیادی با دستور بالا اتفاق افتاد. اما در اصل این راه اندازی است که شما با ایجاد و استقرار قرارداد هوشمند ICO راه اندازی می کنید.
با این کار پوشه openzeppelin-solidity را به node_modules اضافه می کنید و در آن همه قالب های قرارداد هوشمند را در کتابخانه OpenZeppelin Solidity پیدا خواهید کرد.
قدم اول ایجاد قرارداد توکن است.
touch contracts/GustavoCoin.sol
و برای کد
pragma solidity 0.4.24;
import 'openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol';
contract GustavoCoin is ERC20Mintable {
string public name = "GUSTAVO COIN";
string public symbol = "GUS";
uint8 public decimals = 18;
}
این یک قرارداد نمادین مشخص است. ما عملاً به قالبهای قرارداد هوشمند سالیدیتی زپلین اجازه میدهیم همه وظایف سنگین را برای ما انجام دهند. در اینجا ما به MintableToken اشاره می کنیم. بهتر است توکنی داشته باشیم که در آن عرضه توسط مالکی کنترل شود که بتواند توکن ها را منتشر کند و آنها را واگذار کند. جهت بررسی بهتر عملکرد این قرارداد ،می توانید رجوع کنید به
node_modules/zeppelin-solidity/contracts/token/ERC20/MintableToken.sol
مرحله زیر نحوه ایجاد قرارداد Crowdsale را نشان می دهد.
touch contracts/GustavoCoinCrowdsale.sol
ما اساساً قرارداد را به ارث می بریم از node_modules/zeppelin-solidity/contracts/crowdsale/emission/MintedCrowdsale.sol و node_modules/zeppelin-solidity/contracts/crowdsale/validation/TimedCrowdsale.sol
در نهایت فقط کد زیر را دریافت می کنیم.
زیباست نه؟ ما از قراردادهای امن ارائه شده توسط سالیدیتی زپلین به نفع خود استفاده می کنیم. توجه داشته باشید که GustavoCoinCrowdsale از TimedCrowdsale و MintedCrowdsale به ارث می برد. برای استقرار GustavoCoinCrowdsale، باید طبق قراردادهای Crowdsale و TimeCrowdsale، چند پارامتر به عملکرد سازنده آن بدهیم، یعنی مهرهای زمانی openTime و closingTime، نرخ توکن به ازای نرخ اتر، خود آدرس توکن و آدرس کیف پول صاحب قرارداد(ها).
اجازه بدید این قرارداد را اجرا کنیم. یک تب ترمینال جدید باز و اجرا کنید.
$ ganache-cli
ganache-cli را اجرا خواهد کرد و ما از آن برای نیازهای توسعه ایی خود استفاده می کنیم.
ابتدا اجازه دهید این را به فایل truffle.js اضافه کنیم. برای پیکربندی:
truffle.js:
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*" // Match any network id
}
}
};
سپس، به فایل migrations/2_deploy_contracts.js (شاید نیاز به ایجاد آن داشته باشید) بروید و آن را به این شکل تغییر دهید:
توجه داشته باشید که ما از GustavoCoin استفاده نمی کنیم. به این دلیل که به محض اینکه GustavoCoinCrowdsale مستقر شود GustavoCoin را ایجاد می کند. اکنون به برگه ترمینال که Truffle را نصب کرده اید بازگردید، دستورات را اجرا کنید:
$ truffle compile
$ truffle migrate
اگر به برگه ganache-cli نگاه کنید، خواهید دید که قرارداد با موفقیت اجرا شده است.
خوب، اجازه بدید چند توکن GUS بخریم.
$ truffle console را اجرا کنید.
با این کار کنسول ترافل باز می شود و ما از web3.js API برای تعامل با قرارداد مستقر شده استفاده می کنیم.
// The account that will buy GUS tokens. It will show differently in your ganache-cli console> purchaser = web3.eth.accounts[2]
'0xddac5d057c79facd674bc95dfd9104076fd34d6b'// The address of the GUS token instance that was created when the crowdsale contract was deployed
// assign the result of GustavoCoinCrowdsale.deployed() to the variable crowdsale
> GustavoCoinCrowdsale.deployed().then(inst => { crowdsale = inst })
undefined> crowdsale.token().then(addr => { tokenAddress = addr } )
undefined> tokenAddress
'0x87a784686ef69304ac0cb1fcb845e03c82f4ce16'> gustavoCoinInstance = GustavoCoin.at(tokenAddress)
...// add minter role to crowdsale so it is able to mint tokens during crowdsale
> gustavoCoinInstance.addMinter(crowdsale.address)
...// now check the number of GUS tokens purchaser has. It should be 0> gustavoCoinInstance.balanceOf(purchaser).then(balance => balance.toString(10))
'0'// Buying GUS tokens> GustavoCoinCrowdsale.deployed().then(inst => inst.sendTransaction({ from: purchaser, value: web3.toWei(5, "ether")}))
{ tx: '0x68aa48e1f0d0248835378caa1e5b2051be35a5ff1ded82878683e6072c0a0cfc',
receipt:
{ transactionHash: '0x68aa48e1f0d0248835378caa1e5b2051be35a5ff1ded82878683e6072c0a0cfc',
transactionIndex: 0,
blockHash: '0xb48ceed99cf6ddd4f081a99474113c4c16ecf61f76625a6559f1686698ee7d57',
blockNumber: 5,
gasUsed: 68738,
cumulativeGasUsed: 68738,
contractAddress: null,
logs: [] },
logs: [] }
undefined// Check the amount of GUS tokens for purchaser again. It should have some now.> gustavoCoinInstance.balanceOf(purchaser).then(balance => purchaserGusTokenBalance = balance.toString(10))
'5000000000000000000000'// When we created our token we made it with 18 decimals, which the same as what ether has. That's a lot of zeros, let's display without the decimals:> web3.fromWei(purchaserGusTokenBalance, "ether")
'5000'
هوراااا!!!! درست انجام شد.
می پرسی بعد از اینجا کجا برویم؟
میتونید این کد را در شبکه آزمایشی اتریوم تست کنید، یا میتوانید یک برنامه وب ایجاد کنید که به کاربران اجازه میدهد با قرارداد CrowdsaleToken تعامل داشته باشند، میتوانید قابلیتهای بیشتری مانند موعد مقرر، کپ توکن و غیره به خود قرارداد اضافه کنید.
سازنده توکن درونی خود را آزاد کنید.
جامعه اتریوم روز به روز رشد می کند و اگرچه هنوز ابزارهای زیادی وجود ندارد، اما ابزارهایی مانند ترافل و سالیدیتی زپلین کار بزرگی در بهبود تجربه توسعه دهندگان انجام می دهند.
من کنجکاو هستم که بدانم از اینجا چه چیزی را کدنویسی خواهید کرد.