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

    文章

    3859

    浏览量

    61295
  • 以太坊
    +关注

    关注

    14

    文章

    1838

    浏览量

    31697

原文标题:从零开始学区块链(6)--以太坊之智能合约

文章出处:【微信号:AI_shequ,微信公众号:人工智能爱好者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    玩转SQLite7:基本语法与数据类型

    前面几篇文章已经快速了解了SQLite的基本用法以及简单的Pyhton与C语言的API函数的使用。本篇再来全面介绍下SQLite的基本语法与数据类型。
    的头像 发表于 09-26 09:07 1294次阅读
    玩转SQLite7:基本<b class='flag-5'>语法</b>与数据类型

    微雪Arduino系列教程二:Arduino 语法介绍

    轻松上手。那么这里我就简单的注释一下Arduino语法。 Arduin语法的关键字,语法符号,运算符,数据类型都和C语言大同小异,这这里我就不一一详细
    发表于 04-27 19:47

    ETH之SoliditySolidity的简介、安装、使用方法之详细攻略

    ETH之SoliditySolidity的简介、安装、使用方法之详细攻略
    发表于 12-21 10:36

    Shell的基本语法盘点

    这次来介绍一下Shell的基本语法
    发表于 07-09 07:35

    华为编程语法

    华为编程语法介绍
    发表于 06-08 08:40 101次下载

    SQL、LINQ、Lambda语法对照图

    本文档内容介绍了基于SQL、LINQ、Lambda语法对照图,供参考
    发表于 02-27 17:03 8次下载

    以太坊的Solidity是什么

    以太坊的Solidity语言是一种新型财务编程的基础,在这种编程中,您可以创建自己的智能合约。以太坊背后的概念是创造一种新的生态系统,各方可以通过一种近乎完美的去中心化方式彼此沟通,在大多数情况下,中间人被切断。
    发表于 01-17 11:02 2932次阅读

    什么是Solidity正规验证

    Solidity作为一个程序语言,写出来的Smart Contract就跟所有程序一样,有时候会有Bug。然而Smart Contract上的Bug很可能比一般程序中的Bug还要严重,因为一旦放到
    发表于 02-26 10:48 966次阅读
    什么是<b class='flag-5'>Solidity</b>正规验证

    如何写一个Solidity智能合约

    想象一下,你正在写一个Solidity智能合约,其中一个属性可以被描述为类型或状态。换句话说,来自一组有限的选项。你马上对自己说:“太好了,我只会使用枚举类型来表示这个状态变量。”一方面,这种方法有一些好处,比如增加可读性。另一方面,它很容易让你走上一条可能导致问题的棘手道路。
    发表于 09-05 11:17 2387次阅读

    FPGA的语法注释介绍资料免费下载

    本文档的主要内容详细介绍的是FPGA的语法注释介绍资料免费下载。
    发表于 04-25 08:00 2次下载
    FPGA的<b class='flag-5'>语法</b>注释<b class='flag-5'>介绍</b>资料免费下载

    Prel语法与C语言语法的异同综述

    Prel语法与C语言语法的异同综述
    发表于 05-25 11:44 4次下载

    SpinalHDL语法篇之Bool类型

    作为SpinalHDL语法篇的第一节,我们也从最简单的开始。
    的头像 发表于 10-31 10:56 933次阅读

    SpinalHDL语法之Bool类型

    作为SpinalHDL语法篇的第一节,我们也从最简单的开始。 Bool类型定义
    的头像 发表于 05-05 16:01 386次阅读

    javascript的基本语法遵循的标准

    JavaScript是一种脚本语言,用于为网站添加交互性和动态性的功能。它的基本语法遵循ECMAScript标准,这是一种由Ecma国际组织制定的语言标准。本文将详细介绍JavaScript
    的头像 发表于 12-03 11:35 1550次阅读

    oracle case when 语法介绍

    Oracle的CASE WHEN语法是一种在数据库查询中使用的条件语句,它提供了一种在SELECT语句中根据条件对结果进行转换或筛选的方法。在本文中,我们将详细介绍Oracle的CASE WHEN
    的头像 发表于 12-06 10:21 588次阅读