本文默认智能合约所需要的相关环境Geth、Truffle、Solidity、Ganache等都是完备的!
主要介绍:

  1. Remix IDE环境如何与指定的链进行连接;
  2. 编译 部署与调试智能合约
  3. 使用 zeppelin-solidity

1.安装 Remix IDE

    npm install remix-ide -g

网络资料相关内容都没有作特别强调,故在此特别说明一下:
开发调试过程中,使用本地的环境相对而言,可以更加方便直观的与本地代码进行关联
安装好remix-ide后,可以在任意路径下运行命令行命令 remix-ide
然后打开网页 http://localhost:8080
左侧的menu按钮最后一个“连接到本地”, 点击之后,确认连接,左侧会多一个localhost工作目录
此目录即命令行运行 remix-ide 的路径, 也是智能合约代码路径(也就是DAPP开发的框架环境)

2.Geth启动节点命令及相关参数

   geth --datadir=data --networkid 55661 --port 2000 --rpc --rpcaddr 0.0.0.0 --rpcapi “db,eth,net,web3,personal” --rpcport 8102 --rpccorsdomain "*" --bootnodes "enode://0a2c7ee420570b3f6d59f214731d0d84aa5297f8b704939fd95ad643a752e34d7623a138e22b7849229b913c2b75b54ac3042dd008f0a3500a1ff2715cd9b4f1@192.168.80.30:30301" console

如果没有 --rpccorsdomain “*” 在remix-ide网页环境中无法连接到链!

*相关控制台命令参数说明:参见 https://learnblockchain.cn/2017/11/29/geth_cmd_options/

3.一个简单的存储智能合约

