区块链智能合约编程语言 Solidity

简介: 上文介绍了[区块链生态发展](https://wangbinguang.blog.csdn.net/article/details/131440404),我们知道以太坊的到来可以使开发人员基于区块链开发DApp,本文介绍 Solidity 编程语言的使用,然后基于 Solidity 编写一个简单的智能合约。

@[TOC]

前言

上文介绍了区块链生态发展,我们知道以太坊的到来可以使开发人员基于区块链开发DApp,本文介绍 Solidity 编程语言的使用,然后基于 Solidity 编写一个简单的智能合约。

Solidity 介绍

Solidity 是以太坊开发人员使用的编程语言,用来编写智能合约,运行在以太坊虚拟机(EVM)上。

有开发经验的同学上手应该是比较容易的,所有编程语言无非就是变量、分支、函数,变量值之所以称之为变量,是因为它是用来存储临时值,是可变化的;而分支是在检查某个事件是否为真后决定是否执行;Solidity 编程语言中函数是与区块链交互的主要方式,前期可以使用在线编程工具 remix 进行开发。

如果要开发一个去中心化的DApp,需要用 React、HTML、CSS 等前端技术将用户页面和智能合约结合。

Solidity 文件结构

一个 Solidity 文件后缀为 .sol,文件中包含许可声明、文件编译指示、文件导入标识以及任意数量的合约定义,包括变量、常量、构造、函数、事件、结构体、错误处理等。

许可声明

由于提供源代码总是涉及版权方面的法律问题,Solidity 编译器鼓励使用机器可读的 SPDX 许可证标识符,每个源文件都应以说明其许可证的注释开头:
// SPDX-License-Identifier: MIT

如果不想指定许可证或者源代码不是开源的,可以使用特殊值 UNLICENSED,其他值可以参考 SPDX licenses

编译指示

通过 pragma 关键字指定源代码使用哪个版本的编译器进行编译,版本编译指示使用如下:
pragma solidity ^0.5.2;
意思是该源文件不能使用 0.5.2 版本之前的编译器进行编译。

数据类型

声明变量的数据类型,跟很多编程语言都相似。

address:地址类型,用来转账,区块链独有类型。代码中 address(this) 表示当前合约的地址。

string:文本类型。

int:数值类型,显示范围是-2255 到 2255 - 1。

uint:无符号整数(指的正整数),最大是 2**256 -1。

bool:布尔值,true 或 false。

bytes:字节类型。

mapping:映射类型,可以理解为 Map。

函数

函数声明跟 JS 一样都是 function ,Solidity 函数格式如下:

function (<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]

示例: function fn() public view returns (address){return address(this);}

其中 internal|external|public|private 为可见性和可变性,比较容易理解。pure|view|payable 用来控制函数权限,其中:

  • pure 表示该函数内只能拥有局部变量,不能读不能写外部变量,不对链上有任何的读写操作。
  • view 表示该函数内只能查看变量、链上内容,不能修改变量、链上的内容。
  • payable 表示该函数内可以修改变量及链上内容,通常用来给合约地址转账或着接收ETH。

事件

事件我们可以理解成通知订阅,当合约中发生某些事,比如谁给谁转账,那么可以声明一个事件,客户端(用户界面)对其监听后,可以接收到这个时间的消息从而 do something。示例:

event Deposit(address from,address to,unit amount);

function deposit(address to,unit amount) public payable {
   
    // do something
    emit Deposit(address(this), to, amount);
}

然后在 JS(Web3.js) 代码中监听这个事件,示例如下:

var abi = /* abi as generated by the compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceipt = ClientReceipt.at("0x1234...ab67" /* address */);

var depositEvent = clientReceipt.Deposit();

depositEvent.watch(function(error, result){
   
    if (!error)
        console.log(result);
});


// Or pass a callback to start watching immediately
var depositEvent = clientReceipt.Deposit(function(error, result) {
   
    if (!error)
        console.log(result);
});

访问区块元数据

我们知道只能合约是运行在区块链中的,所以在智能合约中可以访问区块链的内置数据,比如 block 区块信息、调用合约的上下文(msg)信息。

block区块信息:

  • block.coinbase (address): 当前块的矿工的地址
  • block.difficulty (uint):当前块的难度系数
  • block.gaslimit (uint):当前块gas的上限
  • block.number (uint):当前块编号
  • block.blockhash (function(uint) returns (bytes32)):函数,返回指定块的哈希值,已经被内建函数blockhash所代替
  • block.timestamp (uint):当前块的时间戳

msg调用上下文信息:

  • msg.data (bytes):完整的calldata
  • msg.gas (uint):剩余的gas量
  • msg.sender (address):消息的发送方(调用者)
  • msg.sig (bytes4):calldata的前四个字节(即函数标识符)
  • msg.value (uint):所发送的消息中wei的数量

