Solidity智能合约入门教程

智能合约入门教程

前言

web3 的概念提出已久,许多从事 web2 开发的小伙伴想入门智能合约的开发,却不知道从哪里下手。今天小编会带着大家从零开发一个基础的智能合约,帮助大家快速入门。

1 开发工具 remix 的介绍

Remix 是一个基于 Web 的 Solidity IDE,提供了一个集成开发环境,用于编写、测试和部署 Solidity 智能合约。以下是使用 Remix 的基本步骤: 1、remix 在线地址 网站:remix.ethereum.org/ (如果想要本地安装包的可以给小编浏览哦);

2、打开在线地址后我们可以看到!,这样的页面,左测 constracts 文件夹中已有 3 个官方提供给我们的智能合约文件。

3、合约的编译

可以按照图示进行操作! 当我们选中 constracts 文件夹下的一个智能合约后:

  • 点击 1 进入编译页面
  • 注意事项 图示 2 处可以切换编译时所用 solidity 版本号,需要在图示 3 处所显示版本号内
  • 点击 4 完成编译
    4、合约的部署\
  • 切换至 1 所在页面
  • 由于我们所选合约为 1_Storage.sol,通过阅读可以发现该合约无需初始化参数 直接点击 2 所示 Deploy 即可完成部署
    5 合约的测试
  • 可以看到 合约部署后 remix 即可直接调用合于暴漏出来的方法进行测试 简单高效的体验到合约开发流程

通过 Remix,你可以编写、编译、部署和测试你的 Solidity 智能合约,以及与它们进行交互。

2 solidity 智能合约的基本结构

通过阅读 remix 提供给我们的 合约示例,我想只要有其他语言开发经验的同学,大多都可以看懂 示例中的智能合约要做什么事情,因此上手智能合约并不是什么难事。接下来小编就和大家一起了解一个智能合约的基本结构

智能合约的基本结构由版本声明、合约声明、状态变量、合约函数构成(事件、修饰器、构造函数 按招实际需要编写)

ini 复制代码
pragma solidity  >=0.8.2 <0.9.0;

contract MyContract {
    // 状态变量
    uint256 public myNumber;
    address owner;

    // 事件
    event NumberSet(uint256 number);

    // 修饰器
     modifier onlyOwner() {
         require(msg.sender == owner, "Only the contract owner can call this function");
         _;
     }

    // 构造函数
    constructor(uint256 num,address ownerAdd) {
        myNumber = num;
        owner = ownerAdd;
    }

    // 函数
    function setNumber(uint256 number) public  {
        myNumber = number;
        emit NumberSet(number);
    }
}
  • 1、版本声明:pragma solidity ^0.8.0; 表示 Solidity 的版本声明,指定了合约所使用的 Solidity 版本(也可以写成版本区间)。

  • 2、合约声明 contract 关键字:contract MyContract { ... } 定义了一个合约,合约名为 MyContract。

arduino 复制代码
contract MyContract {
    // 合约代码
}
  • 3、状态变量是永久地存储在合约存储中的值 结构 数据类型 + 可见性 +变量名 ,注意可见性如果是 public 可以省略 。至于状态变量数据类型由于篇幅限制,同学们可以到官网自行学习。
csharp 复制代码
 uint256 public myNumber; // public 公共状态变量合约外部可以访问
 address private owner; // private 函数和状态变量仅在当前定义它们的合约中使用,并且不能被派生合约使用
 bool internal isInitialized; // 只能是内部访问(即从当前合约内部或从它派生的合约访问)
  • 4、合约函数:function setNumber(uint256 number) public onlyOwner { ... } 定义了一个公共(public)函数 setNumber,它接受一个无符号整数参数 number。函数可以执行合约的逻辑操作,修改状态变量或与其他合约进行交互。在上述例子中,setNumber 函数修改了 myNumber 的值,并发出了 NumberSet 事件。
  • 5、事件 事件是能方便地调用以太坊虚拟机日志功能的接口:event NumberSet(uint256 number); 声明了一个事件(event)NumberSet,它定义了一个在函数执行时触发的通知机制。事件可以用于在区块链上记录重要的状态变化或通知外部应用程序。 声明 event + 事件名 调用:emit + 事件
typescript 复制代码
contract MyContract {
   uint256 public myNumber;
   event NumberSet(uint256 number); // 事件

    function setNumber(uint256 number) public  {
        myNumber = number;
        emit NumberSet(number); //触发事件
    }
}
  • 6、修饰器:modifier onlyOwner() { ... } 是一个修饰器(modifier),用于修改合约函数的行为。修饰器可以添加额外的验证逻辑或访问控制机制。在上述例子中,onlyOwner 修饰器确保只有合约的所有者才能调用特定函数。

  • 7、构造函数:constructor() { ... } 是一个特殊的函数,用于在合约部署时进行初始化。构造函数在合约创建时自动执行,并且只能执行一次。

3 小试牛刀

这里我们编写一个记录自己每月总存款的合约 包含 totalmoney 总存款合约变量 支持 收入两个合约函数

ini 复制代码
pragma solidity ^0.8.0;

contract SavingsContract {
    uint256 public totalMoney;

    function spendMoney(uint256 amount) public {
        require(amount <= totalMoney, "Insufficient funds");

        totalMoney -= amount;
    }

    function addIncome(uint256 amount) public {
        totalMoney += amount;
    }
}

想了解 solidity 详细开发细节的请移步官网:

solidity 中文网官方链接 solidity-cn.readthedocs.io/zh/develop/...

相关推荐
Estar.Lee6 小时前
查手机号归属地免费API接口教程
android·网络·后端·网络协议·tcp/ip·oneapi
2401_857610038 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
凌冰_9 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
码农飞飞9 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货9 小时前
Rust 的简介
开发语言·后端·rust
monkey_meng9 小时前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
Estar.Lee10 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
新知图书10 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
盛夏绽放11 小时前
Node.js 和 Socket.IO 实现实时通信
前端·后端·websocket·node.js
Ares-Wang11 小时前
Asp.net Core Hosted Service(托管服务) Timer (定时任务)
后端·asp.net