用Remix部署Solidity合约
Remix是一个用于开发和部署Solidity合约的线上IDE,该IDE含有各个版本的Solidity,当一个工程有多个Solidity版本时,就需要使用Remix来进行分开编译和部署。
1、安装相关的编译与部署插件
1.1)安装Solidity编译插件
点击Remix左侧页边栏里的两脚插头图标,进入Remix的搜索栏,输入solidity关键字,按[Active]依次激活如下插件
SOLIDITY COMPILER
SOLIDITY STATIC ANALYSYS
SOLIDITY UINT TESTING
1.2)安装Solidity部署插件
点击Remix左侧页边栏里的两脚插头图标,进入Remix是搜索栏,输入run关键字,点击[Active]即可安装
1.3)安装Debug插件和SOURCIFY代码检查插件
同样,进入Remix是搜索栏,输入Debug关键字,点击[Active]即可安装;
输入SOURCIFY关键字,点击[Active]即可安装;
最后,一共6个插件,如下:
图(1) 安装编译和部署等插件
2、设置Remix的页面颜色
点页面左下角的齿轮按钮 -->Themes --> 颜色如下:
Dark(dark) 深蓝色
Light(ligt) 白色
Midcentury(light) 浅棕色
Black(dark) 深黑色
Candy(light) 糖果色
Cerulen(light) 浅青色
Flaty(light) 淡白色
Spacelab(ligth) 蛋白色
Cybory (dark) 亮黑色
建议选择第四个Black(dark),如图(2)所示:
图(2)设置Remix的主题和颜色
3、新建一个Solidity文件,名称为HelloWorldToken.sol
//HelloWorldToken.sol
pragma solidity ^0.4.24;library SafeMath {function mul(uint256 a, uint256 b) internal pure returns (uint256) {if (a == 0) {return 0;}uint256 c = a * b;require(c / a == b);return c;}function div(uint256 a, uint256 b) internal pure returns (uint256) {require(b > 0); uint256 c = a / b;return c;}function sub(uint256 a, uint256 b) internal pure returns (uint256) {require(b <= a);uint256 c = a - b;return c;}function add(uint256 a, uint256 b) internal pure returns (uint256) {uint256 c = a + b;require(c >= a);return c;}function mod(uint256 a, uint256 b) internal pure returns (uint256) {require(b != 0);return a % b;}
}library Roles {struct Role {mapping (address => bool) bearer;}function add(Role storage role, address account) internal {require(account != address(0));require(!has(role, account));role.bearer[account] = true;}function remove(Role storage role, address account) internal {require(account != address(0));require(has(role, account));role.bearer[account] = false;}function has(Role storage role, address account) internal view returns (bool) {require(account != address(0));return role.bearer[account];}
}contract Ownable {address private _owner;event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);constructor() internal {_owner = msg.sender;emit OwnershipTransferred(address(0), _owner);}function owner() public view returns(address) {return _owner;}modifier onlyOwner() {require(isOwner());_;}function isOwner() public view returns(bool) {return msg.sender == _owner;}function renounceOwnership() public onlyOwner {emit OwnershipTransferred(_owner, address(0));_owner = address(0);}function transferOwnership(address newOwner) public onlyOwner {_transferOwnership(newOwner);}function _transferOwnership(address newOwner) internal {require(newOwner != address(0));emit OwnershipTransferred(_owner, newOwner);_owner = newOwner;}
}contract ERC223ReceivingContract {function tokenFallback(address _from, uint256 _value, bytes _data) public;
}interface IERC20 {function totalSupply() external view returns (uint256);function balanceOf(address who) external view returns (uint256);function allowance(address owner, address spender) external view returns (uint256);function transfer(address to, uint256 value) external returns (bool);function approve(address spender, uint256 value) external returns (bool);function transferFrom(address from, address to, uint256 value) external returns (bool);event Approval(address indexed owner, address indexed spender, uint256 value);//ERC223function transfer(address to, uint256 value, bytes data) external returns (bool success);event Transfer(address indexed from, address indexed to, uint256 value);
}contract ERC20 is IERC20, Ownable {using SafeMath for uint256;mapping (address => uint256) private _balances;mapping (address => mapping (address => uint256)) private _allowed;mapping (address => bool) public frozenAccount;event frozenFunds(address account, bool freeze);uint256 private _totalSupply;function totalSupply() public view returns (uint256) {return _totalSupply;}function balanceOf(address owner) public view returns (uint256) {return _balances[owner];}function allowance(address owner, address spender) public view returns (uint256) {return _allowed[owner][spender];}function transfer(address to, uint256 value) public returns (bool) {_transfer(msg.sender, to, value);return true;}//ERC223function transfer(address to, uint256 value, bytes data) external returns (bool) {require(transfer(to, value));uint codeLength;assembly {// Retrieve the size of the code on target address, this needs assembly.codeLength := extcodesize(to)}if (codeLength > 0) {ERC223ReceivingContract receiver = ERC223ReceivingContract(to);receiver.tokenFallback(msg.sender, value, data);}return true;}function approve(address spender, uint256 value) public returns (bool) {require(spender != address(0));_allowed[msg.sender][spender] = value;emit Approval(msg.sender, spender, value);return true;}function transferFrom(address from, address to, uint256 value) public returns (bool) {require(value <= _allowed[from][msg.sender]);require(!frozenAccount[from]);require(from != address(0));_allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);_transfer(from, to, value);return true;}function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {require(spender != address(0));_allowed[msg.sender][spender] = (_allowed[msg.sender][spender].add(addedValue));emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);return true;}function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {require(spender != address(0));_allowed[msg.sender][spender] = (_allowed[msg.sender][spender].sub(subtractedValue));emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);return true;}function _transfer(address from, address to, uint256 value) internal {require(value <= _balances[from]);require(to != address(0));require(!frozenAccount[msg.sender]);_balances[from] = _balances[from].sub(value);_balances[to] = _balances[to].add(value);emit Transfer(from, to, value);}function _issue(address account, uint256 value) internal {require(account != 0);_totalSupply = _totalSupply.add(value);_balances[account] = _balances[account].add(value);emit Transfer(address(0), account, value);}function _burn(address account, uint256 value) internal {require(account != 0);require(!frozenAccount[account]);require(value <= _balances[account]);_totalSupply = _totalSupply.sub(value);_balances[account] = _balances[account].sub(value);emit Transfer(account, address(0), value);}function _burnFrom(address account, uint256 value) internal {require(value <= _allowed[account][msg.sender]);require(!frozenAccount[msg.sender]);_allowed[account][msg.sender] = _allowed[account][msg.sender].sub(value);_burn(account, value);}
}contract PauserRole {using Roles for Roles.Role;event PauserAdded(address indexed account);event PauserRemoved(address indexed account);Roles.Role private pausers;constructor() internal {_addPauser(msg.sender);}modifier onlyPauser() {require(isPauser(msg.sender));_;}function isPauser(address account) public view returns (bool) {return pausers.has(account);}function addPauser(address account) public onlyPauser {_addPauser(account);}function renouncePauser() public {_removePauser(msg.sender);}function _addPauser(address account) internal {pausers.add(account);emit PauserAdded(account);}function _removePauser(address account) internal {pausers.remove(account);emit PauserRemoved(account);}
}contract Pausable is PauserRole {event Paused(address account);event Unpaused(address account);bool private _paused;constructor() internal {_paused = false;}function paused() public view returns(bool) {return _paused;}modifier whenNotPaused() {require(!_paused);_;}modifier whenPaused() {require(_paused);_;}function pause() public onlyPauser whenNotPaused {_paused = true;emit Paused(msg.sender);}function unpause() public onlyPauser whenPaused {_paused = false;emit Unpaused(msg.sender);}
}contract ERC20Burnable is ERC20 {function burn(uint256 value) public {_burn(msg.sender, value);}function burnFrom(address from, uint256 value) public {_burnFrom(from, value);}
}contract ERC20Pausable is ERC20, Pausable {function transfer(address to, uint256 value) public whenNotPaused returns (bool) {return super.transfer(to, value);}function transferFrom(address from, address to, uint256 value) public whenNotPaused returns (bool) {return super.transferFrom(from, to, value);}function approve(address spender, uint256 value) public whenNotPaused returns (bool) {return super.approve(spender, value);}function increaseAllowance(address spender, uint addedValue) public whenNotPaused returns (bool success) {return super.increaseAllowance(spender, addedValue);}function decreaseAllowance(address spender, uint subtractedValue) public whenNotPaused returns (bool success) {return super.decreaseAllowance(spender, subtractedValue);}}contract ERC20Frozen is ERC20 {function freezeAccount (address target, bool freeze) onlyOwner public {require(target != address(0)); frozenAccount[target]=freeze;emit frozenFunds(target, freeze);}
}contract HelloWorldToken is ERC20Burnable, ERC20Pausable, ERC20Frozen {string public constant name = "HelloWorldToken";string public constant symbol ="HWT";uint8 public constant decimals = 18;uint256 public constant INITIAL_SUPPLY = 100000000 * (10 ** uint256(decimals));constructor() public {_issue(msg.sender, INITIAL_SUPPLY);}
}
4、设置编译选项
COMPILER: 0.4.26
EVM VERSION: compiler default
COMPILER CONFIGRURATION:
√ Auto compile
√ Enable optimization
点击Compile按钮,如图(3)所示:
图(3) 设置编译选项
5、设置部署选项
ENVIRIONMENT: JavaScript VM
ACCOUTNT: 默认即可
GAS LIMIT: 3000000
VALUE: 0 wei
CONTRACT: HelloWorldToken - browser/HelloWorldToken.sol
点击[Deploy]按钮,即可部署,如图(4)所示:
图(4)设置部署选项
等约半分钟,部署完成后,左侧Deploy Contracts下会弹出HelloWorldToken这一栏,点它的头部,会展开列出里面的操作方法,点它右括号后的尾巴会复制该Token地址,如图(5)所示:
图(5) 点头部查看函数列表, 点右括号的尾巴得到合约地址
6、验证部署
点击[name] 按钮,得到Token的全称;
点击[owner]按钮,得到Token的主人地址;
点击[symbol]按钮,得到Token的简称;
点击[totalSupply]按钮,得到Token的总量。
如图(6)所示:
点击[name]按钮,得到Token的全称为"HelloWorldToken",与代码里保持一致,这说明HelloWorldToken部署成功,它部署在本地JavaScript虚拟机里。 如果想要部署在测试网上,需要将部署选项参数ENVIRIONMENT设置为Injected Web3,并连上对应的MetaMask账户。
用Remix部署Solidity合约相关推荐
- 以太坊之Remix部署智能合约(Remix简介,使用,测试网络部署合约)
1.Remix简介 Remix 是一个开源的 Solidity 智能合约开发环境,提供基本的编译.部署至本地或测试网络.执行合约等功能.Solidity 是 以太坊Ethereum 官方设计和支持的开 ...
- 如何使用remix编写solidity智能合约并部署上链
1.remix简单介绍 地址:Remix - Ethereum IDEhttps://remix.ethereum.org/ 使用solidity在线编译工具remix让编写智能合约更加丝 ...
- 使用remix和matemask部署智能合约到以太坊测试网络
目录 1. 平台准备 1.1 网页版remix 1.2 Chrome浏览器插件metamask 2. 部署智能合约 1. 平台准备 1.1 网页版remix 进入网址 https://remix.et ...
- 在英文版的remix部署,拿到部署地址在中文版的remix 中 合约地址中输入地址,再部署可以实现调用 java调用智能合约Unmatched arguments from index 2
目录 java调用智能合约 在英文版的remix部署,拿到部署地址
- 【区块链开发入门】(三) Solidity合约编译、部署
目录导航页 [区块链开发入门](一) 以太坊的搭建与运行 [区块链开发入门](二) 以太坊的编程接口 [区块链开发入门](三) Solidity合约编译.部署 [区块链开发入门](四) Truffle ...
- 使用ethers.js部署Solidity智能合约
ethers.js是一个非常精简的以太坊操作库,它包含如下四个模块: Ethers.provider Ethers.contract Ether ...
- 以太坊系列之十一: 零起步使用remix开发智能合约
一步一步使用remix开发智能合约 最新版的remix(2017-8-3)只能使用在线开发了,已经没有离线版本了,并且好像在线版本要FQ才能访问(自行解决). 1.打开remix 注意地址如果是htt ...
- 完整部署uniswap 合约、前端教程(可部署uniswap到bsc、heco)
文章目录 前提条件 部署合约 部署工厂和WETH合约 部署路由合约(重要环节!!) 步骤1 获取字节码 步骤2 获得initCode 步骤3 替换路由中的initCode 当前部署结果 部署前端 部署 ...
- 剖析Solidity合约创建EVM bytecode
1. 引言 前序博客有: Ethereum EVM简介 揭秘EVM Opcodes 在以太坊中,当合约创建时,init code将作为交易的一部分发送,然后返回该合约的实际bytecode--runt ...
最新文章
- tp5+linux+apache php7.1.30环境下,上传图片报错:mkdir():permission denied
- Python 正则表达式
- java中bean文件主要实现内容_JavaBean简单及使用
- 腾讯阿里是否开始走向没落,用新互联网大脑模型分析
- RabbitMQ探索:结构分析与常用方法解释
- iconv 文件编码转换
- java 按钮键盘,java中关于键盘代替按钮的一些有关问题(是代替)~
- OpenCV中SUFR、SIFT无法使用的原因及解决办法
- 数学的威力有多大?足以震慑全球......
- cpu java poi 导出_让 Java 开发更简单,提高工作效率 | Gitee 项目推荐
- 2017.10.5 高速公路 思考记录
- 列表解析python_Python 列表解析
- c++ map是有序还是无序的_go 学习笔记之数组还是切片都没什么不一样
- Javascript特效:不断在页面跑的星星
- java request.getparameter为何能取值_request.getParameter(“xxx”)的参数的取值
- 随心玩玩(七)ELK日志系统配置部署
- java微信公众号开发及源码分享
- 浏览器判断是否安装APP
- 北京市乡镇界街道shp数据arcgis软件乡镇编码2020年(预览图)
- CentOS安装中文语言包