solidity開發以太坊代幣智能合約

智能合約開發是以太坊編程的核心之一,而代幣是區塊鏈應用的關鍵環節,下面我們來用solidity語言開發一個代幣合約的實例,希望對大家有幫助。

以太坊的應用被稱為去中心化應用(DApp),DApp的開發主要包括兩大部分:

  • 智能合約的開發
  • 用戶界面的開發

在本文中,我們將介紹智能合約的開發語言solidity。

讓我們先從一個非常基礎的例子開始,不用擔心你現在還一點都不了解,我們將逐步了解到更多的細節。

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

在Solidity中,一個合約由一組代碼(合約的函數)和數據(合約的狀態)組成。合約位于以太坊區塊鏈上的一個特殊地址。

uint storedData; 這行代碼聲明了一個狀態變量,變量名為storedData,類型為 uint (256bits無符號整數)。你可以認為它就像數據庫里面的一個存儲單元,跟管理數據庫一樣,可以通過調用函數查詢和修改它。在以太坊中,通常只有合約的擁有者才能這樣做。在這個例子中,函數 set 和 get 分別用于修改和查詢變量的值。

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

這個合約還無法做很多事情(受限于以太坊的基礎設施),僅僅是允許任何人儲存一個數字。而且世界上任何一個人都可以來存取這個數字,缺少一個(可靠的)方式來保護你發布的數字。任何人都可以調用set方法設置一個不同的數字覆蓋你發布的數字。但是你的數字將會留存在區塊鏈的歷史上。稍后我們會學習如何增加一個存取限制,使得只有你才能修改這個數字。

編寫代幣合約

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

