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合约相关推荐

  1. 以太坊之Remix部署智能合约(Remix简介,使用,测试网络部署合约)

    1.Remix简介 Remix 是一个开源的 Solidity 智能合约开发环境,提供基本的编译.部署至本地或测试网络.执行合约等功能.Solidity 是 以太坊Ethereum 官方设计和支持的开 ...

  2. 如何使用remix编写solidity智能合约并部署上链

    1.remix简单介绍 地址:Remix - Ethereum IDE​​​​​​https://remix.ethereum.org/ 使用solidity在线编译工具remix让编写智能合约更加丝 ...

  3. 使用remix和matemask部署智能合约到以太坊测试网络

    目录 1. 平台准备 1.1 网页版remix 1.2 Chrome浏览器插件metamask 2. 部署智能合约 1. 平台准备 1.1 网页版remix 进入网址 https://remix.et ...

  4. 在英文版的remix部署,拿到部署地址在中文版的remix 中 合约地址中输入地址,再部署可以实现调用 java调用智能合约Unmatched arguments from index 2

    目录 java调用智能合约 在英文版的remix部署,拿到部署地址

  5. 【区块链开发入门】(三) Solidity合约编译、部署

    目录导航页 [区块链开发入门](一) 以太坊的搭建与运行 [区块链开发入门](二) 以太坊的编程接口 [区块链开发入门](三) Solidity合约编译.部署 [区块链开发入门](四) Truffle ...

  6. 使用ethers.js部署Solidity智能合约

        ethers.js是一个非常精简的以太坊操作库,它包含如下四个模块:         Ethers.provider         Ethers.contract         Ether ...

  7. 以太坊系列之十一: 零起步使用remix开发智能合约

    一步一步使用remix开发智能合约 最新版的remix(2017-8-3)只能使用在线开发了,已经没有离线版本了,并且好像在线版本要FQ才能访问(自行解决). 1.打开remix 注意地址如果是htt ...

  8. 完整部署uniswap 合约、前端教程(可部署uniswap到bsc、heco)

    文章目录 前提条件 部署合约 部署工厂和WETH合约 部署路由合约(重要环节!!) 步骤1 获取字节码 步骤2 获得initCode 步骤3 替换路由中的initCode 当前部署结果 部署前端 部署 ...

  9. 剖析Solidity合约创建EVM bytecode

    1. 引言 前序博客有: Ethereum EVM简介 揭秘EVM Opcodes 在以太坊中,当合约创建时,init code将作为交易的一部分发送,然后返回该合约的实际bytecode--runt ...

最新文章

  1. tp5+linux+apache php7.1.30环境下,上传图片报错:mkdir():permission denied
  2. Python 正则表达式
  3. java中bean文件主要实现内容_JavaBean简单及使用
  4. 腾讯阿里是否开始走向没落,用新互联网大脑模型分析
  5. RabbitMQ探索:结构分析与常用方法解释
  6. iconv 文件编码转换
  7. java 按钮键盘,java中关于键盘代替按钮的一些有关问题(是代替)~
  8. OpenCV中SUFR、SIFT无法使用的原因及解决办法
  9. 数学的威力有多大?足以震慑全球......
  10. cpu java poi 导出_让 Java 开发更简单,提高工作效率 | Gitee 项目推荐
  11. 2017.10.5 高速公路 思考记录
  12. 列表解析python_Python 列表解析
  13. c++ map是有序还是无序的_go 学习笔记之数组还是切片都没什么不一样
  14. Javascript特效:不断在页面跑的星星
  15. java request.getparameter为何能取值_request.getParameter(“xxx”)的参数的取值
  16. 随心玩玩(七)ELK日志系统配置部署
  17. java微信公众号开发及源码分享
  18. 浏览器判断是否安装APP
  19. 北京市乡镇界街道shp数据arcgis软件乡镇编码2020年(预览图)
  20. CentOS安装中文语言包

热门文章

  1. 常见的SNS盈利模式(商业模式)
  2. 阿里妈妈:品牌广告中的NLP算法实践
  3. MyBatis实战【上】
  4. 边学边做Unity 3D小游戏日常(二)
  5. 2018 世界杯:科技辅助裁判是否靠谱?
  6. 程序员的五层境界,你在哪一层?最后一层的,都是人生赢家
  7. Linux内核分析2:一个简单的时间片轮转多道程序内核代码分析
  8. 子元素scroll父元素容器不跟随滚动JS实现
  9. 流程图的会签、或签、转审、加签、一票否决实现
  10. WebRtC视频jitterbuffer原理机制