0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡(jiǎn)單介紹Solidity的語法

lviY_AI_shequ ? 來源:未知 ? 作者:胡薇 ? 2018-05-03 09:25 ? 次閱讀

智能合約本質(zhì)上是一段程序,程序是需要用編程語言來實(shí)現(xiàn)的。和以太坊客戶端一樣,智能合約也有很多語言版本,這里使用的是官方推薦的編程語言Solidity,文件擴(kuò)展名以.sol結(jié)尾。

語法

編譯器版本指定

和其他語言一樣,Solidity語言也是在不斷的發(fā)展和改進(jìn)的,不同的版本支持的功能不同,所以sol文件需要指定版本號(hào),通常在sol文件的第一行需要指定。語法如下:

pragma solidity ^0.4.0;

上面的意思這個(gè)sol文件需要在0.4.0之后的版本上運(yùn)行,其中的“^”符號(hào)表示不支持0.5.0及之后的版本。

注釋

在Solidity中使用“//”表示單行注釋,使用“/.../ ”表示多行注釋

// 這是單行注釋/*這是多行注釋*/

變量聲明和常見數(shù)據(jù)類型

bool b = false; // 布爾類型,默認(rèn)值為falseuint i = 0; // 整型address addr; // 地址類型,這是以太坊中的一個(gè)特殊類型,為20個(gè)字節(jié)的值,用來保存一個(gè)以太坊地址byte32 by; //bytes memory varBy; // 字節(jié)數(shù)組string memory str; // UTF-8字符數(shù)組uint[] memory arr; // 整型數(shù)組mapping(address => uint) public balances; // 映射,相當(dāng)于一個(gè)Hash表

枚舉

enum Color{RED, GREEN, YELLOW}; // 默認(rèn)從0開始Color light;light.RED; // 0light.GREEN; // 1light.YELLOW; // 2

結(jié)構(gòu)體

// 定義一個(gè)結(jié)構(gòu)體,包含地址和數(shù)量?jī)蓚€(gè)屬性struct Player { address addr; uint amount; }

函數(shù)

Solidity中函數(shù)的定義語法如下:

