這篇文章主要介紹“Solidity基本代碼舉例分析”,在日常操作中,相信很多人在Solidity基本代碼舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”Solidity基本代碼舉例分析”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)主要業(yè)務(wù)有網(wǎng)站營銷策劃、網(wǎng)站制作、做網(wǎng)站、微信公眾號(hào)開發(fā)、微信小程序開發(fā)、H5技術(shù)、程序開發(fā)等業(yè)務(wù)。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶當(dāng)客戶,還把客戶視為我們的合作伙伴,在開展業(yè)務(wù)的過程中,公司還積累了豐富的行業(yè)經(jīng)驗(yàn)、成都營銷網(wǎng)站建設(shè)資源和合作伙伴關(guān)系資源,并逐漸建立起規(guī)范的客戶服務(wù)和保障體系。
Solidity是實(shí)施智能合約的契約導(dǎo)向的高級(jí)語言。它受到C ++,Python和JavaScript的影響,旨在針對(duì)以太坊虛擬機(jī)(EVM)。
Solidity是靜態(tài)類型的,支持繼承,庫和復(fù)雜的用戶定義類型等功能。
我們從一個(gè)基礎(chǔ)的solidity例子開始。開始的時(shí)候,你可能看不懂每一行具體的意思,但是沒關(guān)系,我們會(huì)在后續(xù)的講解中介紹每一個(gè)細(xì)節(jié)。
1 2 3 4 5 6 7 8 9 10 11 | pragma solidity ^0.4.0; contract SimpleStorage { uint storedData; function set(uint x) { storedData = x; } function get() constant returns (uint) { return storedData; } } |
第一行告訴快3平臺(tái)出租出售Q1619668668【www.wkyule.com】該合約用的是0.4.0版本的solidity編寫,并且這些代碼具有向上兼容性。保證不會(huì)在不同solidity編譯版本下編譯會(huì)出現(xiàn)不同的行為。
從Solidity角度來看,合約就是存在于以太坊區(qū)塊鏈中的一個(gè)特定地址中的代碼和數(shù)據(jù)集合。uint storedData 聲明了一個(gè)類型為 uint(256位的無符號(hào)整型)的變量,變量名稱為 storedData。你可以把它想象為數(shù)據(jù)庫中的一個(gè)字段,該字段是可以被數(shù)據(jù)庫中的方法進(jìn)行查詢,修改。在以太坊中,這個(gè)字段是屬于一個(gè)合約字段。在這個(gè)例子中,該變量可以通過提供的get,set方法進(jìn)行獲取或是修改。在Solidity中,訪問一個(gè)變量是不需要通過this來引用的。
這個(gè)合約很簡單,只是允許以太坊上的任何人來存儲(chǔ)一個(gè)數(shù)據(jù)到某個(gè)節(jié)點(diǎn),同時(shí)把這個(gè)操作發(fā)布到以太坊中,當(dāng)然,以太坊上的其他節(jié)點(diǎn)同樣可以通過調(diào)用set方法來修改你已經(jīng)存儲(chǔ)好的值。雖然有被修改,但是對(duì)該值操作的任何歷史記錄都是保存在以太坊中的。不用擔(dān)心你的存儲(chǔ)記錄或是修改記錄會(huì)丟失。后面我們會(huì)將到如何對(duì)合約進(jìn)行限制,只允許你一個(gè)人修改這個(gè)數(shù)據(jù)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | pragma solidity ^0.4.0; contract Coin { //public關(guān)鍵字可以讓外部訪問該變量 address public minter; mapping (address => uint) public balances; //事件可以讓輕客戶端快速的響應(yīng)變化 event Sent(address from, address to, uint amount); // 構(gòu)造方法 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); } } |
下面的例子將實(shí)現(xiàn)一個(gè)簡單的加密貨幣例子。無中生幣不在是夢(mèng)想,當(dāng)然只有合約的創(chuàng)建人才有這個(gè)特權(quán)。此外,任何人只要有一個(gè)以太坊密鑰對(duì)就可以進(jìn)行貨幣交易,根本不需要注冊(cè)用戶名和密碼。這個(gè)合約引入了一些新的概念,讓我們一個(gè)個(gè)都過一遍。
address public minter;
聲明了一個(gè)public,類型為address的狀態(tài)變量。Address類型是一個(gè)160位的值,不允許任何的算術(shù)操作。它適合于存儲(chǔ)合約地址或是其他人的密鑰對(duì)。Public關(guān)鍵字會(huì)自動(dòng)產(chǎn)生用于外部訪問該變量值的方法。如果不聲明public,其他的合約是無法訪問該變量的。自動(dòng)產(chǎn)生的方法類似于:
function minter() returns (address) { return minter; }
當(dāng)然如果你增加了一個(gè)和上面完全一樣的方法是沒有任何作用的,我們需要變量和產(chǎn)生的方法名完全一致。這塊其實(shí)編譯器會(huì)幫助我們完成,不需要我們自己動(dòng)手編寫,我們只要知道這個(gè)概念就可以。
mapping (address => uint) public balances;
還是創(chuàng)建了一個(gè)公有狀態(tài)變量,這是一個(gè)比address更復(fù)雜的數(shù)據(jù)類型,類似java里的Map
,它描述了一個(gè)地址和一個(gè)uinit數(shù)據(jù)類型的map關(guān)系。Mappings的關(guān)系可以看成是一個(gè)hash表,所有可能的key都對(duì)應(yīng)了一個(gè)0的值。當(dāng)然在map里不存在只有key值或是只有value值的情況。所以我們需要記住添加了一個(gè)什么樣的map關(guān)系或是像這個(gè)例子一樣,如何使用它。因?yàn)檫@是個(gè)public變量,所以系統(tǒng)會(huì)自動(dòng)為它生成一個(gè)get方法,類似于:function balances(address _account) returns (uint) {
return balances[_account];
}
通過上面的方法我們可以很容易的查詢一個(gè)賬號(hào)的余額。
event Sent(address from, address to, uint amount);
這一行創(chuàng)建了一個(gè)名為event 的事件。該事件會(huì)在該示例的最后一行被觸發(fā)。用戶或是server應(yīng)用可以花很低的代價(jià)(后面會(huì)講代價(jià)是什么)來監(jiān)聽事件的觸發(fā)。一旦這個(gè)事件被觸發(fā)了,監(jiān)聽者接收到三個(gè)參數(shù):from, to,amount.也是說從哪個(gè)賬號(hào),到哪個(gè)賬號(hào),金額是多少。通過這三個(gè)參數(shù)可以很容易追蹤到具體的交易。為了監(jiān)聽這個(gè)事件,我們需要使用如下代碼:
1 2 3 4 5 6 7 8 9 10 | 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)用系統(tǒng)自動(dòng)生成的balances方法。
Coin方法是構(gòu)造方法,是在合約產(chǎn)生的時(shí)候系統(tǒng)會(huì)調(diào)用,而且之后不允許被調(diào)用。Msg(以及tx和block)是一個(gè)全局變量,保存了可以被區(qū)塊鏈訪問的一些屬性。它持久化了創(chuàng)建合約的節(jié)點(diǎn)的地址。 Msg.sender是值該方法調(diào)用者的地址。
最后,真正完成合約功能的,并且被其他用戶調(diào)用的是mint和send方法。如果mint是被不是創(chuàng)建該合約的賬號(hào)調(diào)用,不會(huì)起任何作用。但是,send可以被任何賬號(hào)(必須有以太幣的賬號(hào))調(diào)用并發(fā)送以太幣給另外一個(gè)賬號(hào)。注意,如果你用合約發(fā)送以太幣到另外一個(gè)賬號(hào),通過區(qū)塊鏈瀏覽器查看是查看不到任何變化的,因?yàn)榘l(fā)送以太幣的過程和金額的變化都被存儲(chǔ)在了特殊的以太幣合約里。而不是體現(xiàn)在賬號(hào)上。通過使用事件,可以很容易的創(chuàng)建一個(gè)區(qū)塊鏈瀏覽器,用來查看交易和賬號(hào)余額。
到此,關(guān)于“Solidity基本代碼舉例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!