使用Remix编译和部署以太坊智能合约
链客,专为开发者而生,有问必答!
此文章来自链客区块链技术问答社区,未经允许拒绝转载。
使用Remix编译和部署以太坊智能合约
Remix 是一个开源的 Solidity 智能合约开发环境,提供基本的编译、部署至本地或测试网络、执行合约等功能。Solidity 是 以太坊Ethereum 官方设计和支持的开发语言,专门用于编写智能合约。
本文希望将一个很简单的代币合约(只能发行和转账),部署在本地和测试网络上,测试下它的功能。
详细描述使用Remix 的步骤及使用上可能碰到的问题。
之前开发过以太坊Ethereum智能合约,但没有记录过开发的过程和碰到的问题,觉得挺可惜。这次重新开始,从最基础开始,一步步学习。
开发环境
不需要安裝,直接在任何浏览器启动Remix。
取得代币合约
代币合约的范例很多,Ethereum 官网有提供一个最小可执行的代币合约(MINIMUM VIABLE TOKEN):
pragma solidity ^0.4.0;
contract MyToken {/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;/* Initializes contract with initial supply tokens to the creator of the contract */function MyToken(uint256 initialSupply) public {balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens }/* Send coins */function transfer(address _to, uint256 _value) public {require(balanceOf[msg.sender] >= _value); // Check if the sender has enoughrequire(balanceOf[_to] + _value >= balanceOf[_to]);// Check for overflowsbalanceOf[msg.sender] -= _value; // Subtract from the senderbalanceOf[_to] += _value; // Add the same to the recipient }
}
这个MyToken 合约真的很简单,只能做两件事:
[if !supportLists]· [endif]创建代币:发起合约时创建指定数量的代币,代币拥有者是发起合约的Ethereum 帐户
[if !supportLists]· [endif]转移代币:转移指定数量的代币到指定的Ethereum 帐户
至于一个完整的代币合约,可参考ERC20 Token使用手冊。
使用Remix 编译合约
- 点右上角 + 新增一个合约
名称任意只要扩展名是“.sol”。
- 复制合约內容到该合约并编译
Remix 默认设置会自动编译,只要旁边没有蹦出红色的 error 提示就代表编译成功。
在本地部署合约
- 设置网络
点选左上的run。
Environment 选择 JavaScript VM 代表所有资料都是存在本地(功能类似 testrpc)。它会提供 5 个虚拟账户每个有 100 ETH,随便选择一个账户(要记住后面一直要用)。
- 发送交易部署合约
选择MyToken。可以看到 create 按钮。且已根据合约內容显示必须输入initialSupply(也就是要发行的代币数量)。输入一个数目点create,就可以发送交易部署合约。
合约部署成功后,可以看到合约的使用界面。Remix 会自动根据合约的內容,产生对应的合约使用界面。可以看到合约有两个功能:balanceOf(查询余额) 和 transfer(转移代币)。
底下可以看到log(记录每一次的操作)。实际上部署合约是通过一个 Ethereum 交易完成,点 Details 可以看到这笔交易详细资料。
执行合约— 查询余额
- 选择刚刚发起合约的账户
可以点右边的按钮复制
- 输入账户
注意要用“” 把账户括起來,示例:
“0xca35b7d915458ef540ade6068dfe2f44e8fa733c”
- 点击 balanceOf
可以看到执行结果,也就是目前这个账户的代币余额。
可能的错误情況
说明一点,因为数据传输是用JSON 格式,所以要加上 “”。如果忘了 “” 就会在 log 中看到错误提示:
执行合约— 转移代币
- 选择要输出的账户
选择刚刚发起的合约的账户。
- 输入要转入的账户
选择並复制另一个账户。在合约界面transfer 后面的输入位置,输入转入账户和要转移的代币数量。账户同样需要用 “” 括起來,示例:
“0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db”, 10
- 点击 transfer
点击transfer,成功后会看到 log 更新。
- 确认余额更新
这时在查询转入账户的余额,就可以看到代币余额增加啦!
错误情況
如果选择要转出的账户代币余额不足,这个交易就会失败,会在log 看到错误提示。
在测试网络部署合约
- 安裝 MetaMask
首先,要连到测试网络,这就要安裝MetaMask。它是浏览器端的Ethereum 钱包,可以连結 Ethereum 公共和测试网络。安装后需要建立 Ethereum 账号,这个这里就不细讲了。
成功启动后是这样的。
我们选择Ropsten Test Net
- 选择测试网络
回到Remix,这次 Environment 选择 Injected Web3,Remix 会自动连接 MetaMask。
成功连接后会看到和MetaMask 相同账号和 Ether 余额
- 部署合约
接着用同样的方式,按create 部署合约,就会看到 MetaMask 的弹出窗口。直接按 submit 发送交易。
稍等片刻(需要等交易被确认),部署成功后合约的使用界面就会出来。
ok,现在可以用同样的方式使用合约啦!
总结下
Remix 提供一个 Solidity 智能合约的开发环境,可以方便的编译、部署、执行甚至找错,适合编程经验不多的初学者。但无法做到版本控制、测试及和其他开发工具一起使用等,实际上要开发 DApp,使用 Truffle3、Ganache、web3.js 来编译和部署合约比较方便和专业些更适合开发人员。
相关文章:

Java之Array(数组)说明
代码说明: 1 package array;2 3 import java.util.ArrayList;4 import java.util.Arrays;5 import java.util.List;6 7 /**8 * Array使用说明:9 * 内容: 10 * 1、Array实例化; 11 * 2、Array与ArrayList转换; 12 …

创建操作/删除多行数据的UITableView的细节
首先注意需要重写-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 这里需要注意的是返回的结果应该是 return UITableViewCel…

每天进步一点点——Linux
http://blog.csdn.net/cywosp/article/category/443566/1转载于:https://www.cnblogs.com/zengkefu/p/5586780.html

用Go 构建一个区块链 -- Part 5: 地址
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 比特币地址 这就是一个真实的比特币地址:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa。这是史上第一个比特币地址,据说属于…

iOS 9 适配系列教程
转自:http://www.cocoachina.com/ios/20150703/12392.html 本文是投稿文章,作者:ChenYilong(https://github.com/ChenYilong/iOS9AdaptationTips) Demo1_iOS9网络适配_改用更安全的HTTPS iOS9把所有的http请求都改为ht…

AutoMocker单元测试
/// <summary>/// 测试获取所有物流/// </summary>[TestMethod]public void TestExpressController(){var Expresss new List<Express> { new Express{Code"01",Name"测试物流"}}.AsQueryable();var mocker new AutoMocker();mocker.U…

CSS.text不被选中
1、 text{-moz-user-select: none; /*火狐*/-webkit-user-select: none; /*webkit浏览器*/-ms-user-select: none; /*IE10*/-khtml-user-select: none; /*早期浏览器*/-o-user-select: none; /* Opera*/user-select: none;} 2、user-select - CSS3参考手册.html(htt…

一个Solidity源文件的布局
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 源文件可以包含任意数量的合约定义,include指令和pragma伪指令。 Pragma 版本 源文件可以(并且应该)使…

iOS 数字滚动 类似于老 - 虎- 机的效果
效果图 具体实现代码如下 ZCWScrollNumView.h文件 #import <UIKit/UIKit.h>typedef enum {ZCWScrollNumAnimationTypeNone,ZCWScrollNumAnimationTypeNormal,ZCWScrollNumAnimationTypeFromLast,ZCWScrollNumAnimationTypeRand,ZCWScrollNumAnimationTypeFast } ZCWScro…

序列化模块--json模块--pickle模块-shelve模块
什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传播到远程,因为硬盘或网络传输时只能接受bytes 例: 把内存数据 转成字符 # data {# roles:[# {role:monster,type:pip,life:5…

UITextView添加占位字符
#import "YGTextView.h"#define kPlaceholderDefaultTopMargin 4 // Placeholder上下间距#define kPlaceholderDefaultLeftMargin 5 // Placeholder左右间距implementation YGTextView#pragma mark - 初始化PlaceholderTextView- (instancetype)initWithFrame…

手把手教你搭建智能合约测试环境、开发、编译、部署以及如何通过JS调用合约方法
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 学习目标 了解智能合约 简单环境搭建 能够利用solidity编写Hello World合约 合约部署 和合约互动 使用solidity语言撰写智能合约 …

洛谷P3159 [CQOI2012]交换棋子
巧妙的拆点方式,首先把1看成黑点,0看成空的,几次交换就可以看成一条路径 1)从容量上看,这条路径为1-2-2-2-2-2-……-2-1 2)从费用上看,这条路径每条边费用都是1 于是用一种巧妙的拆点方式&#…

