区块链2——Solidity智能合约开发

这篇具有很好参考价值的文章主要介绍了区块链2——Solidity智能合约开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

区块链 索引目录

一、智能合约基础

1、合约的结构和语法

智能合约是一种以代码形式编写的自动执行合约,它们运行在区块链上。这些合约定义了在特定条件下发生的事件以及相应的行为。

1.1 智能合约结构

  1. 版本声明(Version Declaration): 智能合约通常以声明版本开始,指定合约应该使用的Solidity编译器版本。例如:

    pragma solidity ^0.8.0;
    
  2. 合约声明(Contract Declaration): 合约声明定义了合约的名称和主体内容。合约是智能合约的基本单位。

    contract MyContract {
        // 合约内容
    }
    
  3. 状态变量(State Variables): 定义了合约状态的变量,这些变量的值会持久化存储在区块链上。

    uint public myVariable;
    
  4. 构造函数(Constructor): 构造函数在合约创建时执行,用于初始化合约的状态变量。

    constructor() {
        myVariable = 100;
    }
    
  5. 函数(Functions): 智能合约包含可以调用的函数,这些函数定义了合约的行为。

    function setValue(uint newValue) public {
        myVariable = newValue;
    }
    

1.2 智能合约语法

  • 数据类型(Data Types): Solidity语言支持多种数据类型,如uint、string、address等。

  • 控制结构(Control Structures): 包括if语句、for循环、while循环等,用于控制合约的逻辑执行流程。

  • 函数修饰符(Function Modifiers): 允许在函数执行前后附加一些逻辑,如权限控制、状态检查等。

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
    
  • 事件(Events): 事件用于记录在区块链上的特定活动,方便外部应用程序监听和处理。

    event ValueChanged(uint newValue);
    
  • 错误处理(Error Handling): 使用requireassert来处理错误情况,确保合约状态的一致性和安全性。

  • 继承(Inheritance): Solidity支持合约之间的继承关系,允许合约重用代码。

    contract MyContract is AnotherContract {
        // 合约内容
    }
    

1.3 示例

// 版本声明
pragma solidity ^0.8.0;

// 合约声明
contract MyContract {
    // 状态变量
    uint public myVariable;

    // 构造函数
    constructor() {
        myVariable = 100;
    }

    // 函数,修改状态变量的值并触发事件
    function setValue(uint newValue) public {
        myVariable = newValue;
        emit ValueChanged(newValue);
    }

    // 事件声明
    event ValueChanged(uint newValue);
}

在这个例子中,合约包含一个公共状态变量 myVariable、一个构造函数用于初始化变量、一个可以修改变量的函数 setValue,以及一个用于记录变量更改的事件 ValueChanged。通过调用 setValue 函数,可以修改状态变量的值,并触发相应的事件。

2、数据类型和变量

在Solidity中,数据类型和变量用于存储和操作信息。

2.1 数据类型

  1. 整数类型(Integer Types): 用于表示整数,可以是有符号或无符号。

    • uint: 无符号整数,如 uint256.
    • int: 有符号整数,如 int32.
    uint256 public myUint = 42;
    
  2. 布尔类型(Boolean Type): 用于表示真(true)或假(false)。

    bool public isTrue = true;
    
  3. 地址类型(Address Type): 用于存储以太坊地址。

    address public myAddress = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
    
  4. 字符串类型(String Type): 用于存储文本数据。

    string public myString = "Hello, World!";
    
  5. 动态数组(Dynamic Arrays): 数组可存储多个相同类型的元素。

    uint[] public myArray;
    
  6. 映射(Mapping): 用于关联键值对。

    mapping(address => uint) public balances;
    

2.2 变量

  1. 状态变量(State Variables): 存储在区块链上的合约状态。

    uint public myStateVariable = 123;
    
  2. 局部变量(Local Variables): 在函数内部声明的变量,仅在函数执行期间存在。

    function myFunction() public {
        uint localVar = 456;
        // 在此使用局部变量
    }
    
  3. 全局变量(Global Variables): 包括 msg.sendermsg.value 等,提供关于交易和区块信息的信息。

    address public sender = msg.sender;
    

