区块链基础之编写合约二

一、了解solidity中的关键字。

二、了解solidity中的类型。

三、编写合约

1.这里列出一些solidity中的关键字,有哪些。

复制代码
pragma
作用:是告知编译器如何处理源代码的通用指令(例如, pragma once )。

public
作用:关键字 "public" 让这些 变量可以外部读取。

event
作用:来定义一个事件。

require
作用:用于在执行前验证输入和条件;

revent
作用:用于直接触发回退,可自定义异常处理;

assert
作用:用于检查不应该为假的代码,失败的断言可能意味着代码层面存在错误。

emit
作用:v0.4.21版本引进,来触发事件,这有助于分清功能和事件,这也是之前遭遇DAO攻击导致以太坊硬分叉并催生经典以太坊ETC的原因之一。一般:支持并推荐使用emit EventName()来明确地调用事件。为了让事件较常规函数调用更突出,应该是用emit EventName()而不是EventName()

revert
作用:无条件地中止执行并回退所有的变化,类似于 require 函数,它也同样允许你提供一个错误的名称和额外的数据,这些额外数据将提供给调用者(并最终提供给前端应用程序或区块资源管理器),这样就可以更容易地调试或应对失败。

2.这里列出一些solidity中的类型,有哪些。

复制代码
uint:256位无符号整数

mapping: Solidity之mapping类型,映射是一种引用类型,存储键值对。

address:是一个160位的值,且不允许任何算数操作。这种类型适合存储合约地址或外部人员的密钥对。

public:自动生成一个函数,允许你在这个合约之外访问这个状态变量的当前值。如果没有这个关键字,其他的合约没有办法访问这个变量。

struct:Struct是Solidity中的自定义类型。使用Solidity的关键struct进行自定义。结构体内还可以再包含字符串,整型,映射,结构体等复杂类型,


注:所有的标识符(合约名称,函数名称和变量名称)都只能使用ASCII字符集。UTF-8编码的数据可以用字符串变量的形式存储。

3.编写简单的合约

复制代码
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
contract Coin {
    // 关键字 "public" 让这些 变量可以外部读取
    address public minter;
    // 创建一个公共状态变量,但它是一个更复杂的数据类型。
    // 该类型将address映射为无符号整数。 Mappings 可以看作是一个 哈希表 它会执行虚拟初始化,以使所有可能存在的键都映射到一个字节表示为全零的值。
    // 但是,这种类比并不太恰当,因为它既不能获得映射的所有键的列表,也不能获得所有值的列表。
    // 因此,要么记住你添加到mapping中的数据(使用列表或更高级的数据类型会更好),要么在不需要键列表或值列表的上下文中使用它
    mapping (address => uint) public balances;
    // 客户端可以通过事件针对变化作出高效的反应
    event Sent(address from, address to, uint amount);
    // 这是构造函数,只有当合约创建时运行
    constructor() {
        minter = msg.sender;
    }
    function mint(address receiver, uint amount) public {
        // 检查是否是合约的owner调用
        require(msg.sender == minter);
        balances[receiver] += amount;
    }
    // Errors allow you to provide information about
    // why an operation failed. They are returned
    // to the caller of the function.
    // 用来向调用者描述错误信息。Error与 revert 语句 一起使用。 revert 语句无条件地中止执行并回退所有的变化,类似于 require 函数,
    // 它也同样允许你提供一个错误的名称和额外的数据,这些额外数据将提供给调用者(并最终提供给前端应用程序或区块资源管理器),
    // 这样就可以更容易地调试或应对失败。
    // 任何人(已经拥有一些代币)都可以使用 send 函数来向其他人发送代币。如果发送者没有足够的代币可以发送,
    // if 条件为真 revert 将触发失败,并通过 InsufficientBalance 向发送者提供错误细节。
    error InsufficientBlanace(uint requested, uint available);
    function send(address receiver, uint amount) public {
        if (amount > balances[msg.sender])
            revert InsufficientBlanace({
                requested: amount,
                available: balances[msg.sender]
            });
       
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }
}

到这就没了,学会了最简单的编写合约了,然后可以根据别人编写的合约进行阅读然后改写,加油吧,各位。

相关推荐
TechubNews1 分钟前
十年转折,务实为新:从 Devconnect 2025 解析以太坊的「新思路」
区块链
MicroTech20252 小时前
微算法科技(NASDAQ:MLGO)以区块链技术重塑信任生态,驱动数字化变革
科技·区块链
学术小白人3 小时前
EI会议!早鸟优惠!2026年能源与基础设施人工智能国际会议(AIEI 2026)
人工智能·区块链·能源·艺术·工程·rdlink研发家
焦点链创研究所4 小时前
以太坊十年:从理想主义到实用主义
区块链
想ai抽7 小时前
web3区块链-小镇店铺的 “借力办事”:call 与 delegatecall 的区别与联系
web3·区块链·智能合约
想ai抽8 小时前
web3区块链-加密小镇的 “十年庆典徽章”:ERC-721 全流程故事(含所有核心接口)
web3·区块链·nft
Web3VentureView8 小时前
Synbo 产品发布会在吉隆坡举行:重构 Web3 一级市场融资模式
网络·人工智能·重构·web3·区块链·synbo
1***y17821 小时前
Web3.0在去中心化社交的隐私保护
web3·去中心化·区块链
1***y17821 小时前
区块链跨链桥、 跨链桥到底在解决什么问题?
大数据·人工智能·区块链
小小码农一只1 天前
AI与区块链结合的未来:数据安全与去中心化应用的探索
人工智能·去中心化·区块链