趣谈iOS运行时的方法调用原理
一个成熟的计算机语言必然有丰富的体系,复杂的容错机制,处理逻辑以及判断逻辑。但这些复杂的逻辑都是围绕一个主线丰富和展开的,所以在学习计算机语言的时候,先掌握核心,然后了解其原理,明白程序语言设计的…

GCD实现倒计时
__block int timeout59; //倒计时时间dispatch_queue_t queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_source_t _timer dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);dispatch_source_set_timer(_timer,dispatch_wall…

Solidity基础入门知识(十)函数的访问权限和可见性
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 下面来继续介绍作为一个分布式网络语言所特有的internal和external这两种不同的函数调用方式,以及Solidity提供的对函数调用时的…

Sass (Syntactically Awesome StyleSheets)
Sass (Syntactically Awesome StyleSheets) Sass 是对 CSS 的扩展,让 CSS 语言更强大、优雅。 它允许你使用变量、嵌套规则、 mixins、导入等众多功能, 并且完全兼容 CSS 语法。 Sass 有助于保持大型样式表结构良好, 同时也让你能够快速开始小…

键盘的相关设置
一、键盘风格 UIKit框架支持8种风格键盘。 typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 UIKeyboardTypeASCIICapable, // 支持ASCII的默认键盘 UIKeyboardTypeNumbersAndPunctuation, // 标准电…