2.3 示例

包含各种数据类型和变量的简单智能合约:

pragma solidity ^0.8.0;

contract DataTypesAndVariables {
    // 整数类型
    uint256 public myUint = 42;

    // 布尔类型
    bool public isTrue = true;

    // 地址类型
    address public myAddress = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;

    // 字符串类型
    string public myString = "Hello, World!";

    // 动态数组
    uint[] public myArray;

    // 映射
    mapping(address => uint) public balances;

    // 状态变量
    uint public myStateVariable = 123;

    // 函数使用局部变量
    function myFunction() public {
        uint localVar = 456;
        // 在此使用局部变量
    }

    // 全局变量
    address public sender = msg.sender;
}

3、控制结构和函数

3.1 控制结构

  1. if语句: 允许根据条件执行不同的代码块。

    function checkValue(uint value) public {
        if (value > 50) {
            // 执行某些操作
        } else {
            // 执行其他操作
        }
    }
    
  2. for循环: 允许多次执行相同的代码块。

    function iterate(uint times) public {
        for (uint i = 0; i < times; i++) {
            // 执行循环中的操作
        }
    }
    
  3. while循环: 在条件为真时重复执行代码块。

    function repeatUntil(uint target) public {
        uint i = 0;
        while (i < target) {
            // 执行循环中的操作
            i++;
        }
    }
    
  4. do-while循环: 执行代码块,然后根据条件重复执行。

    function doWhile(uint target) public {
        uint i = 0;
        do {
            // 执行循环中的操作
            i++;
        } while (i < target);
    }
    

3.2 函数

  1. 函数声明和调用: 定义和调用可重用的代码块。

    function add(uint a, uint b) public pure returns (uint) {
        return a + b;
    }
    
    // 调用
    uint result = add(3, 5);
    
  2. 函数修饰符: 在函数执行前后附加一些逻辑。

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
    
    function changeOwner(address newOwner) public onlyOwner {
        owner = newOwner;
    }
    
  3. 内部函数: 仅在合约内部可见。

    function internalFunction() internal {
        // 执行内部函数中的操作
    }
    
  4. 外部函数: 可以被外部调用,也可以通过外部交易触发。

    function externalFunction() external {
        // 执行外部函数中的操作
    }
    
  5. 支付函数: 允许接收以太币的函数。

    function payMe() public payable {
        // 执行接收支付的操作
    }
    
  6. 视图函数和纯函数: 视图函数不会修改状态,纯函数不会读取状态。

    function viewFunction() public view returns (uint) {
        // 执行视图函数中的操作
    }
    
    function pureFunction(uint a, uint b) public pure returns (uint) {
        return a * b;
    }
    

二、智能合约高级概念

1、事件和日志

事件和日志允许智能合约与外部世界进行通信并记录重要的活动。

1.1 事件(Events)

  1. 事件声明: 事件用于记录在区块链上的特定活动。

    event Transfer(address indexed _from, address indexed _to, uint _value);
    
  2. 触发事件: 在智能合约中触发事件以记录特定的活动。

    function transfer(address _to, uint _value) public {
        // 执行转账操作
        emit Transfer(msg.sender, _to, _value);
    }
    
  3. 监听事件: 外部应用程序可以监听事件以获取合约中特定活动的通知。

    contractInstance.Transfer({}, function(error, event) {
        // 处理事件
    });
    

1.2 日志(Logging)

  1. 使用日志: 在智能合约中记录重要信息。

    function myFunction(uint param) public {
        // 记录日志
        emit Log("Function executed", param);
    }
    
  2. 查看日志: 通过以太坊区块链浏览器或特定工具查看记录的日志信息。

1.3 事件与日志的作用

  • 记录状态变化: 通过事件和日志记录合约状态的变化,例如资金转移或重要操作执行。
  • 外部通知: 允许外部应用程序监听事件和日志,以便及时响应智能合约中的活动。
  • 数据分析: 记录的事件和日志可用于数据分析、审计和追踪特定交易或操作的历史记录。

在实际智能合约项目中,事件和日志通常用于记录重要的交易、状态变化或合约执行的关键信息。通过使用事件和日志,可以增强合约的透明度、可追溯性和与外部世界的交互能力。