contract Coin {
//關鍵字“public”使變量能從合約外部訪問。address public minter;mapping (address => uint) public balances;//事件讓輕客戶端能高效的對變化做出反應。event Sent(address from, address to, uint amount);//這個構造函數的代碼僅僅只在合約創建的時候被運行。function Coin() {minter = msg.sender;}function mint(address receiver, uint amount) {if (msg.sender != minter) return;balances[receiver] += amount;}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;

這行代碼聲明了一個可公開訪問的狀態變量,類型為address。address類型的值大小為160 bits,不支持任何算術操作。適用于存儲合約的地址或其他人的公私鑰。public關鍵字會自動為其修飾的狀態變量生成訪問函數。沒有public關鍵字的變量將無法被其他合約訪問。另外只有本合約內的代碼才能寫入。自動生成的函數如下:

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

當然我們自己增加一個這樣的訪問函數是行不通的。編譯器會報錯,指出這個函數與一個狀態變量重名。

下一行代碼創建了一個public的狀態變量,但是其類型更加復雜:

mapping (address => uint) public balances;
該類型將一些address映射到無符號整數。mapping可以被認為是一個哈希表,每一個可能的key對應的value被虛擬的初始化為全0.這個類比不是很嚴謹,對于一個mapping,無法獲取一個包含其所有key或者value的鏈表。所以我們得自己記著添加了哪些東西到mapping中。更好的方式是維護一個這樣的鏈表,或者使用其他更高級的數據類型。或者只在不受這個缺陷影響的場景中使用mapping,就像這個例子。在這個例子中由public關鍵字生成的訪問函數將會更加復雜,其代碼大致如下:

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

我們可以很方便的通過這個函數查詢某個特定賬號的余額。

event Sent(address from, address to, uint value); 

這行代碼聲明了一個“事件”。由send函數的最后一行代碼觸發。客戶端(服務端應用也適用)可以以很低的開銷來監聽這些由區塊鏈觸發的事件。事件觸發時,監聽者會同時接收到from,to,value這些參數值,可以方便的用于跟蹤交易。為了監聽這個事件,你可以使用如下代碼:

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

注意在客戶端中是如何調用自動生成的 balances 函數的。

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

最后,真正被用戶或者其他合約調用,用來完成本合約功能的函數是mint和send。如果合約創建者之外的其他人調用mint,什么都不會發生。而send可以被任何人(擁有一定數量的代幣)調用,發送一些幣給其他人。注意,當你通過該合約發送一些代幣到某個地址,在區塊鏈瀏覽器中查詢該地址將什么也看不到。因為發送代幣導致的余額變化只存儲在該代幣合約的數據存儲中。通過事件我們可以很容易創建一個可以追蹤你的新幣交易和余額的“區塊鏈瀏覽器”。


順便安利幾個區塊鏈、以太坊開發DApp的實戰教程:
1.適合區塊鏈新手的以太坊DApp開發

2.用區塊鏈、星際文件系統(IPFS)、Node.js和MongoDB來構建電商平臺

3.C#開發以太坊區塊鏈的教程

4.EOS智能合約與DApp開發入門

5.java開發以太坊區塊鏈的教程,web3j開發詳解

6.PHP開發以太坊區塊鏈的教程

7.python用web3.py開發以太坊區塊鏈應用的教程

轉載于:https://blog.51cto.com/13697184/2107539

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390594.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2019大數據課程_根據數據,2019年最佳免費在線課程

2019大數據課程As we do each year, Class Central has tallied the best courses of the previous year, based on thousands of learner reviews. (Here are the rankings from 2015, 2016, 2017, and 2018.) 與我們每年一樣&#xff0c;根據數千名學習者的評論&#xff0c; …

2017-12-07 socket 讀取問題

1.用socke阻塞方式讀取服務端發送的數據時會出現讀取一直阻塞的情況&#xff0c;如果設置了超時時間會在超時時間后讀取到數據: 原因&#xff1a;在不確定服務器會不會發送 socket發送的數據不會返回null 或者-1 所以用常規的判斷方法是不行的。 解決辦法有兩個&#xff1a;1 …

靜態代理設計與動態代理設計

靜態代理設計模式 代理設計模式最本質的特質&#xff1a;一個真實業務主題只完成核心操作&#xff0c;而所有與之輔助的功能都由代理類來完成。 例如&#xff0c;在進行數據庫更新的過程之中&#xff0c;事務處理必須起作用&#xff0c;所以此時就可以編寫代理設計模式來完成。…

svm機器學習算法_SVM機器學習算法介紹

svm機器學習算法According to OpenCVs "Introduction to Support Vector Machines", a Support Vector Machine (SVM):根據OpenCV“支持向量機簡介”&#xff0c;支持向量機(SVM)&#xff1a; ...is a discriminative classifier formally defined by a separating …

6.3 遍歷字典

遍歷所有的鍵—值對 遍歷字典時&#xff0c;鍵—值對的返回順序也與存儲順序不同。 6.3.2 遍歷字典中的所有鍵 在不需要使用字典中的值時&#xff0c;方法keys() 很有用。 6.3.3 按順序遍歷字典中的所有鍵 要以特定的順序返回元素&#xff0c;一種辦法是在for 循環中對返回的鍵…

Google Guava新手教程

以下資料整理自網絡 一、Google Guava入門介紹 引言 Guavaproject包括了若干被Google的 Java項目廣泛依賴 的核心庫&#xff0c;比如&#xff1a;集合 [collections] 、緩存 [caching] 、原生類型支持 [primitives support] 、并發庫 [concurrency libraries] 、通用注解 [comm…

HTML DOM方法

querySelector() (querySelector()) The Document method querySelector() returns the first element within the document that matches the specified selector, or group of selectors. If no matches are found, null is returned.Document方法querySelector()返回文檔中與…

leetcode 773. 滑動謎題

題目 在一個 2 x 3 的板上&#xff08;board&#xff09;有 5 塊磚瓦&#xff0c;用數字 1~5 來表示, 以及一塊空缺用 0 來表示. 一次移動定義為選擇 0 與一個相鄰的數字&#xff08;上下左右&#xff09;進行交換. 最終當板 board 的結果是 [[1,2,3],[4,5,0]] 謎板被解開。…

數據科學領域有哪些技術_領域知識在數據科學中到底有多重要?

數據科學領域有哪些技術Jeremie Harris: “In a way, it’s almost like a data scientist or a data analyst has to be like a private investigator more than just a technical person.”杰里米哈里斯(Jeremie Harris) &#xff1a;“ 從某種意義上說&#xff0c;這就像是數…

python 算術運算

1. 算術運算符與優先級 # -*- coding:utf-8 -*-# 運算符含有,-,*,/,**,//,% # ** 表示^ , 也就是次方 a 2 ** 4 print 2 ** 4 , aa 16 / 5 print 16 / 5 , aa 16.0 / 5 print 16.0 / 5 , a# 結果再進行一次floor a 16.0 // 5.0 print 16.0 // 5.0 , aa 16 // 5 print …

c語言編程時碰到取整去不了_碰到編程墻時如何解開

c語言編程時碰到取整去不了Getting stuck is part of being a programmer, no matter the level. The so-called “easy” problem is actually pretty hard. You’re not exactly sure how to move forward. What you thought would work doesn’t.無論身在何處&#xff0c;陷…

初創公司怎么做銷售數據分析_為什么您的初創企業需要數據科學來解決這一危機...

初創公司怎么做銷售數據分析The spread of coronavirus is delivering a massive blow to the global economy. The lockdown and work from home restrictions have forced thousands of startups to halt expansion plans, cancel services, and announce layoffs.冠狀病毒的…

leetcode 909. 蛇梯棋

題目 N x N 的棋盤 board 上&#xff0c;按從 1 到 N*N 的數字給方格編號&#xff0c;編號 從左下角開始&#xff0c;每一行交替方向。 例如&#xff0c;一塊 6 x 6 大小的棋盤&#xff0c;編號如下&#xff1a; r 行 c 列的棋盤&#xff0c;按前述方法編號&#xff0c;棋盤格…

Python基礎之window常見操作

一、window的常見操作&#xff1a; cd c:\ #進入C盤d: #從C盤切換到D盤 cd python #進入目錄cd .. #往上走一層目錄dir #查看目錄文件列表cd ../.. #往上上走一層目錄 二、常見的文件后綴名&#xff1a; .txt 記事本文本文件.doc word文件.xls excel文件.ppt PPT文件.exe 可執行…

WPF效果(GIS三維篇)

二維的GIS已經被我玩爛了&#xff0c;緊接著就是三維了&#xff0c;哈哈&#xff01;先來看看最簡單的效果&#xff1a; 轉載于:https://www.cnblogs.com/OhMonkey/p/8954626.html

css注釋_CSS注釋示例–如何注釋CSS

css注釋Comments are used in CSS to explain a block of code or to make temporary changes during development. The commented code doesn’t execute.CSS中使用注釋來解釋代碼塊或在開發過程中進行臨時更改。 注釋的代碼不執行。 Both single and multi-line comments in…

r軟件時間序列分析論文_高度比較的時間序列分析-一篇論文評論

r軟件時間序列分析論文數據科學 &#xff0c; 機器學習 (Data Science, Machine Learning) In machine learning with time series, using features extracted from series is more powerful than simply treating a time series in a tabular form, with each date/timestamp …

leetcode 168. Excel表列名稱

題目 給你一個整數 columnNumber &#xff0c;返回它在 Excel 表中相對應的列名稱。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1&#xff1a; 輸入&#xff1a;columnNumber 1 輸出&#xff1a;“A” 示例 2&…

飛機訂票系統

1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>4 #include <conio.h>5 typedef struct flightnode{6 char flight_num[10]; //航班號7 char start_time[10]; //起飛時間8 char end_time[10]; //抵達時間9 char st…

解決Mac10.13 Pod報錯 -bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.fram

升級10.13以后Pod命令失效&#xff0c;解決辦法如下&#xff1a; 終端執行 brew link --overwrite cocoapods 復制代碼嘗試 Pod 命令是否已經恢復 若報錯繼續執行 brew reinstall cocoapodsbrew install rubybrew link --overwrite cocoapods 復制代碼嘗試 Pod 命令是否已經恢復…