区块链基础之编写合约二
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
一、了解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中的类型有哪些。
uint256位无符号整数
mapping: Solidity之mapping类型映射是一种引用类型,存储键值对。
address是一个160位的值且不允许任何算数操作。这种类型适合存储合约地址或外部人员的密钥对。
public自动生成一个函数允许你在这个合约之外访问这个状态变量的当前值。如果没有这个关键字其他的合约没有办法访问这个变量。
structStruct是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);
}
}
到这就没了学会了最简单的编写合约了然后可以根据别人编写的合约进行阅读然后改写加油吧各位。