十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章主要講解了“怎么使用solidity語言編寫一個(gè)合約”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么使用solidity語言編寫一個(gè)合約”吧!

烏當(dāng)網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),烏當(dāng)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為烏當(dāng)成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的烏當(dāng)做網(wǎng)站的公司定做!
Solidity是一種語法類似JavaScript的高級(jí)語言。它被設(shè)計(jì)成以編譯的方式生成以太坊虛擬機(jī)代碼。在后續(xù)內(nèi)容中你將會(huì)發(fā)現(xiàn),使用它很容易創(chuàng)建用于投票、眾籌、封閉拍賣、多重簽名錢包等等的合約。
讓我們先從一個(gè)非常基礎(chǔ)的例子開始,不用擔(dān)心你現(xiàn)在還一點(diǎn)都不了解,我們將逐步了解到更多的細(xì)節(jié)。
contract SimpleStorage {
uint storedData;
function set(uint x) {
storedData = x;
}
function get() constant returns (uint retVal) {
return storedData;
}
}在Solidity中,一個(gè)合約由一組代碼(合約的函數(shù))和數(shù)據(jù)(合約的狀態(tài))組成。合約位于以太坊區(qū)塊鏈上的一個(gè)特殊地址。
uint storedData; 這行代碼聲明了一個(gè)狀態(tài)變量,變量名為storedData,類型為 uint (256bits無符號(hào)整數(shù))。你可以認(rèn)為它就像數(shù)據(jù)庫里面的一個(gè)存儲(chǔ)單元,跟管理數(shù)據(jù)庫一樣,可以通過調(diào)用函數(shù)查詢和修改它。在以太坊中,通常只有合約的擁有者才能這樣做。在這個(gè)例子中,函數(shù) set 和 get 分別用于修改和查詢變量的值。
跟很多其他語言一樣,訪問狀態(tài)變量時(shí),不需要在前面增加 this. 這樣的前綴。
這個(gè)合約還無法做很多事情(受限于以太坊的基礎(chǔ)設(shè)施),僅僅是允許任何人儲(chǔ)存一個(gè)數(shù)字。而且世界上任何一個(gè)人都可以來存取這個(gè)數(shù)字,缺少一個(gè)(可靠的)方式來保護(hù)你發(fā)布的數(shù)字。任何人都可以調(diào)用set方法設(shè)置一個(gè)不同的數(shù)字覆蓋你發(fā)布的數(shù)字。但是你的數(shù)字將會(huì)留存在區(qū)塊鏈的歷史上。稍后我們會(huì)學(xué)習(xí)如何增加一個(gè)存取限制,使得只有你才能修改這個(gè)數(shù)字。
接下來的合約將實(shí)現(xiàn)一個(gè)形式最簡單的加密貨幣。任何人都可以發(fā)送貨幣給其他人,不需要注冊(cè)用戶名和密碼,只要有一對(duì)以太坊的公私鑰即可。
contract Coin {
//關(guān)鍵字“public”使變量能從合約外部訪問。
address public minter;
mapping (address => uint) public balances;
//事件讓輕客戶端能高效的對(duì)變化做出反應(yīng)。
event Sent(address from, address to, uint amount);
//這個(gè)構(gòu)造函數(shù)的代碼僅僅只在合約創(chuàng)建的時(shí)候被運(yùn)行。
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);
}
}這個(gè)合約引入了一些新的概念,讓我們來逐個(gè)介紹。
address public minter;`
這行代碼聲明了一個(gè)可公開訪問的狀態(tài)變量,類型為address。address類型的值大小為160 bits,不支持任何算術(shù)操作。適用于存儲(chǔ)合約的地址或其他人的公私鑰。public關(guān)鍵字會(huì)自動(dòng)為其修飾的狀態(tài)變量生成訪問函數(shù)。沒有public關(guān)鍵字的變量將無法被其他合約訪問。另外只有本合約內(nèi)的代碼才能寫入。自動(dòng)生成的函數(shù)如下:
function minter() returns (address) { return minter; }當(dāng)然我們自己增加一個(gè)這樣的訪問函數(shù)是行不通的。編譯器會(huì)報(bào)錯(cuò),指出這個(gè)函數(shù)與一個(gè)狀態(tài)變量重名。
下一行代碼創(chuàng)建了一個(gè)public的狀態(tài)變量,但是其類型更加復(fù)雜:
mapping (address => uint) public balances;
該類型將一些address映射到無符號(hào)整數(shù)。mapping可以被認(rèn)為是一個(gè)哈希表,每一個(gè)可能的key對(duì)應(yīng)的value被虛擬的初始化為全0.這個(gè)類比不是很嚴(yán)謹(jǐn),對(duì)于一個(gè)mapping,無法獲取一個(gè)包含其所有key或者value的鏈表。所以我們得自己記著添加了哪些東西到mapping中。更好的方式是維護(hù)一個(gè)這樣的鏈表,或者使用其他更高級(jí)的數(shù)據(jù)類型?;蛘咧辉诓皇苓@個(gè)缺陷影響的場景中使用mapping,就像這個(gè)例子。在這個(gè)例子中由public關(guān)鍵字生成的訪問函數(shù)將會(huì)更加復(fù)雜,其代碼大致如下:
function balances(address _account) returns (uint balance) {
return balances[_account];
}我們可以很方便的通過這個(gè)函數(shù)查詢某個(gè)特定賬號(hào)的余額。
event Sent(address from, address to, uint value);
這行代碼聲明了一個(gè)“事件”。由send函數(shù)的最后一行代碼觸發(fā)。客戶端(服務(wù)端應(yīng)用也適用)可以以很低的開銷來監(jiān)聽這些由區(qū)塊鏈觸發(fā)的事件。事件觸發(fā)時(shí),監(jiān)聽者會(huì)同時(shí)接收到from,to,value這些參數(shù)值,可以方便的用于跟蹤交易。為了監(jiān)聽這個(gè)事件,你可以使用如下代碼:
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));
}
}注意在客戶端中是如何調(diào)用自動(dòng)生成的 balances 函數(shù)的。
這里有個(gè)比較特殊的函數(shù) Coin。它是一個(gè)構(gòu)造函數(shù),會(huì)在合約創(chuàng)建的時(shí)候運(yùn)行,之后就無法被調(diào)用。它會(huì)永久得存儲(chǔ)合約創(chuàng)建者的地址。msg(以及tx和block)是一個(gè)神奇的全局變量,它包含了一些可以被合約代碼訪問的屬于區(qū)塊鏈的屬性。msg.sender 總是存放著當(dāng)前函數(shù)的外部調(diào)用者的地址。
最后,真正被用戶或者其他合約調(diào)用,用來完成本合約功能的函數(shù)是mint和send。如果合約創(chuàng)建者之外的其他人調(diào)用mint,什么都不會(huì)發(fā)生。而send可以被任何人(擁有一定數(shù)量的代幣)調(diào)用,發(fā)送一些幣給其他人。注意,當(dāng)你通過該合約發(fā)送一些代幣到某個(gè)地址,在區(qū)塊鏈瀏覽器中查詢?cè)摰刂穼⑹裁匆部床坏?。因?yàn)榘l(fā)送代幣導(dǎo)致的余額變化只存儲(chǔ)在該代幣合約的數(shù)據(jù)存儲(chǔ)中。通過事件我們可以很容易創(chuàng)建一個(gè)可以追蹤你的新幣交易和余額的“區(qū)塊鏈瀏覽器”。
感謝各位的閱讀,以上就是“怎么使用solidity語言編寫一個(gè)合約”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么使用solidity語言編寫一個(gè)合約這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!