以太坊开发教程 利用truffle发布宠物商店 DAPP 到 以太坊测试环境Ropsten

 1.环境安装  

 1) node安装

设置镜像地址:  curl --silent --location https://rpm.nodesource.com/setup_8.x|bash -

下载安装yum -yinstall nodejs

node -v 查看版本:

2)安装truffle  

$npm install -g truffle

3)安装python

npm install python

2.创建truffle项目

我的项目安装在 /usr/local下、

所以分别执行下面三个命令:  1)cd /usr/local

     2)mkdir pet_test  //创建项目文件地址


           3) truffle 帮我们打包了一些常用的经典示例,放在box中, 这个是我们用到的pet_shop的地址:https://truffleframework.com/boxes/pet-shop

    执行: truffle unbox pet-shop

这个命令会自动帮我们初始化 truffle init,然后创建前端的文件夹。

介绍一下truffle的文件架构:

contracts/ : 智能合约文件存在这里,后缀.sol (solidity)

migrations/ : 部署脚本

test/ : 测试脚本

truffle.js :truffle的配置文件

编写智能合约:

在 contracts/ 目录下创建 Adoption.sol 文件,内容如下:


pragma solidity ^0.4.17;

contract Adoption {

address[16] public adopters;

//adopting a pet

function adopt(uint petId) public returns (uint) {

require(petId >= 0 && petId <= 15);

adopters[petId] = msg.sender;

return petId;

}

//retrieve the adopters

function getAdopters() public view returns (address[16]) {

return adopters;

}

}

编写前端:

用户界面(UI)是前端工作,这里用的javascript。主要文件是app.js,存在目录 /src/js/app.js 中。文件内容如下:


App = {

web3Provider: null,

contracts: {},

init: function() {

// Load pets.

$.getJSON('../pets.json', function(data) {

var petsRow = $('#petsRow');

var petTemplate = $('#petTemplate');

for (i = 0; i < data.length; i ++) {

petTemplate.find('.panel-title').text(data[i].name);

petTemplate.find('img').attr('src', data[i].picture);

petTemplate.find('.pet-breed').text(data[i].breed);

petTemplate.find('.pet-age').text(data[i].age);

petTemplate.find('.pet-location').text(data[i].location);

petTemplate.find('.btn-adopt').attr('data-id', data[i].id);

petsRow.append(petTemplate.html());

}

});

return App.initWeb3();

},

initWeb3: function() {

// Is there an injected web3 instance?

if (typeof web3 !== 'undefined') {

App.web3Provider = web3.currentProvider;

} else {

// If no injected web3 instance is detected, fall back to Ganache

App.web3Provider = new Web3.providers.HttpProvider('http://localhost:7545');

}

web3 = new Web3(App.web3Provider);

return App.initContract();

},

initContract: function() {

$.getJSON('Adoption.json', function(data) {

// Get the necessary contract artifact file and instantiate it with truffle-contract

var AdoptionArtifact = data;

App.contracts.Adoption = TruffleContract(AdoptionArtifact);

// Set the provider for our contract

App.contracts.Adoption.setProvider(App.web3Provider);

// Use our contract to retrieve and mark the adopted pets

return App.markAdopted();

});

return App.bindEvents();

},

bindEvents: function() {

$(document).on('click', '.btn-adopt', App.handleAdopt);

},

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);

});

},

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 account

return adoptionInstance.adopt(petId, {from: account});

}).then(function(result) {

return App.markAdopted();

}).catch(function(err) {

console.log(err.message);

});

});

}

};

$(function() {

$(window).load(function() {

App.init();

});

});


到这里 整个项目的前端和合约部分都完成了。下面讲述如何编译部署合约和如何启动前端应用。

因为部署是要把合约部署到ropsten的测试网络上,所以要提前配置好。部署就需要消耗gas,那么就需要指定账号。打开truffle的配置文件 truffle.js。修改内容为:

var HDWalletProvider = require("truffle-hdwallet-provider");

var mnemonic = "bomb when antenna suggest submit kitten thumb lazy silent uncover ten seek";

module.exports = {

networks: {

ropsten: {

provider: function() {

return new HDWalletProvider(mnemonic, "https://ropsten.infura.io/b59397a69a0f4639b4c70e9786a9db1f")

},

network_id: 3

}

}

};

详细解释一下 HDWalletProvider,mnemonic , https://ropsten.infura.io/b59397a69a0f4639b4c70e9786a9db1f。

HDWalletProvider 需要提前安装: 

npm install truffle-hdwallet-provider

我在执行过程中报错:


 因为我是centOs系统,执行安装gcc:


yum -y update gcc

yum -y install gcc+ gcc-c++


 mnemonic 是你账号的助记词,是通过metaMask获取的:


显示的Your private seed phrase就是你的助记词。替换到这个变量中。


 https://ropsten.infura.io/b59397a69a0f4639b4c70e9786a9db1f中,b59397a69a0f4639b4c70e9786a9db1f是你在infura的秘钥。

Infura是一个托管的以太坊节点集群,可以将你开发的以太坊智能合约部署到infura提供的节点上,而无需搭建自己的以太坊节点。到这个地址注册:https://infura.io/ 在dashborad里找到自己的秘钥拷贝过来。




编译部署合约

1.首先执行 truffle compile 

这里是编译合约 把合约编译成对应的ABI  二进制文件。

2. 下面要部署合约,教程的目的是把合约部署到 ropsten的测试网络上。结合truffle.js中的配置,读者可以更好的理解部署命令:

truffle migrate --network ropsten

到这里你的合约就成功部署完成了。


因为pet_shop是一个打包好的文件,所以只需要执行 npm run dev 就可以启动。默认的端口是3000,这个是lite sever 默认的端口。


启动好以后就可以通过地址访问了。注意我上面External 后面的IP是阿里云的内网ip,需要替换成外面的ip访问:http://120.55.51.210:3000/

然后可以通过钱包提交对合约的方法调用请求。



 至此,一个部署在Ropsten测试完的DAPP就部署完成了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容