1. 程式人生 > >如何編寫一個簡單的智慧合約(Smart Contract)

如何編寫一個簡單的智慧合約(Smart Contract)

使用solidity語言編寫智慧合約

Ethereum 上的智慧合約需要使用 solidity 語言編寫。雖然還有其他能用來撰寫智慧合約的語言如 Serpent (類 Python )、lll (類 Fortran),但是目前看到所有公開的智慧合約都是使用solidity撰寫。
宣傳上說,solidity是一種類JavaScript的語言,而且圍繞solidity的各種開發工具鏈,都是使用屬於JavaScript生態系統的npm來提供的,但是solidity還是比較像Java或從c#.因為和JavaScript不同,solidity與Java或C#同屬於強型別(Strong Type,在定義變數時需要制定型別)語言 ,在定義函式(function)時同樣需要指定回傳的型別(type)、同樣也需要先變異才能執行,這些特性都是JavaScript所不具備的。

開發前的準備

當前最活躍的智慧合約開發框架trffle為基礎來開發的,ENS(Ethereum Name Service) 也是採用truffle 框架,其他選擇還有embark等

就像一般網站或App一樣,在提供公共服務之前,開發者會在自己用於寫程式的電腦(又稱本機)或通過穿透測試網路來測試程式執行的效果,測試完成後,才會部署到公開的網路上提供服務。開發區塊鏈智慧合約(程式)的過程也是如此。特別是公開鏈上所有的寫入或者讀取計算結果的操作都是需要真金白銀的(虛擬代幣)。而且根據網路狀況,每個公開鏈上的操作都需要一段反應時間(15秒~ 數分鐘),這些等待非常浪費開發時間,因為在開發的過程中,我們將會使用testrpc工具在電腦上模擬智慧合約所需的以太坊記憶體塊鏈測試環境。

testrpc 中也包含了 JavaScript 版本的 Ethereum 虛擬機器 (Ethereum Vartual Machine),因此可以完成執行智慧合約。

此外,開發前的環境準備一個編輯器,推薦使用Atom配搭solidity外掛來開發,solidity外掛除了支援語法高亮之外,也會透過Solium檢查並提示基本的語法錯誤,相當方便,其他編輯器應該也有類似的外掛可選擇。

安裝所需的工具

首先在開發機上安裝好Node.js,在使用以下命令安裝所需的工具

    $ sudo npm install -g truffle


建立truffle 專案

$ 
truffle init

這裡使用的是atom開發工具,開啟當前專案

 $ atom ./

當前的目錄結構如下

輸入truffle develop進入develop控制檯,並建立賬號

[email protected]  ~/Solidity_WorkSpace/1110/demo1  truffle develop
Truffle Develop started at http://127.0.0.1:9545/

Accounts:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de

Private Keys:
(0) c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3
(1) ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f
(2) 0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8ad91193c05875ef1
(3) c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd85da83b71f772aa6c
(4) 388c684f0ba1ef5017716adb5d21a053ea8e90277d0868337519f97bede61418
(5) 659cbb0e2411a44db63778987b1e22153c086a95eb6b18bdf89de078917abc63
(6) 82d052c865f5763aad42add438569276c00d3d88a2d062d36b2bae914d58b8c8
(7) aa3680d5d48a8283413f7a108367c7299ca73f553735860a87b08f39395618b7
(8) 0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07700d8669ff12b7c4
(9) 8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362dcae9012b548b1e5

Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat

⚠️  Important ⚠️  : This mnemonic was created for you by Truffle. It is not secure.
Ensure you do not use it on production blockchains, or else you risk losing funds.

新建一個簡單的測試合約 JackyContract

pragma solidity ^0.4.23;

contract JackyContract {

  function addAToB(uint a, uint b) pure public returns (uint) {
    return a + b;
  }
}

輸入編譯命令

truffle(develop)> compile

在atom中,產生了一個bulid資料夾,(重寫編寫最好把build資料夾刪除)

編譯完之後,會在build資料夾產生對應的json檔案。

編寫測試用例

test目錄下,新建一個TestJackyContract.sol檔案

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/JackyContract.sol";

contract TestJackyContract {
  function testJackyAdd() {
    JackyContract jackyContract = JackyContract(DeployedAddresses.JackyContract());

    Assert.equal(jackyContract.addAToB(1,3),4,"1 + 3 should be 4");
  }

}

然後在truffle develop控制檯輸入test

效果圖如下,說明測試通過

