智能合約本質(zhì)上是一段程序,程序是需要用編程語言來實現(xiàn)的。和以太坊客戶端一樣,智能合約也有很多語言版本,這里使用的是官方推薦的編程語言Solidity,文件擴展名以.sol結(jié)尾。
語法
編譯器版本指定
和其他語言一樣,Solidity語言也是在不斷的發(fā)展和改進的,不同的版本支持的功能不同,所以sol文件需要指定版本號,通常在sol文件的第一行需要指定。語法如下:
pragma solidity ^0.4.0;
上面的意思這個sol文件需要在0.4.0之后的版本上運行,其中的“^”符號表示不支持0.5.0及之后的版本。
注釋
在Solidity中使用“//”表示單行注釋,使用“/.../ ”表示多行注釋
// 這是單行注釋/*這是多行注釋*/
變量聲明和常見數(shù)據(jù)類型
bool b = false; // 布爾類型,默認(rèn)值為falseuint i = 0; // 整型address addr; // 地址類型,這是以太坊中的一個特殊類型,為20個字節(jié)的值,用來保存一個以太坊地址byte32 by; //bytes memory varBy; // 字節(jié)數(shù)組string memory str; // UTF-8字符數(shù)組uint[] memory arr; // 整型數(shù)組mapping(address => uint) public balances; // 映射,相當(dāng)于一個Hash表
枚舉
enum Color{RED, GREEN, YELLOW}; // 默認(rèn)從0開始Color light;light.RED; // 0light.GREEN; // 1light.YELLOW; // 2
結(jié)構(gòu)體
// 定義一個結(jié)構(gòu)體,包含地址和數(shù)量兩個屬性struct Player { address addr; uint amount; }
函數(shù)
Solidity中函數(shù)的定義語法如下:
function f(
其中
{internal|external}這兩個關(guān)鍵字規(guī)定了函數(shù)的調(diào)用方式,internal指內(nèi)部調(diào)用,能直接使用上下文環(huán)境中的數(shù)據(jù); external實現(xiàn)為合約的外部消息調(diào)用. 默認(rèn)是internal.
[pure|constant|view|payable]這四個關(guān)鍵字用來說明函數(shù)屬性。pure關(guān)鍵字來源于函數(shù)式編程,表明這個函數(shù)體是一個純函數(shù)計算不能調(diào)用其他函數(shù);cosntant關(guān)鍵字在0.4.17版本后將廢棄使用;view關(guān)鍵字表明這個函數(shù)是只讀的不能修改狀態(tài);如果一個函數(shù)需要進行貨幣操作,必須要帶上payable關(guān)鍵字。
[returns (
以上是Solidity語法的簡單介紹,詳細(xì)內(nèi)容可參看官方教程(http://solidity.readthedocs.io/en/develop/types.html).
編譯和執(zhí)行
智能合約在以太坊上運行,需要進行編譯和部署。這里推薦使用Truffle工具。Truffle是針對基于以太坊的Solidity語言的一套開發(fā)框架。本身基于Javascript。它集成了智能合約的開發(fā),測試,部署,以及一個交互式的命令行功能,極大的方便了調(diào)試開發(fā)。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會自動下載一個空的項目工程并提供編譯、部署、測試三個命令工具。
項目初始化后目錄結(jié)構(gòu)如下:
.├── contracts │ └── Migrations.sol├── migrations│ └── 1_initial_migration.js├── test├── truffle-config.js└── truffle.js
其中contracts文件夾是用來存放智能合約的地方;
migrations文件夾用來實現(xiàn)部署智能合約的功能;
test文件夾用來存放合約的測試文件;
truffle.js默認(rèn)配置文件
truffle-config.jsWindows下默認(rèn)配置文件名與truffle沖突,可使用該文件解決
項目初始化后需要修改配置文件,本文中使用了Ganache, 設(shè)置為本地的8545端口,修改truffle.js文件如下:
module.exports = { networks: { development: { host: "127.0.0.1", port: 8545, network_id: "*" // Match any network id } }};
設(shè)置完成后就可以開始實現(xiàn)智能合約了。
一個簡單的HelloWord智能合約大致如下:
pragma solidity ^0.4.16;contract HelloWorld { function renderHelloWorld() public pure returns (string) { return "Hello World"; }}
上面實現(xiàn)了一個輸出“Hello World”的智能合約。在contracts文件夾中新建一個HelloWorld.sol文件,并將上面內(nèi)容保存到這個文件中。保存完成后目錄結(jié)構(gòu)如下:
.├── 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
編譯成功后會當(dāng)前目錄的build文件夾下生成新的文件。下一步就是將智能合約部署到以太坊網(wǎng)絡(luò)上,在migrations文件夾下新建一個,內(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命令進行部署。
$ 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)完成了,接下來是給智能合約做個UI,實現(xiàn)一個DApp。
在當(dāng)前目錄下新建一個app的文件夾,然后在該文件夾中創(chuàng)建index.html,app.js 這兩個文件, 再把前面編譯生成的文件HelloWorld.json拷貝到這里(build目錄下)。另外需要下載幾個js庫,一個是常用的jquery.js, 一個是用來與以太坊節(jié)點交互的web3.js(它通過RPC的方式與節(jié)點進行通信),還有一個是truffle-contract.js, 它是對智能合約的js封裝。app的目錄結(jié)構(gòu)如下:
.├── HelloWorld.json├── app.js├── index.html└── js ├── jquery.min.js ├── truffle-contract.js └── web3.min.js
在index.html中實現(xiàn)了一個簡單文本塊,并將需要的js文件引用進來,內(nèi)容如下:
頁面上默認(rèn)顯示“加載中”
在app.js中,將會加載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)的合約地址獲取實例 HelloWorldContract.deployed() .then(function(instance){ // 通過獲取到實例調(diào)用函數(shù),這里函數(shù)返回的是一個promise對象 instance.renderHelloWorld().then(function(result){ // 更新頁面內(nèi)容 // $("#content").text(result); }) }).catch(function(err){ console.log(err.message); }) }) });});
以上DApp基本實現(xiàn)完成,然后是它的啟動,這里是lite-server來啟動。
初始化一個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
啟動
$ npm run dev
打開瀏覽器,訪問localhost:3000就可以看到如下效果。
這只是一個簡單的智能合約示例,只是輸出了一個“Hello World”字符串,實際上智能合約中還要涉及到虛擬貨幣的消耗和交易。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4307瀏覽量
62432 -
以太坊
+關(guān)注
關(guān)注
14文章
1838瀏覽量
31909
原文標(biāo)題:從零開始學(xué)區(qū)塊鏈(6)--以太坊之智能合約
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論