用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合约的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: css label 居中布局_label
- 下一篇: 无线网服务器端口断开,路由器无线网突然断
