日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 创建以太坊代币_以太坊 (五)编写智能合约-建立简易加密代币

發(fā)布時(shí)間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 创建以太坊代币_以太坊 (五)编写智能合约-建立简易加密代币 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇文章,我們將寫一個(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。