java 创建以太坊代币_以太坊 (五)编写智能合约-建立简易加密代币
本篇文章,我們將寫一個(gè)簡(jiǎn)易的加密代幣的智能合約來給大家詮釋加密代幣的原理
啟動(dòng) ganache-cli
打開終端,啟動(dòng)ganache-cli,相關(guān)環(huán)境在區(qū)塊鏈學(xué)習(xí)日記(四)這篇文章里面已經(jīng)有具體說明。
wangsanjundeMacBook-Pro:~ wangsanjun$ ganache-cli
Ganache CLI v6.0.3 (ganache-core: 2.0.2)
Available Accounts
==================
(0) 0x79221bc486bcc9380d280c4221856f7122b32d6f
(1) 0xc72f1267309aaa7aa79c1f6b971edca111e0c3e4
(2) 0x5139a3ca66f06102eabbb38989021bca9ade63db
(3) 0x20cb6137afeb2da01d2fb28ade7822a5ffe214e1
(4) 0x93382d64508ca98b9f2a7dbf13366be157be04fa
(5) 0x051a305c1d016391cea8d9d19c5560d0bb4148f4
(6) 0x9676763004ec23beab44feeb6d9d9f86a846b7ab
(7) 0xe0400ae3a7390d78397d12fc0b768f8209f5abf4
(8) 0xd17a5a1a9b26d35ef957bf5686db90b011f8d9a8
(9) 0x0b529a02f4f6c997dae911a64fce47d4a850b77c
Private Keys
==================
(0) 85e35b54c141ebe2df61cc56192aced3ba03f51e2ae8ca0ed299a25ab8ac7155
(1) 4215839182c1ffcb5f8854631fd1a2372be3b3910a0f193e392f90df85befb03
(2) 90081b0b6f3ffc6ce6245bed5f0f864982522d65a4b47a891f07b6be0deec03b
(3) 845efda127b31c0c0e4ef142bb62de73dc89bf3269d1ace9e3be3ad2476c29ff
(4) dfa540af69e16a81415e362295e9526acb4189eb883bbf30a843c2289a2f7cb0
(5) 18fac89e76063d582881ad98a6ad6f79e07782b64bbac507034ccb5a66cc5e7e
(6) 3e0ab00795f1f061f7ca681e64d51bd1ee59427bfe5477e751ee93f9596d95b6
(7) a09f85a55ee46a61030b87bea045cff8e43671287709608bd329f41e33660442
(8) 420ec6889ba6aa5ec1cfd1757b9209687350487cc14dc56e8792b2bd6727de4a
(9) 45e96bbd340ef850ee32b1f3a5808ed3aecad889f1929377fe6eabd95c0dcc77
HD Wallet
==================
Mnemonic: neither mountain become final nephew drill ramp onion attract parade neck merge
Base HD Path: m/44'/60'/0'/0/{account_index}
Listening on localhost:8545
...
接下來我們就可以一步步的創(chuàng)建我們的加密代幣項(xiàng)目了。
代幣合約的基本概念
代幣合約扮演的角色相當(dāng)于銀行的角色。使用者在代幣合約中,用自己的以太幣帳戶地址當(dāng)作銀行帳戶,可以透過代幣合約執(zhí)行轉(zhuǎn)賬(transfer,將代幣由一個(gè)帳戶轉(zhuǎn)到另一個(gè)帳戶),查詢余額(balanceOf,查詢指定帳戶中擁有的代幣)等原本由銀行負(fù)責(zé)的工作。因?yàn)楹霞s部署在公開區(qū)塊鏈上,所有的交易都是公開透明,可供檢驗(yàn)的。
創(chuàng)建代幣合約項(xiàng)目
wangsanjundeMacBook-Pro:SmartContractDemo wangsanjun$ mkdir EncrptedToken
wangsanjundeMacBook-Pro:EncrptedToken wangsanjun$ truffle init
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!
Commands:
Compile: truffle compile
Migrate: truffle migrate
Test contracts: truffle test
wangsanjundeMacBook-Pro:EncrptedToken wangsanjun$
新建代幣合約
終端執(zhí)行truffle create contract EncryptedToken命令創(chuàng)建EncryptedToken.sol合約。
EncryptedToken.sol.png
編寫合約代碼
將下面的合約代碼拷貝,替換EncryptedToken.sol文件的代碼。
pragma solidity ^0.4.17;
contract EncryptedToken {
uint256 INITIAL_SUPPLY = 666666;
mapping(address => uint256) balances;
function EncryptedToken() {
balances[msg.sender] = INITIAL_SUPPLY;
}
// 轉(zhuǎn)賬到一個(gè)指定的地址
function transfer(address _to, uint256 _amount) {
assert(balances[msg.sender] >= _amount);
balances[msg.sender] -= _amount;
balances[_to] += _amount;
}
// 查看指定地址的余額
function balanceOf(address _owner) constant returns (uint256) {
return balances[_owner];
}
}
pragma solidity ^0.4.17中的0.4.17代表solidity的版本,^代表0.4.17 ~ 0.4.99之間的solidity都可以正常編譯當(dāng)前版本的合約。
contract相當(dāng)于其他語言中的class,EncryptedToken相當(dāng)于類的名字。contract EncryptedToken可以理解為class EncryptedToken extends Contract。
uint256 INITIAL_SUPPLY = 666666聲明了一個(gè)變量INITIAL_SUPPLY,初始化存儲(chǔ)了一個(gè)666666的整數(shù)作為部署當(dāng)前合約的錢包地址的代幣數(shù)。
mapping(address => uint256) balances;,balances是一個(gè)key類型為address,value類型為uint256的鍵值對(duì) (mapping),相當(dāng)于 Java 中的map、iOS 中的NSDictionary。
function EncryptedToken()函數(shù)是EncryptedToken合約的構(gòu)造函數(shù) (contructor),當(dāng)EncryptedToken合約調(diào)用時(shí),會(huì)先執(zhí)行它的構(gòu)造函數(shù)。
在構(gòu)造函數(shù)中,會(huì)以當(dāng)前部署合約的錢包地址為key,以INITIAL_SUPPLY為value初始化一個(gè)鍵值對(duì)。
function transfer(address _to, uint256 _amount) {
assert(balances[msg.sender] >= _amount);
balances[msg.sender] -= _amount;
balances[_to] += _amount;
}
transfer函數(shù)是聲明用來從轉(zhuǎn)賬到指定錢包地址的函數(shù),_to代表轉(zhuǎn)賬的目的地地址,_amount代表轉(zhuǎn)賬金額。
assert(balances[msg.sender] >= _amount),這句代碼中,我聲明了一個(gè)斷言,當(dāng)balances[msg.sender] >= _amount,即當(dāng)前錢包余額小于要轉(zhuǎn)賬的額度時(shí),就會(huì)拋出異常。
balances[msg.sender] -= _amount;從當(dāng)前錢包額度中減去_amount。
balances[_to] += _amount;,將目標(biāo)地址的額度增加_amount。
function balanceOf(address _owner) constant returns (uint256) {
return balances[_owner];
}
balanceOf(address _owner)函數(shù)是用來查詢指定錢包地址的余額,_owner即是指定的錢包地址,returns (uint256)代表返回值的類型為uint256,constant關(guān)鍵字的作用是,當(dāng)我們調(diào)用balanceOf函數(shù)時(shí),它會(huì)自動(dòng)調(diào)用call()方法,表明是只讀數(shù)據(jù),而不需要往區(qū)塊鏈寫入數(shù)據(jù),調(diào)用這個(gè)方法,不需要花費(fèi)手續(xù)費(fèi)。
編譯與部署
在migrations/目錄下創(chuàng)建一個(gè)名字叫做2_deploy_contract.js的文件。文件中的內(nèi)容為:
var EncryptedToken = artifacts.require('./EncryptedToken.sol');
module.exports = function(deployer) {
deployer.deploy(EncryptedToken);
}
2_deploy_contract.js.png
修改truffle.js文件,連接本地ganache-cli環(huán)境
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*" // Match any network id
}
}
};
truffle.js.png
接下來執(zhí)行compile和migrate命令:
wangsanjundeMacBook-Pro:EncrptedToken wangsanjun$ truffle compile
Compiling ./contracts/EncryptedToken.sol...
Compiling ./contracts/Migrations.sol...
Compilation warnings encountered:
/Users/wangsanjun/Desktop/SmartContractDemo/EncrptedToken/contracts/EncryptedToken.sol:6:3: Warning: No visibility specified. Defaulting to "public".
function EncryptedToken() {
^
Spanning multiple lines.
,/Users/wangsanjun/Desktop/SmartContractDemo/EncrptedToken/contracts/EncryptedToken.sol:10:3: Warning: No visibility specified. Defaulting to "public".
function transfer(address _to, uint256 _amount) {
^
Spanning multiple lines.
,/Users/wangsanjun/Desktop/SmartContractDemo/EncrptedToken/contracts/EncryptedToken.sol:16:3: Warning: No visibility specified. Defaulting to "public".
function balanceOf(address _owner) constant returns (uint256) {
^
Spanning multiple lines.
Writing artifacts to ./build/contracts
wangsanjundeMacBook-Pro:EncrptedToken wangsanjun$ truffle migrate
Using network 'development'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0xc4e64f8636e83fe67a9c0044667cf19237e631e801dd682f7ef01c8175eb7d6c
Migrations: 0x252a66c521dd81312455411acdd8074c159ee300
Saving successful migration to network...
... 0x0c2c60f492f7a82ab7d72e523b75f024ae83f402be313d033078d46b49555a89
Saving artifacts...
Running migration: 2_deploy_contract.js
Deploying EncryptedToken...
... 0x14675402f0781db21afccb69a11a3e2177d06d7eba4a95b67a1b146caf48262e
EncryptedToken: 0x5c6d0f9528791e07350e00e80e66e655583d7b69
Saving successful migration to network...
... 0x447a94584192424ff4401892c5f478db7d39218895e856636e578ed536e838e1
Saving artifacts...
wangsanjundeMacBook-Pro:EncrptedToken wangsanjun$
如上所示,我們已經(jīng)將EncryptedToken代幣合約部署到了ganache-cli上。
合約驗(yàn)證
合約部署完成后,我們通過truffle console開啟console控制臺(tái),在這個(gè)控制臺(tái)中對(duì)已經(jīng)部署的合約進(jìn)行驗(yàn)證。
接下來聲明一個(gè)合約變量存儲(chǔ)EncryptedToken合約實(shí)例。
truffle(development)> let contract;
undefined
truffle(development)> EncryptedToken.deployed().then(instance => contract = instance)
.....
truffle(development)>
驗(yàn)證web3.eth.coinbase和web3.eth.accounts[1]中的余額。
truffle(development)> contract.balanceOf(web3.eth.coinbase)
{ [String: '666666'] s: 1, e: 5, c: [ 666666 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
{ [String: '0'] s: 1, e: 0, c: [ 0 ] }
truffle(development)>
經(jīng)驗(yàn)證,第 0 個(gè)錢包地址中的代幣余額為666666,第 1 個(gè)錢包地址中的代幣余額為0。
下一步,我們將從第 0 個(gè)賬號(hào)中向第 1 個(gè)賬號(hào)轉(zhuǎn)賬666個(gè)代幣。
truffle(development)> contract.transfer(web3.eth.accounts[1],666)
{ tx: '0x50c71bd9a522afb9ff054bf11755d7665d7d9770f1bfca3548973df7aace24ab',
receipt:
{ transactionHash: '0x50c71bd9a522afb9ff054bf11755d7665d7d9770f1bfca3548973df7aace24ab',
transactionIndex: 0,
blockHash: '0x2fc452564dad406210c26be62e44770c6fa6ec1f435ff488ffb393a5317b8de6',
blockNumber: 28,
gasUsed: 49120,
cumulativeGasUsed: 49120,
contractAddress: null,
logs: [],
status: 1 },
logs: [] }
truffle(development)> contract.balanceOf(web3.eth.coinbase)
{ [String: '666000'] s: 1, e: 5, c: [ 666000 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
{ [String: '666'] s: 1, e: 2, c: [ 666 ] }
truffle(development)>
如上所示,代幣轉(zhuǎn)賬成功。
備注:如果合約部署成功之后,又修改了代碼。重新編譯時(shí),一定要先將build文件夾刪除,其次在部署合約時(shí),一定要添加--reset,否則修改后的合約沒法部署成功。
總結(jié)
以上是生活随笔為你收集整理的java 创建以太坊代币_以太坊 (五)编写智能合约-建立简易加密代币的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年7月国债利率是多少?
- 下一篇: dialog element 删掉标题_