a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 專題 > 區(qū)塊鏈 > 正文

一個簡單的加密貨幣的完整代碼和說明

2020-02-25 19:27:51
字體:
供稿:網(wǎng)友

  一個簡單的智能合約

  先從一個非常基礎(chǔ)的例子開始

  

123456789101112
contract ZhaoxiStorage {    uint storedData;    function set(uint x) {        storedData = x;    }    function get() constant returns (uint retVal) {        return storedData;    }}

 

  在Solidity中,一個合約由一組代碼(合約的函數(shù))和數(shù)據(jù)(合約的狀態(tài))組成。合約位于以太坊區(qū)塊鏈上的一個地址。

  uint storedData; 這行代碼聲明了一個狀態(tài)變量,變量名為storedData,類型為無符號整數(shù)uint。可以看做數(shù)據(jù)庫里面的一條記錄,可以通過調(diào)用函數(shù)查詢和修改它。在以太坊中,通常只有合約的擁有者才能這樣做。在這個例子中,函數(shù) set 和 get 分別用于修改和查詢變量的值。

  跟很多其他語言一樣,訪問狀態(tài)變量時,不需要在前面增加 this. 這樣的前綴。

  任何人都可以調(diào)用set方法設(shè)置一個不同的數(shù)字覆蓋你發(fā)布的數(shù)字。但是你的數(shù)字將會留存在區(qū)塊鏈的歷史上。稍后我們會學(xué)習(xí)如何增加存取限制。

  一個加密貨幣例子

  接下來的合約將實現(xiàn)一個形式最簡單的加密貨幣。通過這份代碼,任何人都可以發(fā)送貨幣給其他人,不需要注冊用戶名和密碼,只要有一對以太坊的公私鑰即可。

  

12345678910111213141516171819202122232425262728
contract ZhaoxiCoin {    // 關(guān)鍵字“public”使變量能從合約外部訪問。    address public minter;    mapping (address => uint) public balances;    // 事件讓輕客戶端能高效的對變化做出反應(yīng)。    event Sent(address from, address to, uint amount);    // 這個構(gòu)造函數(shù)的代碼僅僅只在合約創(chuàng)建的時候被運行。    function ZhaoxiCoin() {        minter = msg.sender;    }    // 合約創(chuàng)建者可以調(diào)用mint    function mint(address receiver, uint amount) {        if (msg.sender != minter) return;        balances[receiver] += amount;    }    // send可以被擁有代幣的任何人調(diào)用    function send(address receiver, uint amount) {        if (balances[msg.sender] < amount) return;        balances[msg.sender] -= amount;        balances[receiver] += amount;        Sent(msg.sender, receiver, amount);    }}

 

  address public minter 這行代碼聲明了一個可公開訪問的狀態(tài)變量,類型為address。address類型的值大小為160 bits,適用于存儲合約的地址或其他人的公私鑰。public關(guān)鍵字會自動為其修飾的狀態(tài)變量生成訪問函數(shù)。沒有public關(guān)鍵字的變量將無法被其他合約訪問。另外只有本合約內(nèi)的代碼才能寫入。自動生成的函數(shù)如下:

  

1
function minter() returns (address) { return minter; }

 

  下一行代碼mapping (address => uint) public balances; 創(chuàng)建了一個public的狀態(tài)變量,但是其類型更加的復(fù)雜。該類型將一些address映射到無符號整數(shù)。mapping可以被認(rèn)為是一個哈希表,每一個可能的key對應(yīng)的value被虛擬的初始化為全0。對于一個mapping,無法獲取一個包含其所有key或者value的鏈表。所以我們得自己記著添加了哪些東西到mapping中。在這個例子中由public關(guān)鍵字生成的訪問函數(shù)將會更加復(fù)雜,其代碼大致如下:

  

123
function balances(address _account) returns (uint balance) {    return balances[_account];}

 

  event Sent(address from, address to, uint value)這行代碼聲明了一個“事件”。由send函數(shù)的最后一行代碼觸發(fā)。客戶端可以監(jiān)聽這些由區(qū)塊鏈觸發(fā)的事件。事件觸發(fā)時,監(jiān)聽者會同時接收到from,to,value這些參數(shù)值,可以方便的用于跟蹤交易。為了監(jiān)聽這個事件,你可以使用如下代碼:

  

12345678910
ZhaoxiCoin.Sent().watch({}, '', function(error, result) {    if (!error) {        console.log("ZhaoxiCoin transfer: " + result.args.amount +            " coins were sent from " + result.args.from +            " to " + result.args.to + ".");        console.log("Balances now:/n" +            "Sender: " + ZhaoxiCoin.balances.call(result.args.from) +            "Receiver: " + ZhaoxiCoin.balances.call(result.args.to));    }}

 

  這里有個比較特殊的函數(shù) ZhaoxiCoin。它是一個構(gòu)造函數(shù),會在合約創(chuàng)建的時候運行,之后就無法被調(diào)用。它會永久得存儲合約創(chuàng)建者的地址。msg(以及tx和block)是一個全局變量,它包含了一些可以被合約代碼訪問的屬于區(qū)塊鏈的屬性。msg.sender 總是存放著當(dāng)前函數(shù)的外部調(diào)用者的地址。

  最后,真正被用戶或者其他合約調(diào)用,用來完成本合約功能的函數(shù)是mint和send。如果合約創(chuàng)建者之外的其他人調(diào)用mint,什么都不會發(fā)生。而send可以被任何人(擁有一定數(shù)量的代幣)調(diào)用,發(fā)送一些幣給其他人。

  以上就是一個簡單的加密貨幣的完整代碼和說明。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 三级在线观看 | 久久久久毛片 | 久久国产精品亚洲 | 欧美日韩一二三区 | 久久久久久午夜 | 国产精品www| 日日干天天操 | 久久久99精品免费观看 | 自拍视频在线播放 | 国产精品二区三区 | 黄色日批视频 | 精品在线一区二区三区 | 日韩中文字幕免费在线播放 | 91精品国产乱码久久久久久久久 | 人人澡人人射 | 久久久99国产精品免费 | 国产精品一任线免费观看 | 国产成人精品999在线观看 | 中文在线播放 | 国产一级中文字幕 | 本道综合精品 | 国产精品一区二 | 精品国产99 | 亚洲免费视频一区二区 | 精品一区二区三区四区五区 | 日本久久久一区二区三区 | 黄色网页在线观看 | 日本在线播放 | 国产三级在线 | 91视频www| 五月天在线婷婷 | 日韩久久一区二区 | 国产视频一区二区 | 日韩三级电影在线免费观看 | 干干日日 | 成人国产精品久久久 | 国产激情久久久久久 | 久久一区二区三区四区五区 | 国产午夜精品一区二区三区嫩草 | 国产一级一级国产 | 日韩av成人 |