如果測試不通過將顯示下圖資訊

部署

migration檔案下,建立一個js部署檔案,注意的是開頭一定要以數字開頭的

migration目錄下新建部署指令碼2_deployed_jacky.js

var JackyContract = artifacts.require("./JackyContract.sol");

module.exports = function(deployer) {
  deployer.deploy(JackyContract);
};

然後在truffle develop控制檯輸入 migrate

其中的JackyContract就是我們部署的合約地址

JackyContract: 0x4e72770760c011647d4873f60a3cf6cdea896cd8

接下來我們驗證一下是否與部署的位元組碼相同,呼叫web3獲取位元組碼,與json檔案中的位元組碼是相同的。

truffle(develop)> web3.eth.getCode('0x4e72770760c011647d4873f60a3cf6cdea896cd8')
'0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680637c329899146044575b600080fd5b348015604f57600080fd5b5060766004803603810190808035906020019092919080359060200190929190505050608c565b6040518082815260200191505060405180910390f35b60008183019050929150505600a165627a7a723058209a73f7769aa3866b57fc9f39b67383c1f87f9c082db63a71d5d0f4b7574dc1530029'

獲取合約的例項

let contract

JackyContract.deployed().then(instance => contract = instance

控制機輸入 變數contract 可以看見相關的合約,獲取到合約例項就可以呼叫裡面的方法了

contract.addAToB(3,2)

合約互動

ps:這裡需要注意的是,如果function 加了 pure 或者是 constant 就可以直接呼叫,但是沒有加 pure,呼叫的時候還需要call

相關推薦

如何編寫一個簡單智慧合約Smart Contract

使用solidity語言編寫智慧合約 Ethereum 上的智慧合約需要使用 solidity 語言編寫。雖然還有其他能用來撰寫智慧合約的語言如 Serpent (類 Python )、lll (類 Fortran),但是目前看到所有公開的智慧合約都是使用so

編寫一個簡單的記事本C#實現

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Syste

編寫一個簡單的NotePad開啟儲存退出

參考:韓順平 循序漸進學Java ,從入門到精通 一、需要用到的知識:1.Java IO 流:IO 流主要分為兩類:位元組流 和 字元流從檔案讀入記憶體為輸入流,從記憶體寫到檔案中為輸出流需要了解更深入請移步到該部落格 點選開啟連結2.Java圖形介面    1.選單    

HyperLeger Fabric開發——HyperLeger Fabric智慧合約鏈碼

HyperLeger Fabric開發(六)——HyperLeger Fabric智慧合約(ChainCode) 一、鏈碼(Chaincode)簡介 1、鏈碼簡介 在Fabric中,智慧合約也稱為鏈碼(chaincode),分為使用者鏈碼和系統鏈碼。系統鏈碼用來實現系統層面的功能,包括系統的配置,使用者

BZOJ5016 Snoi2017一個簡單的詢問莫隊

string 莫隊 ace cst truct print bsp for har   容易想到區間轉化成前綴和。這樣每個詢問有了二維坐標,莫隊即可。 #include<iostream> #include<cstdio> #include<

實現智慧指標Smart Pointer

#ifndef SMARTPTR_H_ #define SMARTPTR_H_ template<typename T> struct SmartPtr { explicit Smart

用python編寫一個屏保程式背單詞

大家好,我是一名即將畢業的大學生,第一次在CSDN上發表文章,之前在其他的部落格上也寫過,但是總的來說,這個平臺的資源要多一些(個人覺得),所以有很多不懂的地方希望大家多多指教。 今天我要給大家分享的是一款自己寫的屏保程式,大學嘛大家最頭疼的就是四六級的考試了,上次考試做閱讀的時候,情不

ENS 域名註冊表智慧合約ENSRegistry.sol解析

ENS 登錄檔合約是 ENS 系統中的核心合約,瞭解這個合約可以敲開我們理解 ENS 域名系統的大門。 開啟下面的摺疊區域可以檢視用 Solidity 語言編寫的詳細程式碼。當前部署在以太坊中的 ENS 登錄檔合約是用 LLL 語言編寫的(ENS 最早採用 LLL 語言的原因),但因為 LLL 語言的可讀性很

Android簡單編寫一個txt閱讀器沒有處理字符編碼,適用於新手學習

選項 tro 源碼 tin open 打開文件 package idt pac   本程序只是使用了一些基本的知識點編寫了一個比較簡單粗陋的txt文本閱讀器,效率不高,只適合新手練習。所以大神勿噴。   其實想到編寫這種程序源自本人之前喜歡看小說,而很多小說更新太慢,所以本

通過執行緒編寫一個簡單的併發伺服器

概述 之前在上一節通過使用fork來實現了一個併發程式,它很經典但是效率不高主要是太消耗資源因為fork一個程序的開銷很大,假如100客戶端連線就需要100個程序,這樣不是不可以只是這種方式不太高階,下面我們通過使用執行緒來實現併發,因為產生一個執行緒的開銷要小的多,當然對於大規模併發的場景使用執行緒也不是最

第一行程式碼:以太坊3-使用更多的工具編寫和測試智慧合約

在上文中已經使用了Remix環境執行和測試了本書編寫的第一個智慧合約程式,不過編寫和測試智慧合約的測試方式很多,例如,在testrpc環境測試;在Intellij IDEA整合開發環境中用Solidity語言編寫智慧合約;在純Web環境中測試智慧合約;使用AJAX方式測試智慧合約等。本文將詳細介紹這些

區塊鏈開發學習--使用solidity編寫第一個智慧合約

上一篇講到如何安裝以太坊客戶端Geth,安裝好後很好奇如何往節點上部署一個合約,本文一起走一下流程; (1)登陸http://remix.ethereum.org/                remix 是

Nginx原始碼分析與實踐---編寫一個簡單的Http模組

在上一節中,我們通過修改配置檔案,便能讓nginx去訪問我們寫的html檔案,並返回給瀏覽器。問題是:nginx是如何檢測到我們寫的配置項的?檢測到後,nginx又是如何知道該進行什麼操作的? 本節通過親自實踐,寫一個經典的Hello World模組來了解相應的流程是如何進行的。我們採用自上

ROS 編寫一個簡單的釋出者和訂閱者C++

0 編寫釋出者節點 節點是在ROS裡面的一個專業術語,它可以被ROS的網路所連結。在這裡我們將建立一個名叫“talker”的釋出者節點,它將連續的廣播一個訊息。 改變你現在的位置到你之前在catkin 工作區域裡建立的beginner_tutorials 包。 0.1 程

ROS學習--十二編寫一個簡單的釋出器publisher

1.mkdir -p ~/catkin_ws/src/beginner_tutorials/src 先在beginner_tutorials下建立一個src。 -p的意思是如果路徑中有不存在的資料夾,則建立 2。在新建的資料夾裡面新建cpp檔案,talker

程式碼:編寫一個簡單的字元裝置驅動自動建立裝置檔案

說明: (1)該篇在上篇的基礎上實現了自動建立裝置檔案的功能; (2)自動建立檔案主要用到了class_create()、device_create()兩個函式,宣告在inclue/linux/device.h裡; (3)裝置檔案的建立和銷燬放在模組載入和解除安裝函式中;

基於星雲鏈的智慧合約與Dapp——編寫並執行智慧合約

一般智慧合約需要以下幾個步驟: 1.編寫智慧合約 2.部署智慧合約 3.呼叫智慧合約,驗證合約執行結果 編寫智慧合約 Nebulas實現了NVM虛擬機器來執行智慧合約,NVM的實現使用了JavaScript V8引擎,所以我們可以使用JavaScr

java學習筆記之使用MyEclipse編寫一個簡單的登陸界

使用MyEclipse編寫一個簡單的網頁。 要求:有一個簡單的登陸介面。可以驗證使用者名稱是否為admin,密碼為123。當結果正確時,跳往另外一個介面。 1、首先新建一個web project。 2、在webroot目錄下新建一個jsp檔案。 程式碼如下: <%@

如何編寫一個簡單的Linux驅動——完善裝置驅動

前期知識   1.如何編寫一個簡單的Linux驅動(一)——驅動的基本框架   2.如何編寫一個簡單的Linux驅動(二)——裝置操作集file_operations 前言   在上一篇文章中,我們編寫裝置驅動遇到了不少問題:   (1) 註冊裝置時,裝置號需要程式設計師給定,每次編寫驅動時,程式設計師需要知

【原】shell編寫一個簡單的jmeter自動化壓測腳本

image tac vbo 用戶數 osx dot png das uvc 在公司做壓力測試也挺長時間了,每次測試前環境數據準備都需要話費較長時間,所以一直在考慮能不能將整個過程實現自動化進行,於是就抽空寫了一個自動化腳本,當然這個腳本目前功能十分簡陋,代碼也不完善,很有很