function f() {internal|external} [pure|constant|view|payable] [returns ()] { // function body}

其中

指函數(shù)的參數(shù)及類型

{internal|external}這兩個(gè)關(guān)鍵字規(guī)定了函數(shù)的調(diào)用方式,internal指內(nèi)部調(diào)用,能直接使用上下文環(huán)境中的數(shù)據(jù); external實(shí)現(xiàn)為合約的外部消息調(diào)用. 默認(rèn)是internal.

[pure|constant|view|payable]這四個(gè)關(guān)鍵字用來說明函數(shù)屬性。pure關(guān)鍵字來源于函數(shù)式編程,表明這個(gè)函數(shù)體是一個(gè)純函數(shù)計(jì)算不能調(diào)用其他函數(shù);cosntant關(guān)鍵字在0.4.17版本后將廢棄使用;view關(guān)鍵字表明這個(gè)函數(shù)是只讀的不能修改狀態(tài);如果一個(gè)函數(shù)需要進(jìn)行貨幣操作,必須要帶上payable關(guān)鍵字。

[returns ()]用來指明函數(shù)的返回類型

以上是Solidity語法的簡(jiǎn)單介紹,詳細(xì)內(nèi)容可參看官方教程(http://solidity.readthedocs.io/en/develop/types.html).

編譯和執(zhí)行

智能合約在以太坊上運(yùn)行,需要進(jìn)行編譯和部署。這里推薦使用Truffle工具。Truffle是針對(duì)基于以太坊的Solidity語言的一套開發(fā)框架。本身基于Javascript。它集成了智能合約的開發(fā),測(cè)試,部署,以及一個(gè)交互式的命令行功能,極大的方便了調(diào)試開發(fā)。Truffle的安裝命令如下:

$ npm install -g truffle

安裝完成后使用truffle init命令進(jìn)行初始化。

$ truffle init Downloading...Unpacking...Setting up...Unbox successful. Sweet!Commands: Compile: truffle compile Migrate: truffle migrate Test contracts: truffle test

truffle會(huì)自動(dòng)下載一個(gè)空的項(xiàng)目工程并提供編譯、部署、測(cè)試三個(gè)命令工具。

項(xiàng)目初始化后目錄結(jié)構(gòu)如下:

.├── contracts │ └── Migrations.sol├── migrations│ └── 1_initial_migration.js├── test├── truffle-config.js└── truffle.js

其中contracts文件夾是用來存放智能合約的地方;

migrations文件夾用來實(shí)現(xiàn)部署智能合約的功能;

test文件夾用來存放合約的測(cè)試文件;

truffle.js默認(rèn)配置文件

truffle-config.jsWindows下默認(rèn)配置文件名與truffle沖突,可使用該文件解決

項(xiàng)目初始化后需要修改配置文件,本文中使用了Ganache, 設(shè)置為本地的8545端口,修改truffle.js文件如下:

module.exports = { networks: { development: { host: "127.0.0.1", port: 8545, network_id: "*" // Match any network id } }};

設(shè)置完成后就可以開始實(shí)現(xiàn)智能合約了。

一個(gè)簡(jiǎn)單的HelloWord智能合約大致如下:

pragma solidity ^0.4.16;contract HelloWorld { function renderHelloWorld() public pure returns (string) { return "Hello World"; }}

上面實(shí)現(xiàn)了一個(gè)輸出“Hello World”的智能合約。在contracts文件夾中新建一個(gè)HelloWorld.sol文件,并將上面內(nèi)容保存到這個(gè)文件中。保存完成后目錄結(jié)構(gòu)如下:

.├── contracts│ ├── HelloWorld.sol│ └── Migrations.sol├── migrations│ └── 1_initial_migration.js├── test├── truffle-config.js└── truffle.js

然后用truffle進(jìn)行編譯。

$ truffle compileCompiling ./contracts/HelloWorld.sol...Compiling ./contracts/Migrations.sol...Writing artifacts to ./build/contracts

編譯成功后會(huì)當(dāng)前目錄的build文件夾下生成新的文件。下一步就是將智能合約部署到以太坊網(wǎng)絡(luò)上,在migrations文件夾下新建一個(gè),內(nèi)容如下:

var HelloWorld = artifacts.require("HelloWorld"); // 獲取HelloWorld合約 module.exports = function(deployer) { deployer.deploy(HelloWorld); // 部署到以太坊上};

保存后當(dāng)前目錄結(jié)構(gòu)如下:

.├── build│ └── contracts│ ├── HelloWorld.json│ └── Migrations.json├── contracts│ ├── HelloWorld.sol│ └── Migrations.sol├── migrations│ ├── 1_initial_migration.js│ └── 2_deploy_contracts.js├── test├── truffle-config.js└── truffle.js

使用truffle migrate命令進(jìn)行部署。

$ truffle migrate Using network 'development'.Running migration: 1_initial_migration.js Deploying Migrations... ... 0x023e8ae8837ea28c9672f2adfba4f8a693bdb0483c4dd44bc69946e8f2a33b36 Migrations: 0x45482a119882930486c0dd210dff81e0eb451fa2Saving successful migration to network... ... 0xec903ccaee280965b6ec3172df382efb614f798ae31c66a167554e02191d3000Saving artifacts...Running migration: 2_deploy_contracts.js Deploying HelloWorld... ... 0x6f6e5e213cf109d6780eca1d687b8cd04efcc4ce4c7682c2c1e84a7be4f8b4da HelloWorld: 0x5878837601cb2d5da7190c4c42f6a5399ca96784Saving successful migration to network... ... 0xf815aba07df8a2e9981ea2360c3f37abf01d6ec61059329aa8a4d36b912fc5c5Saving artifacts...

到這里,智能合約這部分已經(jīng)完成了,接下來是給智能合約做個(gè)UI,實(shí)現(xiàn)一個(gè)DApp。

在當(dāng)前目錄下新建一個(gè)app的文件夾,然后在該文件夾中創(chuàng)建index.html,app.js 這兩個(gè)文件, 再把前面編譯生成的文件HelloWorld.json拷貝到這里(build目錄下)。另外需要下載幾個(gè)js庫,一個(gè)是常用的jquery.js, 一個(gè)是用來與以太坊節(jié)點(diǎn)交互的web3.js(它通過RPC的方式與節(jié)點(diǎn)進(jìn)行通信),還有一個(gè)是truffle-contract.js, 它是對(duì)智能合約的js封裝。app的目錄結(jié)構(gòu)如下:

.├── HelloWorld.json├── app.js├── index.html└── js ├── jquery.min.js ├── truffle-contract.js └── web3.min.js

在index.html中實(shí)現(xiàn)了一個(gè)簡(jiǎn)單文本塊,并將需要的js文件引用進(jìn)來,內(nèi)容如下:

Demo

加載中...

頁面上默認(rèn)顯示“加載中”

在app.js中,將會(huì)加載HelloWorld智能合約,加載后調(diào)用合約中的函數(shù)并修改網(wǎng)頁顯示,文件內(nèi)容如下:

$(function() { $(window).load(function() { // 初始化web3,使用本地的8545端口 var web3Provider = new Web3.providers.HttpProvider('http://localhost:8545'); // 獲取智能合約的ABI(Application Binary Interface)文件 $.getJSON('HelloWorld.json', function(data){ var HelloWorldArtifact = data; // 初始化智能合約 HelloWorldContract = TruffleContract(HelloWorldArtifact); HelloWorldContract.setProvider(web3Provider); // 通過默認(rèn)的合約地址獲取實(shí)例 HelloWorldContract.deployed() .then(function(instance){ // 通過獲取到實(shí)例調(diào)用函數(shù),這里函數(shù)返回的是一個(gè)promise對(duì)象 instance.renderHelloWorld().then(function(result){ // 更新頁面內(nèi)容 // $("#content").text(result); }) }).catch(function(err){ console.log(err.message); }) }) });});

以上DApp基本實(shí)現(xiàn)完成,然后是它的啟動(dòng),這里是lite-server來啟動(dòng)。

初始化一個(gè)package.json

$ npm init

更新package.json內(nèi)容如下:

{ "name": "pet-shop", "version": "1.0.0", "description": "", "main": "truffle.js", "directories": { "test": "test"}, "scripts": { "dev": "lite-server", "test": "echo "Error: no test specified" && exit 1"}, "author": "", "license": "ISC", "devDependencies": { "lite-server": "^2.3.0"}}

安裝lite-server

$ npm install

啟動(dòng)

$ npm run dev

打開瀏覽器,訪問localhost:3000就可以看到如下效果。

這只是一個(gè)簡(jiǎn)單的智能合約示例,只是輸出了一個(gè)“Hello World”字符串,實(shí)際上智能合約中還要涉及到虛擬貨幣的消耗和交易。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4256

    瀏覽量

    62223
  • 以太坊
    +關(guān)注

    關(guān)注

    14

    文章

    1838

    瀏覽量

    31851

原文標(biāo)題:從零開始學(xué)區(qū)塊鏈(6)--以太坊之智能合約

文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    玩轉(zhuǎn)SQLite7:基本語法與數(shù)據(jù)類型

    前面幾篇文章已經(jīng)快速了解了SQLite的基本用法以及簡(jiǎn)單的Pyhton與C語言的API函數(shù)的使用。本篇再來全面介紹下SQLite的基本語法與數(shù)據(jù)類型。
    的頭像 發(fā)表于 09-26 09:07 ?1663次閱讀
    玩轉(zhuǎn)SQLite7:基本<b class='flag-5'>語法</b>與數(shù)據(jù)類型

    微雪Arduino系列教程二:Arduino 語法介紹

    輕松上手。那么這里我就簡(jiǎn)單的注釋一下Arduino語法。 Arduin語法的關(guān)鍵字,語法符號(hào),運(yùn)算符,數(shù)據(jù)類型都和C語言大同小異,這這里我就不一一詳細(xì)
    發(fā)表于 04-27 19:47

    ETH之SoliditySolidity的簡(jiǎn)介、安裝、使用方法之詳細(xì)攻略

    ETH之SoliditySolidity的簡(jiǎn)介、安裝、使用方法之詳細(xì)攻略
    發(fā)表于 12-21 10:36

    華為編程語法

    華為編程語法介紹
    發(fā)表于 06-08 08:40 ?101次下載

    SQL、LINQ、Lambda語法對(duì)照?qǐng)D

    本文檔內(nèi)容介紹了基于SQL、LINQ、Lambda語法對(duì)照?qǐng)D,供參考
    發(fā)表于 02-27 17:03 ?8次下載

    以太坊的Solidity是什么

    以太坊的Solidity語言是一種新型財(cái)務(wù)編程的基礎(chǔ),在這種編程中,您可以創(chuàng)建自己的智能合約。以太坊背后的概念是創(chuàng)造一種新的生態(tài)系統(tǒng),各方可以通過一種近乎完美的去中心化方式彼此溝通,在大多數(shù)情況下,中間人被切斷。
    發(fā)表于 01-17 11:02 ?2996次閱讀

    什么是Solidity正規(guī)驗(yàn)證

    Solidity作為一個(gè)程序語言,寫出來的Smart Contract就跟所有程序一樣,有時(shí)候會(huì)有Bug。然而Smart Contract上的Bug很可能比一般程序中的Bug還要嚴(yán)重,因?yàn)橐坏┓诺芥?/div>
    發(fā)表于 02-26 10:48 ?1061次閱讀
    什么是<b class='flag-5'>Solidity</b>正規(guī)驗(yàn)證

    FPGA的語法注釋介紹資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是FPGA的語法注釋介紹資料免費(fèi)下載。
    發(fā)表于 04-25 08:00 ?2次下載
    FPGA的<b class='flag-5'>語法</b>注釋<b class='flag-5'>介紹</b>資料免費(fèi)下載

    Arduino的語法詳細(xì)資料講解

    本文檔的主要內(nèi)容詳細(xì)介紹的是Arduino的語法詳細(xì)資料講解。
    發(fā)表于 04-26 08:00 ?4次下載
    Arduino的<b class='flag-5'>語法</b>詳細(xì)資料講解

    Arduino的語法手冊(cè)免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Arduino的語法手冊(cè)免費(fèi)下載。
    發(fā)表于 03-07 08:00 ?37次下載

    Prel語法與C語言語法的異同綜述

    Prel語法與C語言語法的異同綜述
    發(fā)表于 05-25 11:44 ?6次下載

    SpinalHDL語法篇之Bool類型

    作為SpinalHDL語法篇的第一節(jié),我們也從最簡(jiǎn)單的開始。
    的頭像 發(fā)表于 10-31 10:56 ?1190次閱讀

    SpinalHDL語法之Bool類型

    作為SpinalHDL語法篇的第一節(jié),我們也從最簡(jiǎn)單的開始。 Bool類型定義
    的頭像 發(fā)表于 05-05 16:01 ?567次閱讀

    javascript的基本語法遵循的標(biāo)準(zhǔn)

    JavaScript是一種腳本語言,用于為網(wǎng)站添加交互性和動(dòng)態(tài)性的功能。它的基本語法遵循ECMAScript標(biāo)準(zhǔn),這是一種由Ecma國(guó)際組織制定的語言標(biāo)準(zhǔn)。本文將詳細(xì)介紹JavaScript
    的頭像 發(fā)表于 12-03 11:35 ?2598次閱讀

    oracle case when 語法介紹

    Oracle的CASE WHEN語法是一種在數(shù)據(jù)庫查詢中使用的條件語句,它提供了一種在SELECT語句中根據(jù)條件對(duì)結(jié)果進(jìn)行轉(zhuǎn)換或篩選的方法。在本文中,我們將詳細(xì)介紹Oracle的CASE WHEN
    的頭像 發(fā)表于 12-06 10:21 ?1503次閱讀