区块链智能合约编程语言 Solidity
文章目录
- 前言
- Solidity 介绍
- Solidity 文件结构
- 许可声明
- 编译指示
- 数据类型
- 函数
- 事件
- 访问区块元数据
- 简单的智能合约
前言
上文介绍了区块链生态发展,我们知道以太坊的到来可以使开发人员基于区块链开发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 somethingemit 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):完整的calldatamsg.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);}
}
相关文章:
区块链智能合约编程语言 Solidity
文章目录 前言Solidity 介绍Solidity 文件结构许可声明编译指示数据类型函数事件访问区块元数据 简单的智能合约 前言 上文介绍了区块链生态发展,我们知道以太坊的到来可以使开发人员基于区块链开发DApp,本文介绍 Solidity 编程语言的使用,然…...
将SSL证书设置成HTTPS的详细步骤
在互联网上建立一个安全且可信任的网站,HTTPS是一种常用的解决方案。HTTPS是HTTP的安全版本,通过使用SSL/TLS协议对传输的数据进行加密,确保数据传输的安全性。要实现HTTPS,你需要将SSL证书设置到你的网站上。以下是详细的步骤&am…...
43、Flink之Hive 读写及详细验证示例
Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...
2023数模国赛C 题 蔬菜类商品的自动定价与补货决策-完整版创新多思路详解(含代码)
题目简评:看下来C题是三道题目里简单一些的,考察的点比较综合,偏数据分析。涉及预测模型和运筹优化(线性规划),还设了一问开放型问题,适合新手入门,发挥空间大。 题目分析与思路: 背景&#x…...
javaScript:DOM中常用尺寸
目录 前言(可以根据图示找到需要的尺寸,便于理解) 内尺寸 clientWidth 包含左右padding和宽度width(忽略滚动条的宽度) clientHeight 包含上下padding和height(忽略滚动条的高度) clientTo…...
决策树算法学习笔记
一、决策树简介 首先决策树是一种有监督的机器学习算法,其采用的方法是自顶向下的递归方法,构建一颗树状结构的树,其具有分类和预测功能。其基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零。决策树的构…...
Verilog_mode常用的几个用法
一:verilog mode中如何使用正则表达 在顶层实例化时,有大量的信号需要重新命名,使用模板的话会增加大量的注释内容,不过往往这些信号命名有特定的规律,我们可以使用正则表达式来处理,下面举几个例子&#…...
MySQL之MHA高可用配置及故障切换
目录 一、MHA概念 1、MHA的组成 2、MHA的特点 3、主从复制有多少种复制方法 二、搭建MySqlMHA部署 1.Master、Slave1、Slave2 节点上安装 mysql 2.修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf 3. 配置 mysql 一主两从 4、安…...
java实现状态模式
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为。在状态模式中,对象将其行为委托给表示不同状态的状态对象,这些状态对象负责管理其行为。以下是在 Java 中实现状态模式的一般步骤: 创建一个状态接口ÿ…...
Selling a Menagerie(cf)
该题考察了拓扑排序dfs 题意:你是一个动物园的主人,该动物园由编号从1到n的n只动物组成。然而,维护动物园是相当昂贵的,所以你决定卖掉它!众所周知,每种动物都害怕另一种动物。更确切地说,动物…...
python-55-打包exe执行
目录 前言一、pyinstaller二、实践打包exe1、遇坑1:Plugin already registered2、遇坑2:OSError 句柄无效 三、总结 前言 你是否有这种烦恼? 别人在使用你的项目时可能还需要安装各种依赖包?别人在使用你的项目,可能…...
linux并发服务器 —— IO多路复用(八)
半关闭、端口复用 半关闭只能实现数据单方向的传输;当TCP 接中A向 B 发送 FIN 请求关闭,另一端 B 回应ACK 之后 (A 端进入 FIN_WAIT_2 状态),并没有立即发送 FIN 给 A,A 方处于半连接状态 (半开关),此时 A 可以接收 B…...
企微SCRM营销平台MarketGo-ChatGPT助力私域运营
一、前言 ChatGPT是由OpenAI(开放人工智能)研发的自然语言处理模型,其全称为"Conversational Generative Pre-trained Transformer",即对话式预训练转换器。它是GPT系列模型的最新版本,GPT全称为"Gene…...
linux C++ 海康截图Demo
项目结构 CMakeLists.txt cmake_minimum_required(VERSION 3.7)project(CapPictureTest)include_directories(include)link_directories(${CMAKE_SOURCE_DIR}/lib ${CMAKE_SOURCE_DIR}/lib/HCNetSDKCom) add_executable(CapPictureTest ${CMAKE_SOURCE_DIR}/src/CapPictureTes…...
MySQL的事务隔离级别
目录 事务隔离级别的概念 脏读(Dirty Read): 不可重复读(Non-Repeatable Read): 幻读(Phantom Read): 读未提交(Read Uncommitted) 读未提交…...
企业大语言模型智能问答的底层基础数据知识库如何搭建?
企业大语言模型智能问答的底层基础数据知识库搭建是一个复杂而关键的过程。下面将详细介绍如何搭建这样一个知识库。 确定知识库的范围和目标: 首先,需要明确知识库的范围,确定所涵盖的领域和主题。这可以根据企业的业务领域和用户需求来确…...
【腾讯云 Cloud Studio 实战训练营】使用python爬虫和数据可视化对比“泸州老窖和五粮液4年内股票变化”
Cloud Studio 简介 Cloud Studio是腾讯云发布的云端开发者工具,支持开发者利用Web IDE(集成开发环境),实现远程协作开发和应用部署。 现在的Cloud Studio已经全面支持Java Spring Boot、Python、Node.js等多种开发模板示例库&am…...
Linux之Shell概述
目录 Linux之Shell概述 学习shell的原因 shell是什么 shell起源 查看当前系统支持的shell 查看当前系统默认shell Shell 概念 Shell 程序设计语言 Shell 也是一种脚本语言 用途 Shell脚本的基本元素 基本元素构成: Shell脚本中的注释和风格 Shell脚本编…...
手写Spring:第2章-创建简单的Bean容器
文章目录 一、目标:创建简单的Bean容器二、设计:创建简单的Bean容器三、实现:创建简单的Bean容器3.0 引入依赖3.1 工程结构3.2 创建简单Bean容器类图3.3 Bean定义3.4 Bean工厂 四、测试:创建简单的Bean容器4.1 用户Bean对象4.2 单…...
在Windows上通过SSH公私钥实现无密码登录Linux
在Windows上通过SSH公私钥实现无密码登录Linux 在Windows上生成SSH密钥对: 打开命令提示符或PowerShell窗口。 输入以下命令生成SSH密钥对: ssh-keygen -t rsa -b 4096按照提示输入密钥的保存路径和密码(可选)。 在指定的路径下…...
实时语音AI对话应用开发:从WebRTC到LLM集成的全栈实践
1. 项目概述:实时语音对话的AI应用实践最近在GitHub上看到一个挺有意思的项目,叫proj-airi/webai-example-realtime-voice-chat。光看名字,就能猜到个大概:这是一个基于Web的、利用AI技术实现的实时语音聊天示例。作为一个在音视频…...
Kubernetes Pod安全标准:构建零信任的容器运行环境
Kubernetes Pod安全标准:构建零信任的容器运行环境 一、Pod安全标准的核心概念与演进 1.1 容器安全的演进历程 容器技术的普及带来了部署效率的革命性提升,但同时也引入了新的安全挑战。从Docker早期的容器逃逸漏洞到Kubernetes集群的大规模安全事件&…...
STM32L4实战:用RTC唤醒定时器实现33秒超长待机,实测功耗从52mA降到2.2mA
STM32L4超低功耗实战:从52mA到2.2mA的RTC唤醒优化全解析 当一块STM32L4开发板的功耗从52mA骤降到2.2mA,这不仅仅是数字的变化——它意味着智能穿戴设备的续航从1天延长到3周,工业传感器节点可以摆脱电源线的束缚,便携医疗设备的安…...
模块四-数据转换与操作——29. 透视表与交叉表
29. 透视表与交叉表 1. 概述 透视表(Pivot Table)和交叉表(Crosstab)是数据汇总的强大工具,类似于 Excel 中的数据透视表。它们可以将数据按照行和列进行分组聚合,快速生成汇总报表。 import pandas as …...
嵌入式Linux驱动DLP投影:硬件接口、软件栈与实战应用
1. 项目概述:当DLP投影遇上嵌入式Linux如果你正在寻找一个既能玩转嵌入式Linux,又能探索前沿投影显示技术的项目,那么DLP LightCrafter™ Display 2000评估模块(EVM)绝对是一个让你眼前一亮的平台。它不是一个简单的投…...
贾子竞争哲学与新范式升维战略——从 “多维对抗“ 到 “意义消解“ 的终极战略蓝图
贾子竞争哲学与新范式升维战略——从 "多维对抗" 到 "意义消解" 的终极战略蓝图摘要本战略体系彻底颠覆了以价格、功能、渠道为核心的传统红海对抗逻辑,提出了一套基于 "维度升维、悖论锁定、意义消解、时间收割" 的全新竞争哲学。其…...
ubuntu linux虚拟机安装部署hermes详细教程(安装、问题处理)
文章目录 前言 一、Hermes 介绍 1. 什么是 Hermes Agent? 2. 核心特性 3. 为什么选择 Hermes Agent? 4. 适用场景 二、安装Hermes 1.安装 2.配置 3.开始对话 4.接入多平台(可选) 5.保持更新 三、Hermes接入微信 四、常见错误解决 1.Failed to connect to github.com port 4…...
TegraRcmGUI完整指南:Windows上最简单快速的Switch注入工具教程
TegraRcmGUI完整指南:Windows上最简单快速的Switch注入工具教程 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是Windows平台上最简…...
nRF52 ADC配置与实战:从原理到电池监测与低功耗优化
1. 项目概述:为什么nRF52的ADC值得你花时间研究? 如果你正在用nRF52系列芯片(比如nRF52832或nRF52840)做物联网设备、可穿戴设备或者任何需要感知物理世界的项目,那么模数转换器(ADC)绝对是你绕…...
JiYuTrainer学习自由解决方案:重新定义课堂自主权的教育技术工具
JiYuTrainer学习自由解决方案:重新定义课堂自主权的教育技术工具 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 你还记得那种感觉吗?当老师在讲台上演示关…...