2、异常处理

异常处理允许智能合约在发生错误或不符合条件的情况下采取适当的措施,提高合约的鲁棒性和安全性。

2.1 异常处理(Exception Handling)

  1. 抛出异常(Throwing Exceptions): 在合约中,使用 revertrequire 来抛出异常。

    function requireExample(uint x) public pure {
        require(x > 0, "X must be greater than zero");
        // 继续执行操作
    }
    

    如果条件不满足,require 将抛出异常,并回滚状态。

  2. 自定义异常信息: 在抛出异常时,可以提供自定义的错误消息。

    function customRevert(uint x) public pure {
        require(x != 42, "The value cannot be 42");
        // 继续执行操作
    }
    
  3. 处理异常: 在调用合约函数时,可以捕获异常并采取适当的措施。

    try {
        contractInstance.requireExample(0);
    } catch (error) {
        // 处理异常,例如输出错误消息或执行备用操作
    }
    
  4. 状态回滚: 当异常发生时,合约的状态将回滚到异常之前的状态,确保合约状态的一致性。

2.2 具体示例

包含异常处理的简单智能合约:

pragma solidity ^0.8.0;

contract ExceptionHandlingExample {
    address public owner;

    modifier onlyOwner() {
        require(msg.sender == owner, "Not the contract owner");
        _;
    }

    function setOwner(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Invalid new owner address");
        owner = newOwner;
    }

    function withdraw(uint amount) public onlyOwner {
        require(amount > 0, "Withdrawal amount must be greater than zero");
        // 执行提现操作
    }
}

在这个示例中,onlyOwner 修饰符用于确保只有合约的所有者才能执行某些操作。在 setOwnerwithdraw 函数中,使用 require 来验证前置条件。如果条件不满足,将抛出异常并回滚状态。

3、与外部合约的交互

智能合约与外部合约的交互是区块链项目中的一个重要方面。这种交互性使得合约能够调用其他合约的功能,从而实现更为复杂和强大的应用。

  1. 合约地址(Contract Address): 在以太坊上,每个部署的合约都有一个唯一的合约地址。可以使用该地址访问和调用合约的功能。

  2. 外部合约引用: 在 Solidity 中,可以通过在合约中声明外部合约引用来访问其功能。

    contract ExternalContract {
        function externalFunction() public pure returns (uint) {
            return 42;
        }
    }
    
    contract MyContract {
        ExternalContract public externalContract;
    
        constructor(address externalContractAddress) {
            externalContract = ExternalContract(externalContractAddress);
        }
    
        function interactWithExternal() public view returns (uint) {
            return externalContract.externalFunction();
        }
    }
    
  3. 调用外部合约函数: 通过外部合约引用,可以调用其公共函数。

    function interactWithExternal() public view returns (uint) {
        return externalContract.externalFunction();
    }
    
  4. 传递参数和接收返回值: 在调用外部函数时,可以传递参数并接收返回值。

    function interactWithExternalWithParams(uint param) public view returns (uint) {
        return externalContract.externalFunctionWithParams(param);
    }
    
  5. 支付和接收以太币: 如果外部合约包含支付函数,可以通过调用它来发送以太币,并接收来自外部合约的支付。

    function sendEtherToExternal() public payable {
        externalContract.receiveEther{value: msg.value}();
    }
    
  6. 处理异常: 在调用外部函数时,考虑使用异常处理机制以应对可能的错误和异常情况。

    function interactWithExternalSafely() public view returns (uint) {
        try externalContract.externalFunction() returns (uint result) {
            return result;
        } catch (bytes memory error) {
            // 处理异常,例如输出错误消息或执行备用操作
            return 0;
        }
    }
    
  7. 事件和日志记录: 在与外部合约交互时,使用事件和日志记录以记录重要的活动和状态变化。

  8. 权限控制: 在调用外部合约函数时,确保有足够的权限,并使用适当的权限控制机制。文章来源地址https://www.toymoban.com/news/detail-753229.html

