开发环境

我在ubuntu环境下开发的,建议装好vscode,nodejs 。选用别的编译器也可以。

装好nodejs后装一下truffle。

npm install -g truffle
truffle version

可以看到版本号,说明安装成功。

开发语言

本文选用solidity,现在以太坊智能合约开发主流语言,不过比较新东西,和c++ java python这些成熟语言相比用起来没那么方便。想学的话推荐一个网站,加密僵尸,通过做一个游戏来引导solidity入门。如果英语好的话可以看看官方文档:solidity官方文档。这个文档也有中文版,但是更新慢一点solidity文档中文版。

另外还用了nodejs,不过我不太熟悉js……有点尴尬。

编译测试

新建一个空文件夹,比如叫pet-shop。然后进入文件夹

truffle unbox pet-shop

解释一下,trufflebox 给大家提供一些模板,这里可以看到。当然也可以自己新建一个空的工程,我会在另一篇博客做讲解。这个unbox时间比较长,结束后大概这个样子:

看一下工程目录:

contracts:智能合约文件夹

migrations:用于部署的脚本

node_modules:nodejs

src:前端资源

test:单元测试

bs-config.json:lite-server的配置文件

package.json:nodejs依赖

truffle.js:不用解释

代码编写与发布

contract下新建Adoption.sol:

pragma solidity ^0.4.16;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Adoption.sol";
contract TestAdoption {Adoption adoption = Adoption(DeployedAddresses.Adoption());   function testUserCanAdoptPet() {      uint returnedId = adoption.adopt(8);       uint expected = 8;Assert.equal(returnedId, expected, "Adoption of pet ID 8 should be recorded.");}   function testGetAdopterAddressByPetIdInArray() {       address expected = this;address[16] memory adopters = adoption.getAdopters();Assert.equal(adopters[8], expected, "Owner of pet ID 8 should be recorded.");}
}

如果你用的是vscode,那么有时候会出现一些奇怪的错误提示,比如什么换行空格,solidity版本之类的,可以忽略不计,没有python那么严格。比如下图这样的:

migrations下新建2_deploy_contracts.js

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

终端输入truffle develop 进入truffle 控制台.

在truffle控制台输入compile进行编译:

输入migration进行发布。

测试

单元测试还是必要的,当然你要有把握没bug不测也没事。

test下新建TestAdoption.sol.

pragma solidity ^0.4.16;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Adoption.sol";
contract TestAdoption {Adoption adoption = Adoption(DeployedAddresses.Adoption());   function testUserCanAdoptPet() {      uint returnedId = adoption.adopt(8);       uint expected = 8;Assert.equal(returnedId, expected, "Adoption of pet ID 8 should be recorded.");}   function testGetAdopterAddressByPetIdInArray() {       address expected = this;address[16] memory adopters = adoption.getAdopters();Assert.equal(adopters[8], expected, "Owner of pet ID 8 should be recorded.");}
}

回到truffle控制台,输入test指令进行测试。

前端交互

工程已经帮我们写好了html并定义好了一些js函数,完成剩下部分即可.

打开js/app.js文件。看到有如下函数:

init:读取json并初始化页面,这也是唯一一个已经写好的函数

接下来的函数要自己添加daima

