智能合约solidity:转账,打款,退款,销毁等
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能合约solidity:转账,打款,退款,销毁等相关的知识,希望对你有一定的参考价值。
参考技术A 本合约是一个比较完整的众筹合约,含:新建众筹项目,转账,打款,以及退款等功能!
编写合约时,可以直接在 线上 编写和测试部署
参与者只需记录参与者的地址和捐赠的金额
发起者则需要较多的属性,如:受益地址,目标金额,是否募资完成等!!!
另外,要通过funderMap(mapping)将捐赠者的id与捐赠者绑定在一起,从而得知是谁给受益人捐钱。
声明发起众凑的项目,并且通过neederMap(mapping)将受益人id与收益金额绑定在一起,从而可以更好的管理受益人
create众凑项目的时候,直接给定一个自增的序号当作当前众凑项目的id。create项目时,要根据前面声明的needer结构体实例,参数要一一对应。
捐赠可以根据众凑项目id给该项目捐钱(转账),当合约的方法发生转账时必须用到 payable 关键字。另外,要先校验捐赠者钱包余额够不够本次捐赠的余额,还有校验该项目是否已终止,判断都有效的情况,此时会将本次捐赠的金额直接转账到当前合约中,同时记录捐赠人数和记录捐赠者。
结束项目的原因有多种,但是这里只是用捐赠完成的原因作为例子。捐赠完成后,可以由合约发起者(本合约中也是受益者)发起将合约的钱转到自己的钱包地址中,这里同样发生了交易,所以也要用到关键字 payable 。然而,我们发现该方法中有一个 onlyOwner 修饰词,onlyOwner在下面会声明,表示只能是合约发起者才能调用该方法。
当捐款的完成后,由于合约没有销毁,捐赠者还是可以继续捐赠的,因此会导致多出的钱仍在合约账户中,所以就有了该退款的方法。该方法是将合约上的钱根据捐赠者退回给捐赠者。
源码地址: https://github.com/Jacky-MYD/Crowd-funding-solidity
区块链-智能合约工程师第三篇:Solidity进阶
文章目录
合约库
库合约一般都是一些好用的函数合集(库函数),为了提升solidity代码的复用性和减少gas而存在。他和普通合约主要有以下几点不同:
- 不能存在状态变量
- 不能够继承或被继承
- 不能接收以太币
- 不可以被销毁
String库
String库合约是将uint256(大正整数)类型转换为相应的string类型的代码库,主要包含两个函数,toString()将uint256转为string,toHexString()将uint256转换为16进制,再转换为string。
library Strings
function toString(uint256 value) public pure returns (string memory)
function toHexString(uint256 value) public pure returns (string memory)
function toHexString(uint256 value, uint256 length) public pure returns (string memory)
调用库函数
使用 using A for B;
语句:添加完指令后,A 库的函数会自动添加为 B 类型变量的函数成员,可以直接调用。(在调用时,B变量会被当作第一个参数传递给函数)
// 利用using for指令
using Strings for uint256;
function getString1(uint256 myNumber) public pure returns(string memory)
// 库函数会自动添加为uint256型变量的成员
return myNumber.toHexString();
通过库合约名称调用库函数:
// 直接通过库合约名调用
function getString2(uint256 myNumber) public pure returns(string memory)
return Strings.toHexString(myNumber);
常用的合约库
合约库 | 说明 |
---|---|
String | 将uint256转换为String |
Address | 判断某个地址是否为合约地址 |
Create2 | 更安全的使用Create2 EVM opcode |
Arrays | 跟数组相关的库函数 |
import
solidity支持利用import关键字导入其他源代码中的合约,让开发更加模块化。
- 通过相对路径/绝对路径:import ‘./Yeye.sol’;
- 通过源文件网址导入网上的合约:import ‘https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol’;
- 通过npm的目录导入:import ‘@openzeppelin/contracts/access/Ownable.sol’;
- 通过全局符号导入特定的合约:import Yeye from ‘./Yeye.sol’;
引用(import)在代码中的位置为:在声明版本号之后,在其余代码之前。
问题:与声明版本号并列,还是在合约里导入?
回答:与声明版本号并列。
接收ETH
Solidity支持两种特殊的回调函数,receive()和fallback(),他们主要在两种情况下被使用:
- 接收ETH
- 处理合约中不存在的函数调用(代理合约proxy contract)
接收函数 receive()
receive()
函数只用于处理接收ETH,一个合约最多有一个receive()函数,声明方式与一般函数不一样,不需要function关键字。
声明规则:receive()函数不能有任何的参数,不能返回任何值,必须包含external和payable。
receive() external payable ...
我们可以在receive()里发送一个event:
// 定义事件
event Received(address Sender, uint Value);
// 接收ETH时释放Received事件
receive() external payable
emit Received(msg.sender, msg.value);
回退函数 fallback()
fallback()声明时不需要function关键字,必须由external修饰,一般也会用payable修饰,用于接收ETH:
fallback() external payable ...
定义一个fallback()函数,被触发时候会释放fallbackCalled事件,并输出msg.sender,msg.value和msg.data:
// fallback
fallback() external payable
emit fallbackCalled(msg.sender, msg.value, msg.data);
二者的区别
receive和fallback都能够用于接收ETH,他们触发的规则如下,简单说就是:只有msg.data为空且存在receive()时,才会触发receive()
触发fallback() 还是 receive()?
接收ETH
|
msg.data是空?
/ \\
是 否
/ \\
receive()存在? fallback()
/ \\
是 否
/ \\
receive() fallback()
以上是关于智能合约solidity:转账,打款,退款,销毁等的主要内容,如果未能解决你的问题,请参考以下文章
智能合约实战 solidity 语法学习 12 [ virtual 重写override 抽象abstract 接口interface 库library 销毁selfdestruct] 附代码
智能合约实战 solidity 语法学习 12 [ virtual 重写override 抽象abstract 接口interface 库library 销毁selfdestruct] 附代码
智能合约实战 solidity 语法学习 12 [ virtual 重写override 抽象abstract 接口interface 库library 销毁selfdestruct] 附代码(代码片
Solidity地址支付方法SendTransfer和Call的使用
智能合约实战一(安装环境准备配置solidity编译 等)[vscodenodejssoliditytruffle](持续更新)