到了这里,关于区块链2——Solidity智能合约开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【区块链-智能合约工程师】第二篇:Solidity入门

    参考文章:一文速览2022十大智能合约开发工具 资料地址:WTF学院 HelloWorld remix:在线智能合约开发IDE(Integrated Development Environment,集成开发环境),可以在浏览器中快速部署测试智能合约。 合约HelloWorld: 事项 说明 代码所用的软件许可(license) 不写许可的话编译时会警告

    2024年02月09日
    浏览(49)
  • 区块链智能合约solidity的中的一些关键字

    目  录 pragma mapping msg对象 block对象 contract constructor struct 数据地址 地址类型 address payable revert 以下场景使用 revert() : require 以下场景使用 require() : assert 以下场景使用 assert(): 访问权限 internal public private external function returns return view pure constant event emit modifier pragma   

    2024年01月16日
    浏览(72)
  • 【区块链-智能合约工程师】第三篇:Solidity进阶(一)

    学习资料地址:WTF学院 库合约一般都是一些好用的函数合集(库函数),为了提升solidity代码的复用性和减少gas而存在。他和普通合约主要有以下几点不同: 不能存在状态变量 不能够继承或被继承 不能接收以太币 不可以被销毁 String库 String库合约是将uint256(大正整数)类型

    2024年02月06日
    浏览(49)
  • 区块链web3智能合约Solidity学习资源整理

    Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。 Solidity中文官方文档: https://solidity-cn.readthedocs.io/zh/develop/ https://learnblockchain.cn/docs/solidity/index.html 在线rem

    2024年03月19日
    浏览(64)
  • 《NFT区块链进阶指南二》Etherscan验证Solidity智能合约(Remix插件验证)

    前置参考文档:https://blog.csdn.net/sinat_34104446/article/details/130557703 合约验证是上传合约源代码到etherscan过程,在智能合约项目中,通常都是提供源码验证,增加项目信任度 验证合约后可以直接在etherscan上执行获取和设置方法,方便日常的管理员维护 以下使用remix进行验证并使用

    2024年02月05日
    浏览(68)
  • Solidity智能合约开发 — 3.4-抽象智能合约和接口

    假如一个智能合约中至少一个函数缺省实现时,即某个函数缺少{}中的内容,这个智能合约就当做抽象智能合约。 当我们有一个函数没想好怎么写时,必须将该合约标为 abstract ,不然编译会报错;另外,未实现的函数需要加 virtual ,以便子合约重写。抽象智能合约是将智能合

    2024年02月12日
    浏览(41)
  • 以太坊智能合约开发(五):Solidity成绩录入智能合约实验

    每个学生分别部署合约Student.sol ,保证只有自己可以修改姓名。老师部署合约StudentScore.sol,用于录入学生成绩,查询学生信息。查询学生信息时,需要调用学生部署的合约Student.sol。 student.sol合约,用于学生对自己信息进行管理。 学生的基本信息作为状态变量: 声明构造函

    2024年02月07日
    浏览(44)
  • solidity开发智能合约

    起源于以太坊(Ethereum),设计的目的是能在以太坊虚拟机(EVM)上运行。Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。所以先从智能合约开始。 参考文档 Solidity文档:区块链技术-智能合约Solidity编程语言 solidity官方文档: https://solidity-cn.readthedocs.io/

    2023年04月08日
    浏览(76)
  • Solidity智能合约开发 — 3.2-合约的fallback和函数重载

    每个智能合约有且仅有一个未命名的函数,称为fallback函数,没有参数且没有返回值,可见性必须是 external,且可以是 virtual的(即可以被重载),也可以有修改器 modifier。 fallback执行条件: 如果在一个合约的调用中,没有其他函数与给定的函数标识符匹配时(或没有提供调用

    2024年02月09日
    浏览(57)
  • 以太坊智能合约开发:Solidity 语言快速入门

    在本文中,我们从一个简单的智能合约样例出发,通过对智能合约源文件结构的剖析与介绍,使大家对Solidity语言有一个初步的认识。最后,我们将该智能合约样例在 Remix 合约编译器中编译、部署,观察其执行结果。 在开始之前,我们先对Solidity有个初步的了解,即Solidity是

    2023年04月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包