a.在SimpleStorage项目的contract路径下添加SimpleStorage.sol文件:

    pragma solidity ^0.4.23;contract SimpleStorage {uint myVariable;constructor() public {}//将值存储在该变量中function set(uint x) public {myVariable = x;}//查询存储的值function get() constant public returns (uint) {return myVariable;}}

b.在SimpleStorage项目的migrations路径下添加S2_deployed_simplestorage.js文件:

    var SimpleStorage = artifacts.require("SimpleStorage");module.exports = function(deployer) {deployer.deploy(SimpleStorage);};

c.在命令行下编译智能合约:

    truffle compile

d.打开truffle控制台

    truffle develop (启动了一个基于Ganache的控制台,内置于Truffle的本地开发区块链)Accounts:(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57(1) 0xf17f52151ebef6c7334fad080c5704d77216b732(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767dePrivate Keys:(0) c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3(1) ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f(2) 0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8ad91193c05875ef1(3) c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd85da83b71f772aa6c(4) 388c684f0ba1ef5017716adb5d21a053ea8e90277d0868337519f97bede61418(5) 659cbb0e2411a44db63778987b1e22153c086a95eb6b18bdf89de078917abc63(6) 82d052c865f5763aad42add438569276c00d3d88a2d062d36b2bae914d58b8c8(7) aa3680d5d48a8283413f7a108367c7299ca73f553735860a87b08f39395618b7(8) 0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07700d8669ff12b7c4(9) 8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362dcae9012b548b1e5

e.部署智能合约

    migrateUsing network 'develop'.Running migration: 1_initial_migration.jsDeploying Migrations...... 0xb70a114fd49735ef6c56ae86e329c38544c70729924e4f8f895e495d38ec3877Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0Saving successful migration to network...... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956Saving artifacts...Running migration: 2_deployed_simplestorage.jsDeploying SimpleStorage...... 0x1b0294e4b04df57c8ff79001943c913465dc687162553e2a4a2aa0e57dc9bd0cSimpleStorage: 0x345ca3e014aaf5dca488057592ee47305d9b3e10Saving successful migration to network...... 0xf36163615f41ef7ed8f4a8f192149a0bf633fe1a2398ce001bf44c43dc7bdda0Saving artifacts...此时执行get()函数:SimpleStorage.deployed().then(function(instance){return instance.get.call();}).then(function(value){return value.toNumber()});结果是 0 然后调用set()函数:SimpleStorage.deployed().then(function(instance){return instance.set(6);});存储的值就变为6了再次调用get()函数:SimpleStorage.deployed().then(function(instance){return instance.get.call();}).then(function(value){return value.toNumber()});结果是 6*如果需要

4. truffle 命令行下出现错误时如何debug ?

    正常情况下,logs里面是空的内容{ tx: '0x070e447c68b4337264ccfd83376e40d48f9c580a9a6e54694c7eb420326369ab',receipt: { transactionHash: '0x070e447c68b4337264ccfd83376e40d48f9c580a9a6e54694c7eb420326369ab',transactionIndex: 0,blockHash: '0xc7a1b8ee4bd6364d482576adae45c84caca8796b3cce59451eacf8038a097d2c',blockNumber: 16,gasUsed: 41669,cumulativeGasUsed: 41669,contractAddress: null,logs: [],status: '0x01',logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' },logs: [] }修改合约中的set函数:function set(uint x) public {myVariable = x;if (x%2 == 0) {emit Odd();} else {emit Even();}}重新编译部署 compile / migrate --reset再次执行set()函数:SimpleStorage.deployed().then(function(instance){return instance.set(4);});{ tx: '0x2cc0d39fc0bec51835df91343e64577b34ae335f7d998143349d5ab8b3d63181',receipt: { transactionHash: '0x2cc0d39fc0bec51835df91343e64577b34ae335f7d998143349d5ab8b3d63181',transactionIndex: 0,blockHash: '0x1ec12a731aff546eb84d87402cfc36f285c7e14faa9f6d14de22ea94f9434bfe',blockNumber: 11,gasUsed: 42514,cumulativeGasUsed: 42514,contractAddress: null,logs: [ [Object] ],status: '0x01',logsBloom: '0x00000000000000000000000000000000000000000000000002000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000800000000000000' },logs: [ { logIndex: 0,transactionIndex: 0,transactionHash: '0x2cc0d39fc0bec51835df91343e64577b34ae335f7d998143349d5ab8b3d63181',blockHash: '0x1ec12a731aff546eb84d87402cfc36f285c7e14faa9f6d14de22ea94f9434bfe',blockNumber: 11,address: '0xfb88de099e13c3ed21f80a7a1e49f8caecf10df6',type: 'mined',event: 'Odd',args: {} } ] }

此时logs中记录的是异常情况相关信息【具体原理尚未弄清~】
此时最重要的是:transactionHash: ‘0x2cc0d39fc0bec51835df91343e64577b34ae335f7d998143349d5ab8b3d63181’,
在truffle控制台下, debug 0x2cc0d39fc0bec51835df91343e64577b34ae335f7d998143349d5ab8b3d63181 连续回车
可以跟踪到相关代码

    !!! Truffle includes an integrated debugger so that you can debug transactions made against your contracts. This debugger looks and feels like existing command line debuggers available for traditional development environments.!!! Debugging a transaction on the blockchain is different than debugging traditional applications (for instance, applications written in C++ or Javascript). When debugging a transaction on the blockchain, you're not running the code in real-time; instead, you're stepping over the historical execution of that transaction, and mapping that execution onto its associated code. This gives us many liberties in debugging, in that we can debug any transaction, any time, so long as we have the code and artifacts for the contracts the transaction interacted with. Think of these code and artifacts as akin to the debugging symbols needed by traditional debuggers.

5.使用 zeppelin-solidity 发布 ERC-20标准Token

按照之前的步骤创建智能合约项目目录,并在初始化,然后安装 zeppelin-solidity

    sudo npm install zeppelin-solidity命令行下调用Token合约:let contract = ZTJCoin.deployed().then(instance => contract = instance);contract.name();contract.symbol();contract.decimals();contract.INITIAL_SUPPLY();contract.balanceOf("0x627306090abab3a6e1400e9345bc60c78a8bef57");contract.balanceOf("0xf17f52151ebef6c7334fad080c5704d77216b732");contract.transfer("0xf17f52151ebef6c7334fad080c5704d77216b732",8888);contract.balanceOf("0x627306090abab3a6e1400e9345bc60c78a8bef57");contract.balanceOf("0xf17f52151ebef6c7334fad080c5704d77216b732");

6.使用OpenZeppelin的StandardToken来创建自己的TutorialToken【ERC20】

    添加TutorialToken.sol文件pragma solidity ^0.4.24;import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";contract TutorialToken is StandardToken {string public name = 'TutorialToken';string public symbol = 'TT';uint public decimals = 2;uint public INITIAL_SUPPLY = 12000;constructor() public {totalSupply_ = INITIAL_SUPPLY;balances[msg.sender] = INITIAL_SUPPLY;}}

在上面的代码中,import了StandardToken.sol,并声明TutorialToken继承自StandardToken。这样就继承了StandardToken合约中所有变量和函数。继承的合约可以被覆盖,只要在子类重定义对应的变量与函数就行了。

接下来,设置Token的参数,需要定义自己的name,symbol,decimals和INITIAL_SUPPLY。

添加2_deploy_contracts.js文件

    var TutorialToken = artifacts.require("./TutorialToken.sol");module.exports = function(deployer) {deployer.deploy(TutorialToken);};

启动Ganache 配置app.js的端口与Ganache端口一致
truffle console 启动并连接上Ganache内部的链
项目初始化时已经安装了lite-server
npm run dev 运行dapp程序, 即可以执行账户转账相关的操作了


往期精彩回顾:
区块链知识系列
密码学系列
零知识证明系列
共识系列
公链调研系列
比特币系列
以太坊系列
EOS系列
联盟链系列
Fabric系列
智能合约系列
Token系列

以太坊系列 - 智能合约开发与调试相关推荐

  1. 基于以太坊的智能合约开发教程Solidity modifier

    基于以太坊的智能合约开发教程Solidity modifier pragma solidity ^0.4.0;contract modifierTest{address owner;uint publ ...

  2. 以太坊Python智能合约开发指南

    在以太坊上获得一个基本的智能合约是一个很简单的事,只需google查询"ERC20代币教程",你会发现有关如何做到这一点的大量信息.以编程方式与合约交互完全是另一回事,如果你是一个 ...

  3. 以太坊ETH-智能合约开发-solidity源码分析-truffle进阶

    0. 背景 上一篇文章我们从合约编写.编译.部署.交互等几个方面介绍了truffle的大致用法. 本篇主要继续深入地介绍truffle的高级用法 + 合约源码分析 1. 将合约部署到测试网Ropste ...

  4. 以太坊solidity智能合约-生成随机数

    Solidity随机数生成 在以太坊的只能合约中,没有提供像其他面向对象编程一样的生成随机数的工具类或方法.其实,所谓的随机数也是伪随机的,没有哪一种语言能够真正的生成随机数. 对于solidity来 ...

  5. java计步器算法_区块链+计步运动项目,主要采用以太坊、智能合约、springboot以及小程序等技术...

    runlife_api 项目介绍 区块链+计步运动项目,主要采用以太坊.智能合约.springboot以及小程序等技术 兑换步数算法 按照每总量剩余一半的时候兑换难度增加一倍,如目前按照平均步数511 ...

  6. 以太坊EVM智能合约中的数据存储

    目录 EVM基本信息 数据管理 Stack Args Memory Storage 固定长度的值 动态长度数组 Mappings 复杂类型的组合 总结 EVM基本信息 以太坊是一种基于栈的虚拟机,基于 ...

  7. python如何使用web3py与以太坊投资智能合约交互

    在以太坊和其他区块链中,仍有很多被证明的概念正在实施,开发人员在尝试如何应对这些新概念.作为dInvest 系列文章一部分,我也在研究以太坊并尝试在区块链中实施对冲基金.在上一篇文章中,我讨论了如何在 ...

  8. 区块链工作原理(区块链治理系统、比特币、以太坊、智能合约)

    文章目录 Blockchain Governance System On-Chain Governance Off-Chain Governance BitCoin Blockchain Ethere ...

  9. 使用C# 和基于.Net的以太坊库Nethereum以太坊及智能合约交互实战篇(一)

    官网:Nethereum官网 Github地址:Github上的Nethereum库 简介: Nethereum是用于Ethereum的.Net集成库,可简化智能合约管理以及与以太坊节点的交互,无论这 ...

最新文章

  1. 通过Google挖掘细分市场的一个案例
  2. 输入/输出延迟单元( IODELAY)简介
  3. Vuex 2.0 源码分析
  4. 数据更新播报php程序,使用thinkPHP实现数据更新一例【原创】
  5. docker+httpd的安装
  6. 让您的Xcode键字如飞
  7. 理解ASP.NET Core中的中间件
  8. 上海大学计算机组成原理实验13,上海大学计算机组成原理实验报告11.doc
  9. 设计模式学习笔记--Flyweight享元模式
  10. 形式验证进阶 chipdriver_【饥荒进阶】烹饪基础:全食材系数详解-五耀整理
  11. POJ 3134 - Power Calculus (IDDFS)
  12. 线性查找与二分查找的平均查找次数的比较
  13. ppt竖排文字方向HTML 5,PPT文本框中文字方向的设置方法是什么
  14. 魔板游戏java_Java魔板游戏完整代码及注释
  15. 英雄之盾-第11届蓝桥杯Scratch省赛真题第4题
  16. OpenCV基础矩阵求解解析笔记
  17. 最全的100个Python精选库,建议收藏!
  18. 2017今日头条校招——或与加
  19. 思考与总结【3】:专注于一件事
  20. 判断QQ号码长度是否“合法”?让小白来告诉你

热门文章

  1. 菱形程序设计以及宏定义的应用
  2. 一个数如果恰好等于它的因子(因子:即能够整除的数)之和,这个数就称为“完数”。 例如 6=1+2+3 28=1+2+4+7+14 编程找出10000以内的所有完数。
  3. java多线程 wait和notify方法
  4. 常用前端技术有哪些?
  5. python文件拓展名是_python文件扩展名是什么
  6. 《C专家编程》读书笔记3
  7. 【高等数学】抛物线图像的画法
  8. 计算机毕业设计SSM仿咸鱼二手物品交易系统【附源码数据库】
  9. 计算机作品大赛微课,我校微课作品获2018年中国大学生计算机设计大赛二等奖...
  10. 一文回顾区块链修订WTO电子商务禁令的影响