区块链基础之编写合约二

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

一、了解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);
    }
}

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

文章来源地址https://www.toymoban.com/news/detail-703607.html

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

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

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

相关文章

  • 【区块链】以太坊Solidity编写一个简单的Hello World合约

    熟悉一门语言得从Hello World! 开始,因为这是最简单的一个输出形式。 我们先在contracts目录下建立一个helloworld.sol文件 进入编辑 保存退出 在migrations下新建一个部署合约的js文件:3_initial_migration.js 名字可以变动 接下来在test中使用js调用智能合约 在另一个窗口打开ganache 运行智

    2024年02月15日
    浏览(55)
  • 区块链智能合约基础

    什么是智能合约 简单来说,智能合约是一种满足在一定条件时,就执行的程序,例如自动售货机就类似一个智能合约系统。 1.向自动售货机投入足够硬币,按下按钮 2.售货机供出商品 3.售货机回到初始状态 智能合约的工作原理 智能合约是一段程序(代码和数据的集合),可

    2024年02月13日
    浏览(35)
  • 区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第一套智能合约安全漏洞测试(0基础版)

    第一套题的智能合约安全漏洞测试题目 漏洞合约代码 总结: EtherStore合约 是一个简单的储蓄合约,用户可以存入和提取以太币。 Attack合约 是针对 EtherStore 合约设计的,它包含了一个构造函数来引用目标 EtherStore 合约 ,并提供了一个 attack 函数 ,试图通过先存入再立即提取

    2024年04月11日
    浏览(40)
  • Solidity编写合约

     consider是用来声明合约的,conter是声明的合约的名称。  合约是可部署到区块链的最小单元, 一个合约通常由 状态变量(合约数据) 和 合约函数 组成 它的含义是使用大于等于 0.8.0  版本的编译编译  Counter  合约。类似的表示还有:         合约本身也是一个数据类型

    2024年02月22日
    浏览(29)
  • fabric编写第一个合约,Java

    查看是否打包成功 org1 peer节点安装链码包 peer节点安装链码 这个过程比较慢,不要着急,此时这里显示 rror: chaincode install failed with status: 500 - error in simulation: failed to execute transaction 58d14eea40e7aa9f6f5f56c76a3e5cdca7bd9a3525d2d418459461590853926b: error sending: timeout expired while executing transacti

    2024年01月19日
    浏览(29)
  • 基于Hardhat编写合约测试用例

    为智能合约编写自动化测试至关重要,毕竟写智能合约多多少少都会跟用户资金挂钩。 这里假设自己正在开发一个NFT交易平台,这个平台可以让用户售卖自己的NFT,包括ERC721和ERC1155,并且用户可以指定购买者需要支付指定的 ERC20 Token 购买。 我们先确定自己的测试功能和目标

    2024年02月02日
    浏览(29)
  • 安全区块链(区块链合约安全查询)

    区块链中的安全性来自一些属性。 1.挖掘块需要使用资源。 2.每个块包含之前块的哈希值。 想象一下,如果攻击者想要通过改变5个街区之前的交易来改变链条。如果他们篡改了块,则块的哈希值会发生变化。然后攻击者必须将指针从下一个块更改为更改的块,然后更改下一

    2024年02月11日
    浏览(32)
  • 2.DApp-编写和运行solidity智能合约

    题记         演示如何编写solidity智能合约,以及在remix中运行solidity代码。 准备Remix环境         在浏览器中搜索remix,找到remix官网,并打开         由于是国内网络,所以访问国外网站较慢,可以耐心等待加载完成,或者科学上网。          加载完成是这样:    编写

    2024年02月03日
    浏览(32)
  • 基于openzeppelin编写solidity可升级的智能合约

            现代软件的设计原则是“敏捷开发,迅速迭代”,功能升级或bug修复是所有软件系统都要面对的问题。甚至可以说软件质量在很大程度上依赖于升级和修补源代码的能力。当然Dapp(去中心化应用)也不例外,尤其Dapp一切都是透明的,这使得任何级别的bug都会被成

    2024年01月18日
    浏览(38)
  • 【区块链 | 智能合约】Ethereum源代码 - 智能合约地址生成算法

    当提交智能合约部署后,会返回智能合约的地址。智能合约地址的生成逻辑在eth.api.go的submitTransaction函数中:

    2024年02月13日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包