区块链开发之Solidity编程基础(一)

本文介绍了Solidity,一种用于编写以太坊智能合约的静态类型语言,强调了其作为EVM执行环境的基础。文章涵盖sol文件结构、编译开发过程、如何引入其他文件,以及注释的使用。重点讲解了Solidity中的合约概念,包括状态变量、各种类型(如布尔、整型、地址、字节数组、枚举、函数类型)以及引用类型。此外,还探讨了数据存储位置和数据传递方式。
摘要由CSDN通过智能技术生成

概要

由ETH为代表的第二代区块链技术,相比于第一代区块链技术而言,最大的特点就是智能合约的出现,让去中心化应用成为了可能。ETH节点为智能合约提供运行环境:EVM(Ethereum Virtual Machine)以太坊虚拟机。EVM是一个动态运行沙盒,可以将以太坊上所有的智能合约和周围环境全部隔离。因此,EVM上运行的智能合约无法访问网络、文件系统或者在EVM上运行的其他进程。

Solidity是一个基于合约高级编程语言,它是静态类型语言,支持继承、库和复杂的用户定义两类型等功能。它可以被编译成EVM的汇编语言,从而被链上的节点所执行。其他语言还有Serpent、Vyper和LLL,同样可被编程成EVM的汇编语言从而在其节点上运行。

solidity的IDE环境可使用:Remix

sol文件结构

编译开发

pragma关键字沿用c、c++编译指令概念。

pragma solidity ^0.4.0;

以上指令表明编译器版本需要高于0.4.0才可编译。

pragma solidity >= 0.4.22 < 0.6.0;

可以使用更复杂的规则来指定编译器的版本,表达式遵循 npm 版本语义。

引入其他文件

1、全局引入:

import "filename";

2、自定义命名空间
此语句将从 “filename” 中导入所有的全局符号到当前全局作用域中(不同于 ES6,Solidity 是向后兼容的)。

import * as symbolName from "filename";

…创建一个新的全局符号 symbolName,其成员均来自 “filename” 中全局符号。

另一种语法不属于 ES6,但或许更简便:

import "filename" as symbolName;

3、多包引入

import {
   symbol1 as alias, symbol2} from "filename";

创建新的全局符号 alias 和 symbol2,分别从 “filename” 引用 symbol1 和 symbol2 。

4、路径
上文中的 filename 总是会按路径来处理,以 /作为目录分割符、以 . 标示当前目录、以 ..表示父目录。 当 ... 后面跟随的字符是 / 时,它们才能被当做当前目录或父目录。 只有路径以当前目录 . 或父目录 .. 开头时,才能被视为相对路径

import "./x" as x; 语句导入当前源文件同目录下的文件 x 。 如果用 import "x" as x; 代替,可能会引入不同的文件(在全局 include directory 中)。

Remix 提供一个为 github 源代码平台的自动重映射,它将通过网络自动获取文件: 比如,你可以使用 import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping; 导入一个 map 迭代器。

关于编译器的路径配置可以根据自己的编译器进行查找

注释

代码注释

// 这是一个单行注释。

/*
这是一个
多行注释。
*/

文档注释

pragma solidity ^0.4.0;

/** @title 形状计算器。 */
contract shapeCalculator {
   
    /** @dev 求矩形表明面积与周长。
    * @param w 矩形宽度。
    * @param h 矩形高度。
    * @return s 求得表面积。
    * @return p 求得周长。
    */
    function rectangle(uint w, uint h) returns (uint s, uint p) {
   
        s = w * h;
        p = 2 * (w + h);
    }
}

合约

在 Solidity 中,合约类似于面向对象编程语言中的类。 每个合约中可以包含 状态变量、 函数、 函数修饰器、事件、 结构类型、 和 枚举类型 的声明,且合约可以从其他合约继承。

采用关键字 contract声明

pragma solidity ^0.4.0;

contract ContractExample{
   
   
}

状态变量

状态变量是永久地存储在合约存储中的值,在合约里声明而不属于任何函数的都是状态变量。

pragma solidity ^0.4.0;

contract SimpleStorage {
   
    uint storedData; // 状态变量
    // ...
}

类型

Solidity 是一种静态类型语言,这意味着每个变量(状态变量和局部变量)都需要在编译时指定变量的类型(或至少可以推导出变量类型 – 类型推导)。 Solidity 提供了几种基本类型,可以用来组合出复杂类型。

值类型

以下类型也称为值类型,因为这些类型的变量将始终按值来传递。 也就是说,当这些变量被用作函数参数或者用在赋值语句中时,总会进行值拷贝

1、 布尔类型

bool :可能的取值为字面常数值 truefalse

运算符:

! (逻辑非)
&& (逻辑与, “and” )
|| (逻辑或, “or” )
== (等于)
!= (不等于)
运算符 ||&& 都遵循同样的短路( short-circuiting )规则。就是说在表达式 f(x) || g(y) 中, 如果 f(x) 的值为 true ,那么 g(y) 就不会被执行,即使会出现一些副作用。

2、整型

int / uint :分别表示有符号和无符号的不同位数的整型变量。 支持关键字 uint8uint256 (无符号,从 8 位到 256 位)以及 int8

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值