经济下行阶段,一个 37 岁失业程序员的独白(经历/经验分享)
警告:区块链投资高风险,需要谨慎,谨慎,再谨慎!
实战案例四:DeFi 去中心化交易所
现实情况是期望代币可以在去中心化的交易场所中交换,这篇文章就是从一个简单案例来说明交换,流动性该如何实现。 我们需要先梳理一下,期望这个应用具备哪些功能:只用一个代币对建立交易场所交易收取 1% 的费用用户可以为 UseWeb3Token 添加或删除流动性为用户提供 LP 代币说明:实现会比这个例子复杂的多// SPDX-License-Identifier: SEE LICENSE IN LICENSE pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract UseWeb3Exchange is ERC20 { address public useweb3TokenAddress; constructor(address useweb3TokenContract) ERC20("LP Token", "LP") { useweb3TokenAddress = useweb3TokenContract; } function getReserve() publ...
初识 Solidity 和 OpenZeppelin
Solidity 是一种面向对象的高级静态语言,用于实现智能合约,运行于 以太坊虚拟机,它支持继承,库和自定义类型等。pragma solidity ^0.8.0; contract HelloWorld { } Solidity 有三种类型的变量,熟悉它是因为变量的范围是由它们声明的位置所决定的:Local在函数内部声明且不存储在区块链上State存储在区块链上Global提供区块链相关的信息,它在运行时由以太坊虚拟机注入包括交易发送者,区块时间戳,区块哈希等全局变量语法知识,请阅读:https://docs.soliditylang.org/en/v0.8.9/index.html初识 OpenZeppelin说明:OpenZeppelin 是一家以太坊安全公司,其为流行的智能合约标准开发了一组合约,这些合约经过了大量的测试和安全审查,所以如果我们需要实现这些标准合约时,应该尝试找到 OpenZeppelin 提供的合约,而不是重头开始重写整个标准。https://github.com/OpenZeppelin/openzeppelin-contracts在 useweb3 ...
Dev
经济下行阶段,一个 37 岁失业程序员的独白(经历/经验分享)
警告:区块链投资高风险,需要谨慎,谨慎,再谨慎!
实战案例四:DeFi 去中心化交易所
现实情况是期望代币可以在去中心化的交易场所中交换,这篇文章就是从一个简单案例来说明交换,流动性该如何实现。 我们需要先梳理一下,期望这个应用具备哪些功能:只用一个代币对建立交易场所交易收取 1% 的费用用户可以为 UseWeb3Token 添加或删除流动性为用户提供 LP 代币说明:实现会比这个例子复杂的多// SPDX-License-Identifier: SEE LICENSE IN LICENSE pragma solidity ^0.8.4; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract UseWeb3Exchange is ERC20 { address public useweb3TokenAddress; constructor(address useweb3TokenContract) ERC20("LP Token", "LP") { useweb3TokenAddress = useweb3TokenContract; } function getReserve() publ...
初识 Solidity 和 OpenZeppelin
Solidity 是一种面向对象的高级静态语言,用于实现智能合约,运行于 以太坊虚拟机,它支持继承,库和自定义类型等。pragma solidity ^0.8.0; contract HelloWorld { } Solidity 有三种类型的变量,熟悉它是因为变量的范围是由它们声明的位置所决定的:Local在函数内部声明且不存储在区块链上State存储在区块链上Global提供区块链相关的信息,它在运行时由以太坊虚拟机注入包括交易发送者,区块时间戳,区块哈希等全局变量语法知识,请阅读:https://docs.soliditylang.org/en/v0.8.9/index.html初识 OpenZeppelin说明:OpenZeppelin 是一家以太坊安全公司,其为流行的智能合约标准开发了一组合约,这些合约经过了大量的测试和安全审查,所以如果我们需要实现这些标准合约时,应该尝试找到 OpenZeppelin 提供的合约,而不是重头开始重写整个标准。https://github.com/OpenZeppelin/openzeppelin-contracts在 useweb3 ...
Dev
Share Dialog
Share Dialog

Subscribe to icepy