python全栈开发基础【第十七篇】面向对象反射和内置方法
一、静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直…

区块链笔记分享
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链笔记分享:技术和数学基础: 高位的hash的逆向过程除了穷举,没有更有效的办法,这个过程在目前的计算能力下必然…

BZOJ4766: 文艺计算姬
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 737 Solved: 402[Submit][Status][Discuss]Description "奋战三星期,造台计算机"。小W响应号召,花了三星期造了台文艺计算姬。文艺计算姬比普通计算机有更多的艺术细胞。普通计算机能计算一个…

Android调用远程Service的参数和返回值都需要实现Parcelable接口
import android.os.Parcel;import android.os.Parcelable; public class Person implements Parcelable{ private Integer id; private String name; private String pass; public Person() { super(); } public Person(Integer id, String name, …

git的简单命令
git init 初始化管理库 git add file_name 将文件添加到文件管理库 git commit -m “xxx” 将文件提交到文件管理库(xxx:说明文字) git status 查看当前状态 git diff 查看文件改动的地方 git log 查看历史版本提交记录(如果觉…

区块链概念:Hash 算法
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 区块链概念1:Hash 算法 作用在学习哈希算法前,我们需要知道哈希在区块链的作用哈希算法的作用如下:区块…

java 文件操作
文件操作——File File表示目录信息 listFiles方法 File的listFiles方法用于返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。其方法定义: File[] listFiles()返回值:抽象路径名数组,这些路径名表示此抽象路径名表示的…

三维等值面提取算法(Dual Contouring)
上一篇介绍了Marching Cubes算法,Marching Cubes算法是三维重建算法中的经典算法,算法主要思想是检测与等值面相交的体素单元并计算交点的坐标,然后对不同的相交情况利用查找表在体素单元内构建相应的网格拓扑关系。Marching Cubes算法简单&a…

设置status bar的颜色
statusBar显示电池电量、时间、网络部分标示的颜色只能设置两种颜色: 默认的黑色(UIStatusBarStyleDefault)白色(UIStatusBarStyleLightContent) 配置info.plist文件 1.View controller-based status bar appearance…

EOS与以太坊有哪些区别?
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载。 以太坊是一个专门为开发和运行去中心化应用(DAPP)搭建的智能合约平台;EOS与以太坊类似,同样…

Quartz 2D基本图形的绘制
基本步骤: 1.获取绘图上下文 2.创建并设置路径 3.将路径添加到上下文 4.设置上下文状态 5.绘制路径 6.释放路径 #import "YGView.h" //屏幕尺寸#define kScreenSize [UIScreen mainScreen].bounds.size//屏幕宽高定义#define kscreenWidth [[UIScr…

命令行程序增加 GUI 外壳
Conmajia © 2012 Updated on Feb. 21, 2018 命令行大家都用过: 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳,实际效果参考图 2. 图 2 带 GUI 外壳的命令行程序 程序思路是这样的: 通过运行 cmd.exe 来操作命令行,…