简单的智能合约

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;

contract Coin {
   

    address public minter;
    mapping (address => uint) public balances;

    // 声明一个合约事件,在函数send的最后一行触发,使得客户端监听在区块链上发出的这些事件。一旦它发出,侦听器就会收到from, to 和 amount 参数
    event Sent(address from, address to, uint amount);

    // 创建合约时执行,仅一次。
    constructor() {
   
        minter = msg.sender;
    }

    // 将一定数量的ETH发送到该地址
    // 只能由合同创建者调用
    function mint(address receiver, uint amount) public {
   
        require(msg.sender == minter);
        balances[receiver] += amount;
    }


    // 声明一个错误类型可以提供详细的信息
    error InsufficientBalance(uint requested, uint available);

    // 调用者向接收者转账
    function send(address receiver, uint amount) public {
   
        if (amount > balances[msg.sender])
            # revert语句无条件中止对链上数据的更改,同时使用 InsufficientBalance 错误向发送者提供错误详细信息。
            revert InsufficientBalance({
   
                requested: amount,
                available: balances[msg.sender]
            });

        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }
}
相关文章
|
8天前
|
前端开发 安全 物联网
《Solidity 简易速速上手小册》第10章:区块链项目实战(2024 最新版)(下)
《Solidity 简易速速上手小册》第10章:区块链项目实战(2024 最新版)
35 1
|
1月前
|
供应链 物联网 区块链
智能合约:区块链世界的法则之书
智能合约:区块链世界的法则之书
29 1
|
7月前
|
存储 安全 区块链
智能合约DAPP系统搭建 | 区块链技术智能合约系统模式开发
智能合约是一种特殊协议,旨在提供、验证及执行合约。具体来说,智能合约是区块链被称之为“去中心化的”重要原因,它允许我们在不需要第三方的情况下,执行可追溯、不可逆转和安全的交易。
|
7月前
|
安全 算法 区块链
区块链交易所开发技术说明:智能合约设计与实现步骤实现分析
智能合约是区块链技术的核心应用,其能够自动执行、验证和执行合同,并以可验证的方式进行操作。在区块链交易所中,智能合约扮演着重要的角色,它们保证了交易的透明性、效率和安全性。作为一名专业的交易所开发团队一员,在交易所开发这块拥有相对成熟的开发技术,目前已经有成熟的区块链交易所开发案例。本文将介绍如何设计和实现可靠的智能合约来支持区块链交易所。
|
8月前
|
前端开发 安全 JavaScript
区块链智能合约dapp系统开发实现技术原理及详细/案例介绍/源码程序
  一般来说,区块链可按许可权限分为公有区块链、联盟区块链和私有区块链,其中,公有链面向全球所有用户,任何人都可以在其中读取数据和发送交易;联盟链由若干业务相关的机构共同参与管理,每个机构都运行着一个或多个节点,读写权限仅对联盟内的节点有限度地开放。
|
8月前
|
安全 区块链 存储
区块链dapp哈希竞猜游戏系统开发(开发案例)丨DAPP哈希竞猜智能合约游戏系统开发规则玩法/方案详细/稳定版/源码案例
哈希函数是一种将任意长度的数据转换成固定长度的数据的过程。该过程是不可逆的,这意味着很难从哈希值还原原始数据
|
9月前
|
存储 前端开发 JavaScript
区块链交易所系统开发(正式版)丨DEX/DEFI/SWAP去中心化智能合约系统开发详细案例/方案项目/技术分析/源码功能
  去中心化存储技术是一种新型存储技术,它改变了传统的集中式存储技术,将数据从单一位置移到多个位置,这样就消除了存储数据的中心机构或服务器的责任,增加了安全性和数据的有效存储,确保用户的数据安全性。
|
9月前
|
存储 安全 区块链
区块链智能合约DAPP开发|DAPP合约代币项目开发(案例说明)
区块链技术使用了分布式网络来实现去中心化
|
6天前
|
存储 供应链 物联网
未来技术纵横谈:区块链、物联网与虚拟现实的融合革新
【4月更文挑战第21天】 随着科技不断进步,新兴技术正在重塑我们的世界。本文将深入探讨三种引人注目的技术——区块链、物联网(IoT)和虚拟现实(VR)——它们各自的发展趋势及其在不同领域的应用前景。区块链技术以其不可篡改的数据记录特性,在金融安全、供应链管理等领域展现出巨大潜力;物联网通过智能设备互联,推动智能家居、智慧城市的发展;而虚拟现实则以其沉浸式体验,改变教育、娱乐等多个行业的面貌。这些技术的交叉融合预示着一个更加智能、互联和虚拟的未来。
18 5

热门文章

最新文章