web3-以太坊智能合约基础(理解智能合约Solidity)

news2025/6/7 2:54:01

以太坊智能合约基础(理解智能合约/Solidity)

无需编程经验,也可以帮助你了解Solidity独特的部分;如果本身就有相应的编程经验如java,python等那么学起来也会非常的轻松

一、Solidity和EVM字节码

实际上以太坊链上储存的就是EVM的字节码,编译好的程序;EVM和Solidity实际上就和java中的jvm虚拟机和java语言的关系
在这里插入图片描述

Solidity是静态类型的

​ 类似于Java,C,Rust 而非python或者js

例子:-整数:uint(256位无符号整数)

​ int(256位带符号整数)

for (uint i = 0;i<10;i++){users[i].balance = 1;}

二、数据类型

**值类型(value Type)**布尔值,整数型等等

**引用类型(Reference Type)**包括数组和结构体,这类变量占用的空间大,赋值是直接传递地址值(类似于Java的指针)

**映射类型 (mapping Type) ** 类似于java的map key–value

-映射:健值存储/哈希表

-每个键初始值都映射为0

-没有内置的方法来查询映射的长度,或者、迭代其非零元素。可以使用单独的变量
在这里插入图片描述

三、函数签名

智能合约的代码总是包含在函数或者是一个运算程序中的;和Java,python的编程语言的函数类似
在这里插入图片描述
构造函数

第一次创建合约时调用

用于自定义设置或给出初始状态

BoardAction的智能合约函数,类似于java中的赋值操作,把constructor的address的地址值赋值给上面的public的值

contract BoardAction{
	address public president;
	address public vicePresident;
	
	constructor(address initialPresident,address initialVP) public {
		/** initialize the contract **/
		president = initialPresident;
		vicePresident = initialVP;
	}
}
四、可见修饰器

用于函数

function calledByAnyone()public {/*anyone can all */}
function calledInternally() internal {/* only called by another funcation in this contract*/}

用于实例变量;几乎和java的public和private一摸一样

int public myPublicField;
int private myPrivateField;

问:myPrivateField所取的值时秘密的吗?

刚开始学习 solidity 时,pureview 关键字可能令人费解,因为其他编程语言中没有类似的关键字。solidity 引入这两个关键字主要是因为 以太坊交易需要支付气费(gas fee)。合约的状态变量存储在链上,gas fee 很贵,如果计算不改变链上状态,就可以不用付 gas。包含 pureview 关键字的函数是不改写链上状态的,因此用户直接调用它们是不需要付 gas 的(注意,合约中非 pure/view 函数调用 pure/view 函数时需要付gas)。

function ordinary() public {/*can modify state and call other functions*/}
function viewOnly() public view {/*cannot modify any storage or call another ono-view funcation*/}
funcation localOnly() public pure {/*doesnot even read any state either*/}
五、事件

这个类似于java中日志

查看合约状态主要有两种方式:

-使用***View函数***,例如用于公共字段的getter函数

-查看***事件日志***。是否可以“订阅”合约中的事件

首先使用event声明一个事件,然后在想要查看的地方emit这个事件即可
在这里插入图片描述

六、调用其他合约的方法

如下代码所示Token为外部的合约接口;tokenA,tokenB外部合约地址实例;sqap1函数的调用

abstract contract Token {
	function transferFrom (address from,address to,uint amount) public virtual;
}
contract Exchanger {
	Token tokenA = Token(address(0x00))
	Token tokenB = Token(address(0x00))
	function sqap1(address Alice,address Bob) public{
		tokenA.transferFrom(Alice,Bob,1);
		tokenB.transferFrom(Bob,Alice,1);
	}
}
七、使用原生代币

在solidity中接受和使用以太坊币

如下代码。有一个acceptExactlyTwoEther函数可以被以太坊的以太币接受,然后还有函数修饰器payable 一定要指定payable ,如果没有指定payable修饰的话那么以太坊将会拒绝所有的以太币。

function acceptExactlyTwoEther() public payable returns(uint) {
	require(msg.value >= 2.0 ether);
	uint refund = msg.value - 2.0 ether;
	payable(msg.sender).transfer(refund);
	return address(this).balance;
}

读取当前时间

function plcaeBid(int price) public {
	require(block.timestamp <= deadline);
}

关于区块的其他元数据也是可以得到的

总结

