一、安装以太坊合约编译环境

安装solc

智能合约代码的编译可以通过第三方平台或者软件。不过,为了安全起见,还是搭建自己的编译器比较好。(But be aware that if the compiler is compromised, your contract is not safe. )按照下面的步骤来安装编译器solc。

sudo add-apt-repository ppa:ethereum/ethereum
sudo apt update
sudo apt install solc

二、编写第一个智能合约

下面实现了一个非常简单的智能合约。使用solidity语言。

pragma solidity ^0.4.13;contract Simple {function arithmetics(uint _a, uint _b) returns (uint sum, uint product) {sum = _a + _b;product = _a * _b;}function multiply(uint _a, uint _b) returns (uint) {return _a * _b;}
}

三、部署智能合约

3.1 编译智能合约

solc -o . --bin --abi simple.sol

下图是编译结果,可以看到生成了Simple.abi接口文件和Simple.bin二进制编译文件:

用cat可以看到编译后的文件内容。

3.2 编辑智能合约编译结果,生成加载脚本

对于编译输出的abi文件和bin文件,需要做如下处理,才能够加载到geth里面并执行。 1. 对于abi文件,做如下的包围编辑。

var simpleContract = eth.contract([原来abi内容])
var simpleContract = eth.contract([{"constant":false,"inputs":[{"name":"_a","type":"uint256"},{"name":"_b","type":"uint256"}],"name":"multiply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_a","type":"uint256"},{"name":"_b","type":"uint256"}],"name":"arithmetics","outputs":[{"name":"sum","type":"uint256"},{"name":"product","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}])

下面是编辑结果的拷屏。

  1. 对于bin文件,做如下的包围编辑。
personal.unlockAccount(eth.accounts[0])
// 不同的合约有自己的实例名字,要注意区分。这里是simple 。
var simple = simpleContract.new(
{ from: eth.accounts[0],
data: "0x(原来的bin内容)",
gas: 500000
})

注意这里的gas汽油费,如果只是发现一个很简单的智能合约,50万wei还可以。 编辑后的结果如下:

3.3 加载脚本

进入geth控制台,执行如下的命令。

# 进入geth控制台
geth attach /data/00/geth.ipc
# 加载脚本
> loadScript("contract/Simple.abi")
> loadScript("contract/Simple.bin")

加载bin之后,如果不进行挖矿,会一直处于pending状态,合约不能真正执行。

可以看到address是undefined。 挖矿成功后,address就会写上实际的合约地址。

4. 执行智能合约

执行结果如下图。

四、发行代币

1. 写标准ERC代币的智能合约

使用solidity 语言,写一个实现标准ERC20接口的代币发行智能合约。

pragma solidity ^0.4.20;contract ERC20{string public name;string public symbol;uint8 public decimals;uint public totalSupply;mapping(address => uint256) internal balances;mapping (address => mapping(address => uint256)) internal allowed;event Transfer(address indexed _from, address indexed _to, uint256 _value);event Approval(address indexed _owner, address indexed _spender, uint256 _value);constructor() public{name = "MeiToken";symbol = "MTK";// 本货币使用最大小数位数(定义货币最小单位)decimals = 2;// 总数为10亿totalSupply = 1000000000*10**uint(decimals);balances[msg.sender] = totalSupply;}// 获取指定账户余额function balanceOf(address tokenOwner) public constant returns (uint balance) {return balances[tokenOwner];}// 转账到指定账户function transfer(address _to, uint256 _value) public returns (bool success){success = false;// 地址不能为0require(_to != address(0));// 目标地址不能跟sender相同require(msg.sender != _to);require(balances[msg.sender] >= _value);require(balances[_to] + _value > balances[_to]);balances[msg.sender] -= _value;balances[_to] += _value;emit Transfer(msg.sender, _to, _value);success = true;}// 从一个账户转账到另外一个账户function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){require(_to != address(0));require(balances[_from] >= _value);require(allowed[_from][msg.sender] >= _value);require(balances[_to] + _value > balances[_to]);balances[_from] -= _value;balances[_to] += _value;emit Transfer(_from, _to, _value);success = true;}// 授权指定账户从本账户可以取现的额度function approve(address _spender, uint256 _value) public returns (bool success){allowed[msg.sender][_spender] = _value;emit Approval(msg.sender, _spender, _value);success = true;}// 查询给某个账户授权取现额度function allowance(address _owner, address _spender) view public returns (uint256 remaining){return allowed[_owner][_spender];}
}

2. 部署代币智能合约

按照第三节的方式完成代币智能合约的编译和结果编辑,并进行加载。 注意ERC20.bin里面需要的gas汽油费,由于智能合约有点复杂,50万wei不够。50万wei连待处理列表都进不去。 如下所示:

> txpool.status
{pending: 0,queued: 0
}

也没有错误提示。最后设置为200万wei才成功。

# 编译智能合约
solc -o . --bin --abi ERC20.sol
# 按照3.2的介绍,编辑智能合约编译结果,生成加载脚本。
# 进入geth控制台
geth attach /data/00/geth.ipc
# 加载代币智能合约相关文件
> loadScript("contract/ERC20.abi")
> loadScript("contract/ERC20.bin")

3. 代币测试

挖矿成功后,address内容填上了。

执行情况:

> erc20.balanceOf.call(eth.accounts[0])
100000000000
> erc20.balanceOf.call(eth.accounts[1])
0
> erc20.symbol.call()
"MTK"
> erc20.name.call()
"MeiToken"
>
> personal.unlockAccount(eth.accounts[0])
Unlock account 0x4d82606518349bcfc1afb4dcf54415f4bd2bed47
Passphrase:
true
> erc20.transfer.sendTransaction(eth.accounts[1],500000,{from:eth.accounts[0]})
"0xde4166620cd352ddcf612a649cb4ac67c530cb710fe064b0d63b34c8ba2bf3ac"
> txpool.status
{pending: 1,queued: 0
}
> txpool.status
{pending: 0,queued: 0
}
> erc20.balanceOf.call(eth.accounts[1])
500000
> erc20.balanceOf.call(eth.accounts[0])
99999500000

下面是执行结果拷屏:

容易掉坑之1:call()与sendTransaction()没有分清。 执行的时候,对于不需要修改内容的调用,可以使用call()函数来调用合约的方法。--其实这种情况也可以直接跳过call()都可以。 对于需要修改内容的调用,需要使用sendTransaction来发起一笔交易,并支付交易燃料费。 我开始使用erc20.transfer.call(eth.accounts[1],500000)来发起转账,调用结果返回true,但是账户余额根本没有变。耗费了我几乎一天的时间。 call与sendTransaction的区别详情可以参考网页What is the difference between a transaction and a call?

容易掉坑之2:sendTransaction操作中没有指定支付gas燃料的账户 跟call不一样,仅仅有本身的调用参数不够,需要知道支付gas燃料的账户。 即最后追加一个参数{from:address}

容易掉坑之3:sendTransaction操作中忘记解锁账户。 如果不解锁支付燃料的账户,转账也是不能成功的。

代币转账_手把手教你从源代码开始搭建多节点以太坊私链(五)部署智能合约及代币发行...相关推荐

  1. stm32l0的停止模式怎么唤醒_手把手教你怎么利用旧电脑搭建NAS组建自己的黑群晖...

    手把手教你怎么利用旧电脑搭建NAS组建自己的黑群晖 Synology 群晖科技(Synology )创立于 2000 年,自始便专注于打造高效能.可靠.功能丰富且绿色环保的 NAS 服务器,是全球少数 ...

  2. linux npm安装_手把手教你appium框架的搭建—linux

    总体来说,分为以下几步: 1.安装jdk 2.安装node和npm 3.安装android sdk 4.安装appium 5.安装pip及appium-python-client 以下是脚本 #!/b ...

  3. python开发个人博客_手把手教你用 Python + Flask 搭建个人博客

    Python 的语言特性使得自身编写 Web 框架极其容易,现在已经有上百种用 Python 编写的 Web 开发框架,其中用户量最大的两个就是 Django 和 Flask. Django 和 Fl ...

  4. 曲速未来 揭秘:以太坊区块链和ERC20代币的技术挑战

    区块链安全咨询公司 曲速未来 消息:在2018年,可以看到以太坊区块链的能力的许多进步.这些创新是由遍及庞大且不断发展的生态系统的以太坊和ERC20令牌项目推动的. 这些创新对于以太坊作为新标记的顶级 ...

  5. 【手把手】如何在10分钟内搭建一个以太坊私有链?

    在开发以太坊时,很多时候需要搭建一条以太坊私有链,这篇来自作者熊丽兵的文章,手把手教你10分钟内如何在Mac上进行搭建. 作者 | 熊丽兵 整理 | 科科 阅读本文前,你应该对以太坊语言有所了解,如果 ...

  6. 以太坊公链私链_如何使用以太坊构建汽车制造供应链系统

    以太坊公链私链 by Marcelo Russi Mergulhão 由Marcelo RussiMergulhão 如何使用以太坊构建汽车制造供应链系统 (How to build a car ma ...

  7. 软件_手把手教vscode配置c++,python开发环境

    原创:软件_手把手教vscode配置c++,python开发环境 之前主用Python作为项目开发语言,将项目迁移到arm边缘盒子上后发现arm的cpu不给力,软件速度低于预期,所以计划将部分程序改为 ...

  8. 基于以太坊发布属于自己的数字货币(代币)完整版

    https://blog.csdn.net/JAVA_HHHH/article/details/79771752 本文单纯从技术角度详细介绍如何基于以太坊ERC20创建代币的流程(此案例是部署的eth ...

  9. 以太坊构建DApps系列教程(六):使用定制代币进行投票

    在本系列关于使用以太坊构建DApps教程的第5部分中,我们讨论了如何为Story添加内容,查看如何添加参与者从DAO购买代币的功能以及在Story中添加提交内容.现在是编写DAO最终形式的时候了:投票 ...

最新文章

  1. 快速给shell脚本加上使用提示
  2. ls--查看文件或者目录的信息
  3. Python Django 表单类Form(py代码画form表单仅渲染页面)
  4. Python基础语法-三种函数特殊形参定义以及使用方式
  5. angular6的响应式表单
  6. 《走遍中国》珍藏版(十三)
  7. cannot load php5,Cannot load php5apache2_4.dll into server解决办法
  8. 终端软件_DMSTerminal现场管控终端软件正式发布
  9. html单击出现下拉菜单,*OnClick实现点击主菜单时出现下拉菜单,已实现但是有问题,求助!*...
  10. 2020胡润慈善榜揭晓:许家印以28亿元捐赠额成为中国首善
  11. FreeRTOS源码分析与应用开发10:内存管理
  12. 苹果id可以同时用两个手机吗_科技V报余承东:鸿蒙OS随时可用于手机;疑似魅族16s Pro通过3C认证20190809...
  13. Dynamics CRM 2015/2016 Web API:Unbound Custom Action 和 Bound Custom Action
  14. 多语言在线翻译工具Translatium for Mac
  15. 压缩感知中常用的待还原信号种类
  16. VS2010 配置PCL1.6.0AII in one 无法启动程序ALL_BUILD
  17. 先验 超验_先验 和 超验 名词解释
  18. 如何用个人电脑打造量子模拟器
  19. matlab里面求出两条曲线的交点问题
  20. 复赛后第一次正经写博客

热门文章

  1. 面试5家公司,我发现这80道面试题最好用,直中要害
  2. Spring Boot Admin 2.2.0发布,支持最新Spring Boot/Cloud之外,新增中文展示!
  3. 给喜欢写博、乐于交流的你们!
  4. 深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务
  5. 带来高收入的三大竞争力技巧,可以涨到40W了!
  6. asio::write RuntimeError
  7. update_by_query timeout
  8. python RuntimeError: maximum recursion depth exceeded
  9. VS项目中引入dll的方法
  10. Windows下部署最新版青龙、诺兰、傻妞入门保姆级教程