那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡單介紹Solidity的語法

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

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

語法

編譯器版本指定

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

pragma solidity ^0.4.0;

上面的意思這個sol文件需要在0.4.0之后的版本上運行,其中的“^”符號表示不支持0.5.0及之后的版本。

注釋

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

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

變量聲明和常見數據類型

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

枚舉

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

結構體

// 定義一個結構體,包含地址和數量兩個屬性struct Player { address addr; uint amount; }

函數

Solidity中函數的定義語法如下:

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

其中

指函數的參數及類型

{internal|external}這兩個關鍵字規定了函數的調用方式,internal指內部調用,能直接使用上下文環境中的數據; external實現為合約的外部消息調用. 默認是internal.

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

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

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

編譯和執行

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

$ npm install -g truffle

安裝完成后使用truffle init命令進行初始化。

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

truffle會自動下載一個空的項目工程并提供編譯、部署、測試三個命令工具。

項目初始化后目錄結構如下:

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

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

migrations文件夾用來實現部署智能合約的功能;

test文件夾用來存放合約的測試文件;

truffle.js默認配置文件

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

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

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

設置完成后就可以開始實現智能合約了。

一個簡單的HelloWord智能合約大致如下:

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

上面實現了一個輸出“Hello World”的智能合約。在contracts文件夾中新建一個HelloWorld.sol文件,并將上面內容保存到這個文件中。保存完成后目錄結構如下:

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

然后用truffle進行編譯。

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

編譯成功后會當前目錄的build文件夾下生成新的文件。下一步就是將智能合約部署到以太坊網絡上,在migrations文件夾下新建一個,內容如下:

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

保存后當前目錄結構如下:

.├── 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命令進行部署。

$ 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...

到這里,智能合約這部分已經完成了,接下來是給智能合約做個UI,實現一個DApp。

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

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

在index.html中實現了一個簡單文本塊,并將需要的js文件引用進來,內容如下:

Demo

加載中...

頁面上默認顯示“加載中”

在app.js中,將會加載HelloWorld智能合約,加載后調用合約中的函數并修改網頁顯示,文件內容如下:

$(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); // 通過默認的合約地址獲取實例 HelloWorldContract.deployed() .then(function(instance){ // 通過獲取到實例調用函數,這里函數返回的是一個promise對象 instance.renderHelloWorld().then(function(result){ // 更新頁面內容 // $("#content").text(result); }) }).catch(function(err){ console.log(err.message); }) }) });});

以上DApp基本實現完成,然后是它的啟動,這里是lite-server來啟動。

初始化一個package.json

$ npm init

更新package.json內容如下:

{ "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

啟動

$ npm run dev

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62978
  • 以太坊
    +關注

    關注

    14

    文章

    1838

    瀏覽量

    32116

原文標題:從零開始學區塊鏈(6)--以太坊之智能合約

文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    玩轉SQLite7:基本語法與數據類型

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

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

    輕松上手。那么這里我就簡單的注釋一下Arduino語法。 Arduin語法的關鍵字,語法符號,運算符,數據類型都和C語言大同小異,這這里我就不一一詳細
    發表于 04-27 19:47

    ETH之SoliditySolidity的簡介、安裝、使用方法之詳細攻略

    ETH之SoliditySolidity的簡介、安裝、使用方法之詳細攻略
    發表于 12-21 10:36

    華為編程語法

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

    SQL、LINQ、Lambda語法對照圖

    本文檔內容介紹了基于SQL、LINQ、Lambda語法對照圖,供參考
    發表于 02-27 17:03 ?8次下載

    以太坊的Solidity是什么

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

    什么是Solidity正規驗證

    Solidity作為一個程序語言,寫出來的Smart Contract就跟所有程序一樣,有時候會有Bug。然而Smart Contract上的Bug很可能比一般程序中的Bug還要嚴重,因為一旦放到鏈
    發表于 02-26 10:48 ?1117次閱讀
    什么是<b class='flag-5'>Solidity</b>正規驗證

    FPGA的語法注釋介紹資料免費下載

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

    Arduino的語法詳細資料講解

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

    Arduino的語法手冊免費下載

    本文檔的主要內容詳細介紹的是Arduino的語法手冊免費下載。
    發表于 03-07 08:00 ?39次下載

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

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

    SpinalHDL語法篇之Bool類型

    作為SpinalHDL語法篇的第一節,我們也從最簡單的開始。
    的頭像 發表于 10-31 10:56 ?1286次閱讀

    SpinalHDL語法之Bool類型

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

    javascript的基本語法遵循的標準

    JavaScript是一種腳本語言,用于為網站添加交互性和動態性的功能。它的基本語法遵循ECMAScript標準,這是一種由Ecma國際組織制定的語言標準。本文將詳細介紹JavaScript
    的頭像 發表于 12-03 11:35 ?2964次閱讀

    oracle case when 語法介紹

    Oracle的CASE WHEN語法是一種在數據庫查詢中使用的條件語句,它提供了一種在SELECT語句中根據條件對結果進行轉換或篩選的方法。在本文中,我們將詳細介紹Oracle的CASE WHEN
    的頭像 發表于 12-06 10:21 ?1933次閱讀
    百家乐博彩网址| 海王星百家乐官网的玩法技巧和规则 | 张家界市| 筹码百家乐500| 棋牌赚钱| 蓝盾百家乐平台租用| 百家乐官网散台| 二八杠游戏平台| 百家乐官网娱乐求解答| 德州扑克加注规则| 线上百家乐代理| 百家乐官网赌大小| 乐利来国际| 真人百家乐做假| 百家乐官网游戏作弊| 在线玩轮盘| 保时捷百家乐娱乐城| 新百家乐官网.百万筹码| 皇冠网上投注| 百家乐PK| 百家乐官网视| 百家乐官网U盘下载| 大发888洗码| 赌百家乐的方法| 百家乐官网视频游戏聊天| 金逸太阳城团购| 百家乐官网知道| 百家乐官网黑牌靴| 星空棋牌舟山清墩| 包赢百家乐的玩法技巧和规则| 百家乐视频地主| 澳门百家乐官网游戏说明| 扶绥县| 集结号棋牌下载| 威尼斯人娱乐城送彩金| 百家乐境外赌博| 百家乐官网赢钱公式冯耕| 爱博彩| 大发888在线娱乐下载| 优博百家乐yobo88| 济州岛百家乐官网的玩法技巧和规则 |