本文介绍了Solidity智能合约的基本概念和核心特性。Solidity类似于Java/C等静态语言,编译为EVM字节码运行。主要知识点包括:1)数据类型分为值类型、引用类型和映射类型;2)函数签名与构造函数机制;3)可见性修饰符(public/private)和状态修改标识(view/pure);4)事件机制用于日志记录;5)调用外部合约的方法;6)原生代币处理需使用payable修饰符;7)可读取区块时间等元数据。文章通过类比Java等传统语言,帮助开发者快速理解Solidity独特的设计逻辑,为智能合约开发打下基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++项目】负载均衡在线OJ系统-2

文章目录 oj_server模块编写oj_server框架的搭建-oj_server/oj_server.cpp 路由框架 oj_model模块编写题目信息设置v1.文件版本-common/util.hpp boost库spilt函数的使用-oj_server/oj_model_file.hpp 文件版本model编写v2.mysql数据库版本1.mysql创建授权用户、建库建表录入操…

GC1809:高性能24bit/192kHz音频接收芯片解析

1. 芯片概述 GC1809 是数字音频接收芯片&#xff0c;支持IEC60958、S/PDIF、AES3等协议&#xff0c;集成8选1输入切换、低抖动时钟恢复和24bit DAC&#xff0c;适用于家庭影院、汽车音响等高保真场景。 核心特性 高精度&#xff1a;24bit分辨率&#xff0c;动态范围105dB&…

2025年06月05日Github流行趋势

项目名称&#xff1a;onlook 项目地址url&#xff1a;https://github.com/onlook-dev/onlook项目语言&#xff1a;TypeScript历史star数&#xff1a;16165今日star数&#xff1a;1757项目维护者&#xff1a;Kitenite, drfarrell, spartan-vutrannguyen, apps/devin-ai-integrat…

基于BI PaaS架构的衡石HENGSHI SENSE平台技术解析:重塑企业级数据分析基座

在数据驱动决策的时代&#xff0c;传统BI工具日益显露出扩展性弱、灵活性差、资源利用率低等痛点。衡石科技推出的HENGSHI SENSE平台&#xff0c;创新性地采用BI PaaS&#xff08;平台即服务&#xff09;架构&#xff0c;为企业构建了一个强大、开放、可扩展的数据分析基础设施…

【R语言编程绘图-plotly】

安装与加载 在R中使用plotly库前需要安装并加载。安装可以通过CRAN进行&#xff0c;使用install.packages()函数。加载库使用library()函数。 install.packages("plotly") library(plotly)测试库文件安装情况 # 安装并加载必要的包 if (!requireNamespace("p…

通信刚需,AI联手ethernet/ip转profinet网关打通工业技术难关

工业人工智能&#xff1a;食品和饮料制造商的实际用例通信刚需 了解食品饮料制造商如何利用人工智能克服业务挑战 食品和饮料制造商正面临劳动力短缺、需求快速变化、运营复杂性加剧以及通胀压力等挑战。如今&#xff0c;生产商比以往任何时候都更需要以更少的投入实现更高的…

JavaEE->多线程:定时器

定时器 约定一个时间&#xff0c;时间到了&#xff0c;执行某个代码逻辑&#xff08;进行网络通信时常见&#xff09; 客户端给服务器发送请求 之后就需要等待 服务器的响应&#xff0c;客户端不可能无限的等&#xff0c;需要一个最大的期限。这里“等待的最大时间”可以用定时…

<el-table>构建树形结构

最佳实践 el-table实现树形结构主要依靠row-key和tree-props来实现的。 &#x1f4ab; 无论是el-table实现的树形结构还是el-tree组件都是绑定的树形结构的数据&#xff0c;因此如果数据是扁平的话&#xff0c;需要进行树化。 代码 <template><div><el-table:d…

linux——磁盘和文件系统管理

1、磁盘基础简述 1.1 硬盘基础知识 硬盘&#xff08;Hard Disk Drive&#xff0c;简称 HDD&#xff09;是计算机常用的存储设备之一. p如果从存储数据的介质上来区分&#xff0c;硬盘可分为机械硬盘&#xff08;Hard Disk Drive, HDD&#xff09;和固态硬盘&#xff08;Soli…

云原生 DevOps 实践路线:构建敏捷、高效、可观测的交付体系

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;DevOps 与云原生的深度融合 在传统软件工程范式下&#xff0c;开发与运维之间存在天然的壁垒。开发希望尽快…