Subscribe to icepy
<100 subscribers
<100 subscribers
需要解释一些 Solidity 语法相关的内容,以及一些其他的注意事项,这些内容在后面开发一个实际例子中需要用到。
mapping 跟其他语言的字典一样,将数据存储在键值对中,它使用的语法是:mapping(key => value),同时也可以创建嵌套的 mapping:mapping(key => mapping(key => value))。
enum 是枚举,通常它是用户定义的,其中包含一组人类可阅读的名称,如:
enum Status{
Pending,
Done
}
struct 的概念存在于许多编程语言中,它用来定义自己的数据类型,如:
contract List{
struct Item{
string text;
bool opened;
}
Item[] public items;
function createItem(string memory _text) public{
items.push(Item(_text, false));
}
}
view 和 pure 这是特殊的关键字,用于描述函数的特定行为:
view 不改变任何状态值的函数
pure 不改变任何状态值,也不读取任何状态值的函数
modifier 是函数的修饰符,可以在函数运行之前被调用,通常用于限制某些功能的访问,验证参数等
contract List{
address public owner;
constructor(){
owner = msg.sender;
}
modifier onlyOwner(){
require(msg.sender == owner, "not the owner");
_;
}
function changeOwner(address _newOwner) public onlyOwner{
owner = _newOwner;
}
}
event 是允许合约在以太坊区块链上执行的日志记录,通常可以配合它来更新前端界面
contract List{
struct Item{
string text;
bool opened;
}
Item[] public items;
event CreateItemEvent(address sender, string text);
function createItem(string memory _text) public{
items.push(Item(_text, false));
emit CreateItemEvent(msg.sender, _text);
}
}
constructor 构造函数,顾名思义,首次部署合约时被执行,创建者可以将一些参数传递过来
is 是继承的关键字,它可以让我们从一个合约继承另外一个合约的属性和方法,其中还有一些特定的关键字,virtual 和 override,它是成对出现的,如果允许子合约覆盖父合约的某个函数,其父函数上必须声明 virtual,其子函数必须声明 override
contract A{
function query() public virtual returns(string memory){
return "A";
}
}
contract B is A{
function query() public override returns(string memory) {
return "B";
}
}
目前合约中转移以太坊的推荐方式是使用 call
contract SendETH{
function send(address payable _to) public payable{
(bool success, bytes memory data) = _to.call{value: msg.value}("");
require(success == true, "Failed");
}
}
合约中接收以太坊,则必须声明如下两个:
receive() external payable
fallback() external payable
如果 msg.data 是空值则 receive 被调用,否则是 fallback
调用外部合约,通常我们可以去调用外部合约时,必须知道外部合约的接口。假定一个合约已经被部署,且合约地址为:0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199,在知道其接口的情况下:
interface List{
function getId(address account) external view returns(uint256);
}
contract A{
List list;
constructor(){
list = List("0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199");
}
function getId() public view returns(string memory){
uint id = list.getId(msg.sender);
require(id > 0, "don't get ID");
}
}
import 导入,基本上是为了做代码分拆。
library 类似于合约,但它有一些限制,库不能包含任何状态变量,当然也不能转移以太坊,通常库可以用于添加辅助函数,比如 SafeMath。
为了更好的理解 Provider 和 Signer,我需要简单的为大家解释一下。需要知道是向区块链读取或写入数据时都要通过以太坊节点来进行通信,该节点包含区块状态,允许我们读取或写入,这其中的区别在于,如果是写入数据,节点需要广播交易,如果只是读取数据,节点不需要做任何事情,因为数据已经在本地节点中。
所以:
Provider 本质是连接某一个以太坊节点,允许你读取数据
Signer 本质是连接某一个以太坊节点,允许你将数据写入(Signer 需要访问 Private Key)
Signer 可以做任何事情,即可读可写,Provider 则只适用于读取数据。
通常我们在写 solidity 时基本上数值都会用 uint256,这个范围非常大,但是由于前端 JS 上的 number 小的很多,因此 BigNumber 是我们必须特别注意的事项,不过这些事情我们都可以通过 BigNumber 这个库来完成。
说明:BigNumber 不需要自己安装,ethers.js 中自带
我们知道如果要接收以太坊,只需要 payable 关键字,但如果要接收 ERC20 则有一些不同,我们需要了解一下 Allowance 概念,即:
approve(address spender, uint256 amount) 允许用户授权 spender 地址代表用户可以使用多少 amount
transferFrom(address from, address to, uint256 amount) 允许用户将多少 amount 从 from 转移到 to
需要解释一些 Solidity 语法相关的内容,以及一些其他的注意事项,这些内容在后面开发一个实际例子中需要用到。
mapping 跟其他语言的字典一样,将数据存储在键值对中,它使用的语法是:mapping(key => value),同时也可以创建嵌套的 mapping:mapping(key => mapping(key => value))。
enum 是枚举,通常它是用户定义的,其中包含一组人类可阅读的名称,如:
enum Status{
Pending,
Done
}
struct 的概念存在于许多编程语言中,它用来定义自己的数据类型,如:
contract List{
struct Item{
string text;
bool opened;
}
Item[] public items;
function createItem(string memory _text) public{
items.push(Item(_text, false));
}
}
view 和 pure 这是特殊的关键字,用于描述函数的特定行为:
view 不改变任何状态值的函数
pure 不改变任何状态值,也不读取任何状态值的函数
modifier 是函数的修饰符,可以在函数运行之前被调用,通常用于限制某些功能的访问,验证参数等
contract List{
address public owner;
constructor(){
owner = msg.sender;
}
modifier onlyOwner(){
require(msg.sender == owner, "not the owner");
_;
}
function changeOwner(address _newOwner) public onlyOwner{
owner = _newOwner;
}
}
event 是允许合约在以太坊区块链上执行的日志记录,通常可以配合它来更新前端界面
contract List{
struct Item{
string text;
bool opened;
}
Item[] public items;
event CreateItemEvent(address sender, string text);
function createItem(string memory _text) public{
items.push(Item(_text, false));
emit CreateItemEvent(msg.sender, _text);
}
}
constructor 构造函数,顾名思义,首次部署合约时被执行,创建者可以将一些参数传递过来
is 是继承的关键字,它可以让我们从一个合约继承另外一个合约的属性和方法,其中还有一些特定的关键字,virtual 和 override,它是成对出现的,如果允许子合约覆盖父合约的某个函数,其父函数上必须声明 virtual,其子函数必须声明 override
contract A{
function query() public virtual returns(string memory){
return "A";
}
}
contract B is A{
function query() public override returns(string memory) {
return "B";
}
}
目前合约中转移以太坊的推荐方式是使用 call
contract SendETH{
function send(address payable _to) public payable{
(bool success, bytes memory data) = _to.call{value: msg.value}("");
require(success == true, "Failed");
}
}
合约中接收以太坊,则必须声明如下两个:
receive() external payable
fallback() external payable
如果 msg.data 是空值则 receive 被调用,否则是 fallback
调用外部合约,通常我们可以去调用外部合约时,必须知道外部合约的接口。假定一个合约已经被部署,且合约地址为:0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199,在知道其接口的情况下:
interface List{
function getId(address account) external view returns(uint256);
}
contract A{
List list;
constructor(){
list = List("0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199");
}
function getId() public view returns(string memory){
uint id = list.getId(msg.sender);
require(id > 0, "don't get ID");
}
}
import 导入,基本上是为了做代码分拆。
library 类似于合约,但它有一些限制,库不能包含任何状态变量,当然也不能转移以太坊,通常库可以用于添加辅助函数,比如 SafeMath。
为了更好的理解 Provider 和 Signer,我需要简单的为大家解释一下。需要知道是向区块链读取或写入数据时都要通过以太坊节点来进行通信,该节点包含区块状态,允许我们读取或写入,这其中的区别在于,如果是写入数据,节点需要广播交易,如果只是读取数据,节点不需要做任何事情,因为数据已经在本地节点中。
所以:
Provider 本质是连接某一个以太坊节点,允许你读取数据
Signer 本质是连接某一个以太坊节点,允许你将数据写入(Signer 需要访问 Private Key)
Signer 可以做任何事情,即可读可写,Provider 则只适用于读取数据。
通常我们在写 solidity 时基本上数值都会用 uint256,这个范围非常大,但是由于前端 JS 上的 number 小的很多,因此 BigNumber 是我们必须特别注意的事项,不过这些事情我们都可以通过 BigNumber 这个库来完成。
说明:BigNumber 不需要自己安装,ethers.js 中自带
我们知道如果要接收以太坊,只需要 payable 关键字,但如果要接收 ERC20 则有一些不同,我们需要了解一下 Allowance 概念,即:
approve(address spender, uint256 amount) 允许用户授权 spender 地址代表用户可以使用多少 amount
transferFrom(address from, address to, uint256 amount) 允许用户将多少 amount 从 from 转移到 to
No activity yet