Solidity基本代碼舉例分析

這篇文章主要介紹“Solidity基本代碼舉例分析”,在日常操作中,相信很多人在Solidity基本代碼舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Solidity基本代碼舉例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

成都創(chuàng)新互聯(lián)主要業(yè)務有網(wǎng)站營銷策劃、網(wǎng)站制作、做網(wǎng)站、微信公眾號開發(fā)、微信小程序開發(fā)H5技術(shù)、程序開發(fā)等業(yè)務。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶當客戶,還把客戶視為我們的合作伙伴,在開展業(yè)務的過程中,公司還積累了豐富的行業(yè)經(jīng)驗、成都營銷網(wǎng)站建設資源和合作伙伴關系資源,并逐漸建立起規(guī)范的客戶服務和保障體系。 

Solidity是實施智能合約的契約導向的高級語言。它受到C ++,Python和JavaScript的影響,旨在針對以太坊虛擬機(EVM)。

Solidity是靜態(tài)類型的,支持繼承,庫和復雜的用戶定義類型等功能。

1 Solidity智能合約例子

我們從一個基礎的solidity例子開始。開始的時候,你可能看不懂每一行具體的意思,但是沒關系,我們會在后續(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平臺出租出售Q1619668668【www.wkyule.com】該合約用的是0.4.0版本的solidity編寫,并且這些代碼具有向上兼容性。保證不會在不同solidity編譯版本下編譯會出現(xiàn)不同的行為。

從Solidity角度來看,合約就是存在于以太坊區(qū)塊鏈中的一個特定地址中的代碼和數(shù)據(jù)集合。uint storedData 聲明了一個類型為 uint(256位的無符號整型)的變量,變量名稱為 storedData。你可以把它想象為數(shù)據(jù)庫中的一個字段,該字段是可以被數(shù)據(jù)庫中的方法進行查詢,修改。在以太坊中,這個字段是屬于一個合約字段。在這個例子中,該變量可以通過提供的get,set方法進行獲取或是修改。在Solidity中,訪問一個變量是不需要通過this來引用的。

這個合約很簡單,只是允許以太坊上的任何人來存儲一個數(shù)據(jù)到某個節(jié)點,同時把這個操作發(fā)布到以太坊中,當然,以太坊上的其他節(jié)點同樣可以通過調(diào)用set方法來修改你已經(jīng)存儲好的值。雖然有被修改,但是對該值操作的任何歷史記錄都是保存在以太坊中的。不用擔心你的存儲記錄或是修改記錄會丟失。后面我們會將到如何對合約進行限制,只允許你一個人修改這個數(shù)據(jù)。

2 Solidity子貨幣例子

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關鍵字可以讓外部訪問該變量
    address public minter;
    mapping (address => uint) public balances;
    //事件可以讓輕客戶端快速的響應變化
    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);
    }
}

下面的例子將實現(xiàn)一個簡單的加密貨幣例子。無中生幣不在是夢想,當然只有合約的創(chuàng)建人才有這個特權(quán)。此外,任何人只要有一個以太坊密鑰對就可以進行貨幣交易,根本不需要注冊用戶名和密碼。這個合約引入了一些新的概念,讓我們一個個都過一遍。

address public minter;

聲明了一個public,類型為address的狀態(tài)變量。Address類型是一個160位的值,不允許任何的算術(shù)操作。它適合于存儲合約地址或是其他人的密鑰對。Public關鍵字會自動產(chǎn)生用于外部訪問該變量值的方法。如果不聲明public,其他的合約是無法訪問該變量的。自動產(chǎn)生的方法類似于:

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

當然如果你增加了一個和上面完全一樣的方法是沒有任何作用的,我們需要變量和產(chǎn)生的方法名完全一致。這塊其實編譯器會幫助我們完成,不需要我們自己動手編寫,我們只要知道這個概念就可以。

mapping (address => uint) public balances;

還是創(chuàng)建了一個公有狀態(tài)變量,這是一個比address更復雜的數(shù)據(jù)類型,類似java里的Map<address,uint>,它描述了一個地址和一個uinit數(shù)據(jù)類型的map關系。Mappings的關系可以看成是一個hash表,所有可能的key都對應了一個0的值。當然在map里不存在只有key值或是只有value值的情況。所以我們需要記住添加了一個什么樣的map關系或是像這個例子一樣,如何使用它。因為這是個public變量,所以系統(tǒng)會自動為它生成一個get方法,類似于:

function balances(address _account) returns (uint) {

 return balances[_account];

}

通過上面的方法我們可以很容易的查詢一個賬號的余額。

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

這一行創(chuàng)建了一個名為event 的事件。該事件會在該示例的最后一行被觸發(fā)。用戶或是server應用可以花很低的代價(后面會講代價是什么)來監(jiān)聽事件的觸發(fā)。一旦這個事件被觸發(fā)了,監(jiān)聽者接收到三個參數(shù):from, to,amount.也是說從哪個賬號,到哪個賬號,金額是多少。通過這三個參數(shù)可以很容易追蹤到具體的交易。為了監(jiān)聽這個事件,我們需要使用如下代碼:

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)自動生成的balances方法。

Coin方法是構(gòu)造方法,是在合約產(chǎn)生的時候系統(tǒng)會調(diào)用,而且之后不允許被調(diào)用。Msg(以及tx和block)是一個全局變量,保存了可以被區(qū)塊鏈訪問的一些屬性。它持久化了創(chuàng)建合約的節(jié)點的地址。 Msg.sender是值該方法調(diào)用者的地址。

最后,真正完成合約功能的,并且被其他用戶調(diào)用的是mint和send方法。如果mint是被不是創(chuàng)建該合約的賬號調(diào)用,不會起任何作用。但是,send可以被任何賬號(必須有以太幣的賬號)調(diào)用并發(fā)送以太幣給另外一個賬號。注意,如果你用合約發(fā)送以太幣到另外一個賬號,通過區(qū)塊鏈瀏覽器查看是查看不到任何變化的,因為發(fā)送以太幣的過程和金額的變化都被存儲在了特殊的以太幣合約里。而不是體現(xiàn)在賬號上。通過使用事件,可以很容易的創(chuàng)建一個區(qū)塊鏈瀏覽器,用來查看交易和賬號余額。

到此,關于“Solidity基本代碼舉例分析”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

網(wǎng)頁標題:Solidity基本代碼舉例分析
網(wǎng)頁路徑:http://bm7419.com/article0/igopio.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷網(wǎng)站制作、用戶體驗、網(wǎng)站策劃、商城網(wǎng)站、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站