gateway 网关 路由新增 (已亲测)

问题&#xff1a; 前端通过gateway调用后端接口&#xff0c;路由转发失败&#xff0c;提示404 not found 排查&#xff1a; 使用 { "href":"/actuator/gateway/routes", "methods":[ "POST", "GET" ] } 命令查看路由列表&a…

Python 训练营打卡 Day 33-神经网络

简单神经网络的流程 1.数据预处理&#xff08;归一化、转换成张量&#xff09; 2.模型的定义 继承nn.Module类 定义每一个层 定义前向传播流程 3.定义损失函数和优化器 4.定义训练过程 5.可视化loss过程 预处理补充&#xff1a; 分类任务中&#xff0c;若标签是整…

如何有效删除 iPhone 上的所有内容?

“在出售我的 iPhone 之前&#xff0c;我该如何清除它&#xff1f;我担心如果我卖掉它&#xff0c;有人可能会从我的 iPhone 中恢复我的信息。” 升级到新 iPhone 后&#xff0c;你如何处理旧 iPhone&#xff1f;你打算出售、以旧换新还是捐赠&#xff1f;无论你选择哪一款&am…

AI大模型学习三十二、飞桨AI studio 部署 免费Qwen3-235B与Qwen3-32B,并导入dify应用

一、说明 ‌Qwen3-235B 和 Qwen3-32B 的主要区别在于它们的参数规模和应用场景。‌ 参数规模 ‌Qwen3-235B‌&#xff1a;总参数量为2350亿&#xff0c;激活参数量为220亿‌。‌Qwen3-32B‌&#xff1a;总参数量为320亿‌。 应用场景 ‌Qwen3-235B‌&#xff1a;作为旗舰模型&a…

操作系统中的设备管理,Linux下的I/O

1. I/O软件分层 I/O 层次结构分为五层&#xff1a; 用户层 I/O 软件设备独立性软件设备驱动程序中断处理程序硬件 其中&#xff0c;设备独立性软件、设备驱动程序、中断处理程序属于操作系统的内核部分&#xff0c;即“I/O 系统”&#xff0c;或称“I/O 核心子系统”。 2.用…

LabVIEW与Modbus/TCP温湿度监控系统

基于LabVIEW 开发平台与 Modbus/TCP 通信协议&#xff0c;设计一套适用于实验室环境的温湿度数据采集监控系统。通过上位机与高精度温湿度采集设备的远程通信&#xff0c;实现多设备温湿度数据的实时采集、存储、分析及报警功能&#xff0c;解决传统人工采集效率低、环境适应性…

Cursor 1.0 版本 GitHub MCP 全面指南:从安装到工作流增强

Cursor 1.0 版本 GitHub MCP 全面指南:从安装到工作流增强 简介 GitHub MCP (Machine Coding Protocol) 是一种强大的工具,能够自动化代码生成、管理和分析,从而显著提升开发效率。本文将全面介绍 GitHub MCP 的安装、配置、使用以及如何将其融入您的工作流。 本文介绍两种…

自主设计一个DDS信号发生器

DDS发生器 DDS信号发生器是直接数字频率合成技术&#xff0c;采用直接数字频率合成(Direct Digital Synthesis&#xff0c;简称DDS)技术&#xff0c;把信号发生器的频率稳定度、准确度提高到与基准频率相同的水平&#xff0c;并且可以在很宽的频率范围内进行精细的频率调节。采…

鸿蒙UI(ArkUI-方舟UI框架)- 使用弹框

返回主章节 → 鸿蒙UI&#xff08;ArkUI-方舟UI框架&#xff09; 文章目录 弹框概述使用弹出框(Dialog)弹出框概述不依赖UI组件的全局自定义弹出框(openCustomDialog)(推荐)生命周期自定义弹出框的打开与关闭更新自定义弹出框内容更新自定义弹出框的属性完整示例 基础自定义弹…

学习笔记(24): 机器学习之数据预处理Pandas和转换成张量格式[2]

学习笔记(24): 机器学习之数据预处理Pandas和转换成张量格式[2] 学习机器学习&#xff0c;需要学习如何预处理原始数据&#xff0c;这里用到pandas&#xff0c;将原始数据转换为张量格式的数据。 学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]-CSDN博客 下面…