initweb3:初始化web3(web3.js是用来与以太坊智能合约交互的)

 
 initWeb3: function() {// Is there is an injected web3 instance?if (typeof web3 !== 'undefined') {App.web3Provider = web3.currentProvider;} else {// If no injected web3 instance is detected, fallback to the TestRPCApp.web3Provider = new Web3.providers.HttpProvider('http://localhost:8545');}web3 = new Web3(App.web3Provider);return App.initContract();},

initContract:初始化智能合约

initContract: function() {$.getJSON('Adoption.json', function(data) {// Get the necessary contract artifact file and instantiate it with truffle-contractvar AdoptionArtifact = data;App.contracts.Adoption = TruffleContract(AdoptionArtifact);// Set the provider for our contractApp.contracts.Adoption.setProvider(App.web3Provider);// Use our contract to retrieve and mark the adopted petsreturn App.markAdopted();});return App.bindEvents();},

bindEvents:绑定点击事件

  bindEvents: function() {$(document).on('click', '.btn-adopt', App.handleAdopt);},

markAdoption:根据领养情况更新UI

markAdopted: function(adopters, account) {var adoptionInstance;App.contracts.Adoption.deployed().then(function(instance) {adoptionInstance = instance;return adoptionInstance.getAdopters.call();}).then(function(adopters) {for (i = 0; i < adopters.length; i++) {if (adopters[i] !== '0x0000000000000000000000000000000000000000') {$('.panel-pet').eq(i).find('button').text('Success').attr('disabled', true);}}}).catch(function(err) {console.log(err.message);});},

handleAdoption:处理领养事件

  handleAdopt: function(event) {event.preventDefault();var petId = parseInt($(event.target).data('id'));var adoptionInstance;web3.eth.getAccounts(function(error, accounts) {if (error) {console.log(error);}var account = accounts[0];App.contracts.Adoption.deployed().then(function(instance) {adoptionInstance = instance;// Execute adopt as a transaction by sending accountreturn adoptionInstance.adopt(petId, {from: account});}).then(function(result) {return App.markAdopted();}).catch(function(err) {console.log(err.message);});});}

这些代码比较简单没啥可说的吧……

关于html页面,引用的jquery是在线的,可能也需要梯子,因此我替换成了:

<scriptsrc="http://code.jquery.com/jquery-2.2.4.js"integrity="sha256-iT6Q9iMJYuQiMWNd9lDyBUStIq/8PuOW33aOqmvFpqI="crossorigin="anonymous"></script>

metamask与实际运行

为了在浏览器运行dapp需要一个叫metamask的插件。地址:https://metamask.io/.我用的chrome浏览器。可能需要梯子,不过我已经放到github 上了,见文章末尾。

可以看到右上角有个小狐狸头像,点开,假装阅读并接受协议。

不要create,先import existing den.第一个框框输入助记词:candy maple cake sugar pudding cream honey rich smooth crumble sweet treat.然后再输入密码和确认密码.确认,看到界面如下:

显然最好不要用公网测试,除非你是V神。所以自己搞一个,点击custom RPC

在main ethereum network 输入http://localhost:9545. 保存.

点击setting左侧箭头,回到主页。

回到linux终端,不是truffle终端,进入工程目录下输入npm run dev启动项目.

上github

以太坊智能合约开发(truffle box pet-shop为例)相关推荐

  1. 以太坊智能合约开发第七篇:智能合约与网页交互

    原文发表于:以太坊智能合约开发第七篇:智能合约与网页交互 上一篇中,我们通过truffle开发框架快速编译部署了合约.本篇,我们将来介绍网页如何与智能合约进行交互. 编写网页 首先我们需要编写一个网页 ...

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

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

  3. 一起学:以太坊智能合约开发

    课程介绍 无论在科技圈还是金融圈,"区块链"俨然成了最热的词汇.2016年,区块链写入了国家的十三五规划中:2017年,央行基于区块链技术的数字票据交易平台测试成功:同年,工信部发 ...

  4. 基于以太坊智能合约开发

    1.学习solidity语言.官网学习网址,https://solidity-cn.readthedocs.io/zh/develop/introduction-to-smart-contracts. ...

  5. 以太坊智能合约开发:让合约接受转账

    以太坊智能合约开发:让合约接受转账 在以太坊智能合约开发中,通常会有向合约地址进行转账的需求,那么有几种向合约地址进行转账的方式呢? 有三种方式: 部署合约时转账 调用合约提供的方法 直接向合约地址进 ...

  6. 以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明

    以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明 为了让你的Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3.对象.底层实 ...

  7. 《如何五分钟创建自己的新币token 》Dapp开发 Web3+以太坊+智能合约开发 (一)

    Dapp开发 Web3+以太坊+智能合约开发 (一)如何创建自己的新币token 前言 就是想开发一个Dapp,实现一下功能.未来有可能的话建立一下自己的社区.话不多说直接开始: 开发自己的ETH代币 ...

  8. 以太坊智能合约开发(四):Solidity转账智能合约实验

    以太坊智能合约开发(四):Solidity转账智能合约实验 1 合约编写 2 在线调试 1 合约编写 编写一个分布式转账智能合约,部署合约的人为合约管理员,只有管理员可以为其他用户发放代币,其他用户之 ...

  9. 以太坊智能合约开发 | 一个资深技术专家的心路历程

    原创: 杨镇 一块链习社区 微信号yikuailianxishequ 本文作者杨镇, 以太坊黄皮书中译者,资深以太坊专家.曾独立中译了以太坊 Homestead 官方文档,Solidity 官方文档中 ...

最新文章

  1. 2018年中国人工智能100强研究报告
  2. [转]微服务(Microservice)那点事
  3. 残差网络(Residual Networks, ResNets)
  4. 上传文件 微信小程序input_快速上手微信小程序UI框架
  5. 模拟命令行自动输入的HTML,HTML5 命令行界面仿真和自动打字动画
  6. ORA-01031 权限不足-过程中DBA 角色用户无法执行DDL
  7. 浩然GG和女朋友的游戏 (数学,规律)
  8. Oracle入门(十四A)之PL/SQL 基本结构
  9. C/C++继承与派生
  10. Python面试题大全(二):python高级语法
  11. 音乐播放小程序demo
  12. index函数python什么意思_详解python中的index函数用法
  13. markdown数学公式(MathJax)
  14. k8s之无状态服务Deployment1
  15. 机器人杆长标定_机器人标定系统
  16. Buffon投针实验 · 数学的直观理解 · 基础知识很重要
  17. STM32 编码器驱动/旋转编码器旋钮encoder
  18. 微信开发者工具 页面颜色调整(多与黑白)
  19. 注册美国本土公司和离岸公司有什么不同
  20. 阅读感悟《给中年程序员的温暖人心的巴比奇的故事》

热门文章

  1. 神经网络基础01-从神经元到深度学习
  2. redis集群节点连不上的原因之一
  3. linux创建出口dns,Linux创建智能DNS
  4. FUI- 我离钢铁侠还差几步?
  5. 将stdout重定向到Python中的文件?
  6. EPEL到底是什么,为何经常要安装epel-release软件包
  7. python 函数的嵌套定义 and 函数的返回值是函数
  8. Python创建进程类Process
  9. 监听U盘插入 拔出 消息,获得U盘盘符
  10. Xamarin Android 打造属于自己的博客园APP