20230311Solidity合约入门及相关概念介绍

https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#a-simple-smart-contract

//SPDX-License-Identifiler: GPL-3.0

pragma solidity ^0.8.18;

contract Coin{

/*

定义了一个地址类型的公共状态变量叫minter,地址类型是一个160位的字节值,不允许任何数学运输操作,适合用于存储合约地址,

以及存储归属于外部账户的密码对的一半的hash值

minter的public修饰符号,等同于自动生成了一个允许外部合约访问的函数,并且返回值为address的类型

    效果等同于:

function minter() external view returns (address)  {

return minter;

}

*/

addresspublicminter;

/*

同样的,这样声明的balances也是一个公共状态变量,它是一个更加复杂的数据结构,类似于一个hash table的数据结构,

所有的key都默认有一个值为0的value,但是你不能获得所有的keylist ,也不能获得所有的value list,

这个public关键词这样声明,默认会产生一个get函数,如下

    参数是一个地址类型,而返回值是一个uint类型,你可以使用这个方法获得某个地址帐户的余额

function balances(address account) external view returns(uint){

return balances[account];

}

*/

mapping(address=>uint) publicbalances;

/*

这里声明了一个事件Sent,你可以每当send方法调用的时候,他就会触发这个事件,会将from to amount这三个数据通过

    在前端定义监听器实现的方式得到这些数据,从而实现对交易的追踪,并且并不需要花费很多gas费

*/

event Sent(addressfrom,addressto,uintamount);

/*

构造函数是当前合约对象被创建出来的时候执行一次,不能事后执行,因此他永久性的记录了当时创建者的地址

The msg variable (together with tx and block) is a special global variable that contains properties which allow access to the blockchain.

变量msg以及tx和block是一个特殊的全局变量,包含了许多可以供区块链访问的属性数据

msg.sender is always the address where the current (external) function call came from.

msg.sender就是代表的是当前调用该函数的外部调用者的地址

*/

constructor(){

minter = msg.sender;

}

/*

The functions that make up the contract, and that users and contracts can call are mint and send.

函数构成了合约,这些用户和合约可以调用的函数是mint和send

The mint function sends an amount of newly created coins to another address.

The require function call defines conditions that reverts all changes if not met.

mint函数将新创建的代币发送给其他的地址,同时require是一个校验函数,定义了必须满足的条件,如果不满足,交易将会被回滚.

In this example, require(msg.sender == minter); ensures that only the creator of the contract can call mint.

In general, the creator can mint as many tokens as they like, but at some point, this will lead to a phenomenon called “overflow”.

在这个案例中, require(msg.sender == minter)这个语句,确保了只有合约的创建者才可以调用mint函数.通常情况下,创建者可以创建任意数量的代币,只要他想.

但是在某种意义上,这也将导致溢出的现象,

Note that because of the default Checked arithmetic, the transaction would revert if the expression balances[receiver] += amount;

overflows, i.e., when balances[receiver] + amount in arbitrary precision arithmetic is larger than the maximum value of uint (2**256 - 1).

This is also true for the statement balances[receiver] += amount; in the function send.

注意由于有默认的校验算法,这个交易将会被回滚,如果balances[receiver] += amount;表达式被移除,如果balances[receiver] += amount;这个值是一个任意精度算术

    超过了uint的最大值,即使require(msg.sender == minter)这个判断在balances[receiver] += amount send函数中依然是对的.

*/

functionmint(addressreceiver,uintamount) public {

require(msg.sender == minter);

balances[receiver] += amount;

}

/*

Errors allow you to provide more information to the caller about why a condition or operation failed.

Errors are used together with the revert statement.

The revert statement unconditionally aborts and reverts all changes similar to the require function,

but it also allows you to provide the name of an error and additional data which will be supplied to the caller

(and eventually to the front-end application or block explorer) so that a failure can more easily be debugged or reacted upon.

错误允许你提供更多的信息给调用方,为什么条件或者操作失败了.通常error是跟revert声明是一起用的.

revert声明是无条件的撤回,并且回滚所有的变更,类似于require函数

    然而它同样允许你提供错误的名字和额外的数据给调用方(并且最终反馈到前端应用或者区块浏览器中)

因此错误会更容易的被测试和重现出来.

*/

errorInsuffientBalance(uintrequested,uintavaiable);

/*

The send function can be used by anyone (who already has some of these coins) to send coins to anyone else.

If the sender does not have enough coins to send, the if condition evaluates to true.

As a result, the revert will cause the operation to fail

while providing the sender with error details using the InsufficientBalance error.

send函数可以被任何持有当前币种的人调用,去发送给任何人.如果发送方没有足够的币去发,那么这个if函数的条件就是true

因此回滚操作将导致当前操作失败,同时给调用方发送错误信息的细节,通过余额不足函数的错误来提供.

*/

functionsend(addressreceiver,uintamount) public {

if (amount > balance[msg.sender])

revertInsuffientBalance({

requested:amount,

available: balances[msg.sender]

});

balances[msg.send] -= amount;

balances[receiver] += amount;

emit Sent(msg.sender,receiver,amount);

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容