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...
实战案例三:ICO 初始代币销售与空投
最近 APE 空投这么火,是时候说到如何为我们之前做的 UseWeb3NFT 发行代币,在进入编码之前,我们先梳理一下具体的需求:假设令牌的最大数量为 10000 个每一个 UseWeb3NFT 持有者可以免费领取 10个ICO 时每一个令牌的初始价格为 0.0001 ethERC-20https://docs.openzeppelin.com/contracts/2.x/api/token/erc20由于空投部分需要依赖 UseWeb3NFT,所以我们需要写一个接口,使用外部调用的方式获取一些数据interface IUseWeb3NFT { function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address ownerAddress); } 首先,我们需要去定义价格uint256 public constant tokenPrice = 0.0001 ether; u...
经济下行阶段,一个 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...
实战案例三:ICO 初始代币销售与空投
最近 APE 空投这么火,是时候说到如何为我们之前做的 UseWeb3NFT 发行代币,在进入编码之前,我们先梳理一下具体的需求:假设令牌的最大数量为 10000 个每一个 UseWeb3NFT 持有者可以免费领取 10个ICO 时每一个令牌的初始价格为 0.0001 ethERC-20https://docs.openzeppelin.com/contracts/2.x/api/token/erc20由于空投部分需要依赖 UseWeb3NFT,所以我们需要写一个接口,使用外部调用的方式获取一些数据interface IUseWeb3NFT { function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address ownerAddress); } 首先,我们需要去定义价格uint256 public constant tokenPrice = 0.0001 ether; u...
Dev

Subscribe to icepy

Subscribe to icepy
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers
Solidity 是一种面向对象的高级静态语言,用于实现智能合约,运行于 以太坊虚拟机,它支持继承,库和自定义类型等。
pragma solidity ^0.8.0;
contract HelloWorld {
}
Solidity 有三种类型的变量,熟悉它是因为变量的范围是由它们声明的位置所决定的:
Local
在函数内部声明且不存储在区块链上
State
存储在区块链上
Global
提供区块链相关的信息,它在运行时由以太坊虚拟机注入
包括交易发送者,区块时间戳,区块哈希等
语法知识,请阅读:https://docs.soliditylang.org/en/v0.8.9/index.html
说明:OpenZeppelin 是一家以太坊安全公司,其为流行的智能合约标准开发了一组合约,这些合约经过了大量的测试和安全审查,所以如果我们需要实现这些标准合约时,应该尝试找到 OpenZeppelin 提供的合约,而不是重头开始重写整个标准。
在 useweb3 项目中安装 openzeppelin-contracts
$ npm install @openzeppelin/contracts --save
ERC-20 是一个标准,它描述了一套技术规范,OpenZeppelin 依赖标准实现了 ERC-20 的标准合约。
假设我们使用 ERC-20 标准创建一个游戏经验值的合约,阅读文章获取经验值 XP
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "hardhat/console.sol";
contract UseWeb3XP is ERC20 {
constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol){
_mint(msg.sender, 10 * 10 ** 18);
}
}
语法解释:is 是 solidity 的继承
本质上在创建智能合约时构造函数,需要来自用户输入的两个参数,_name 代表名称,_symbol 代表符号
由于是继承的关系,因此在构造函数初始化时也需要初始化父合约的构造函数
_mint 函数只能被合约本身调用,而不能被外部调用
msg 是由以太坊注入的全局变量,sender 也就是发送者的地址
重要的问题在于 Solidity 不能支持浮点数,因此这里需要做一些处理。作为替代方案,我们将单位表示为相对此单位的最小不可分割的数量,ERC 20 默认情况下使用 18位小数,因此一个完整的 XP 表示为 10 ^ 18。
ERC-721 是一个标准,它描述了一套技术规范,OpenZeppelin 依赖标准实现了 ERC-721 的标准合约。
假设我们使用 ERC-721 标准创建一个头像集合
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract UseWeb3Avatar is ERC721 {
constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol){
_mint(msg.sender, 1);
}
}
说明:语法解释与上述 ERC-20 的实现相同
Solidity 是一种面向对象的高级静态语言,用于实现智能合约,运行于 以太坊虚拟机,它支持继承,库和自定义类型等。
pragma solidity ^0.8.0;
contract HelloWorld {
}
Solidity 有三种类型的变量,熟悉它是因为变量的范围是由它们声明的位置所决定的:
Local
在函数内部声明且不存储在区块链上
State
存储在区块链上
Global
提供区块链相关的信息,它在运行时由以太坊虚拟机注入
包括交易发送者,区块时间戳,区块哈希等
语法知识,请阅读:https://docs.soliditylang.org/en/v0.8.9/index.html
说明:OpenZeppelin 是一家以太坊安全公司,其为流行的智能合约标准开发了一组合约,这些合约经过了大量的测试和安全审查,所以如果我们需要实现这些标准合约时,应该尝试找到 OpenZeppelin 提供的合约,而不是重头开始重写整个标准。
在 useweb3 项目中安装 openzeppelin-contracts
$ npm install @openzeppelin/contracts --save
ERC-20 是一个标准,它描述了一套技术规范,OpenZeppelin 依赖标准实现了 ERC-20 的标准合约。
假设我们使用 ERC-20 标准创建一个游戏经验值的合约,阅读文章获取经验值 XP
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "hardhat/console.sol";
contract UseWeb3XP is ERC20 {
constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol){
_mint(msg.sender, 10 * 10 ** 18);
}
}
语法解释:is 是 solidity 的继承
本质上在创建智能合约时构造函数,需要来自用户输入的两个参数,_name 代表名称,_symbol 代表符号
由于是继承的关系,因此在构造函数初始化时也需要初始化父合约的构造函数
_mint 函数只能被合约本身调用,而不能被外部调用
msg 是由以太坊注入的全局变量,sender 也就是发送者的地址
重要的问题在于 Solidity 不能支持浮点数,因此这里需要做一些处理。作为替代方案,我们将单位表示为相对此单位的最小不可分割的数量,ERC 20 默认情况下使用 18位小数,因此一个完整的 XP 表示为 10 ^ 18。
ERC-721 是一个标准,它描述了一套技术规范,OpenZeppelin 依赖标准实现了 ERC-721 的标准合约。
假设我们使用 ERC-721 标准创建一个头像集合
// SPDX-License-Identifier: SEE LICENSE IN LICENSE
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract UseWeb3Avatar is ERC721 {
constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol){
_mint(msg.sender, 1);
}
}
说明:语法解释与上述 ERC-20 的实现相同
No activity yet