基于以太坊truffle框架实践去中心化竞标商城(一)

前言:
truffle:是一个基于以太坊快速开发智能合约的框架,省去了很多基础文件及基础代码的构建。官方还有宠物商城等等案例代码。
官方地址:http://truffleframework.com/

操作环境:阿里云的centos 7.0 (windows下试过,但是报错更加离谱)

先啰嗦一下我的观点,原本我以为truffle只是一个部署智能合约的框架,如果只能编写并部署智能合约,那其实用ethereum wallet客户端就可以直接编辑和部署了,相信很多刚入门的小伙伴也会有同样的困惑。truffle不仅仅是编写智能合约,还结合了具体应用,比如:web,可以真真切切的开发以太坊的落地应用。

好,搬好小板凳,准备好你的番茄闹钟,步骤实践约需要1个小时(前提是你的私链环境已搭建ok):

一、预热准备

1、安装nodejs,官网下载;
2、安装truffle框架

npm -g truffle

3、搭建以太坊私链环境
参见我之前的文章:https://www.jianshu.com/p/52332fa4a24c

二、初始化truffle webpack项目

命令:

//创建项目目录
mkdir Ebay
cd Ebay
truffle unbox webpack //这个时候会自动开始下载项目初始化代码

结果如下:


image.png
三、编写智能合约代码
cd contracts
rm -rf MetaCoin.sol //该文件用不到,删除掉即可
vi EbayStore.sol

代码如下:

pragma solidity ^0.4.18;
contract EbayStore{
uint public productIndex;
function EbayStore() public{
    productIndex =0;
}
enum ProductStatus{
    Open,Sold,Unsold
}
enum ProductCondition{
    New,Used
}

mapping(address=>mapping(uint=>Product)) stores;
mapping(uint=>address) productIdInStore;

struct Product{
    uint id;
    string name;
    string category;//分类
    string imageLink;
    string descLink;
    uint auctionStartTime; //开始竞标时间
    uint auctionEndTime; //结束竞标时间
    uint startPrice;//拍卖价格
    address highestBidder;//赢家的钱包地址
    uint highestBid; //竞标的价格
    address secondHighestBidder; //第二高出价人的钱包地址
    uint totalBids; //总共多少人参与竞标
    ProductStatus status;
    ProductCondition condition;
    // mapping(address => mapping(bytes32 => Bid)) bids;
}
function addProductToStore(string _name, string _category, string _imageLink, string _descLink, uint _auctionStartTime, uint _auctionEndTime, uint _startPrice, uint _productCondition) public{
    require(_auctionStartTime < _auctionEndTime);
    productIndex ++;
    Product memory product = Product(productIndex, _name, _category, _imageLink, _descLink, _auctionStartTime, _auctionEndTime, _startPrice, 0, 0, 0, 0, ProductStatus.Open, ProductCondition(_productCondition));
    stores[msg.sender][productIndex] = product;
    productIdInStore[productIndex] = msg.sender;
}
function getProduct(uint _productId) view public returns(uint,string,string,string,string,uint,uint,uint,ProductStatus,ProductCondition){
    Product memory product = stores[productIdInStore[_productId]][_productId];
    return (product.id, product.name, product.category, product.imageLink, product.descLink, product.auctionStartTime, product.auctionEndTime, product.startPrice, product.status, product.condition);  
}
}
四、启动以太坊节点及RPC

启动命令如下:

./geth --datadir "./chain" --rpcapi "db,eth,net,web3,personal,admin,miner" --nodiscover console 2>>eth_output.log
> admin.startRPC() //启动RPC,该方法有多种,还可以在第一句命令上加上rpc启动命令
五、编译和部署智能合约

在刚才的Ebay目录下进入truffle开发控制台:

truffle develop
truffle(develop)> compile  //编译智能合约,生成的文件会自动写到build/contracts目录
Compiling ./contracts/EbayStore.sol...

Compilation warnings encountered:

/opt/go-ethereum/ethereum/truffle/Ebay/contracts/EbayStore.sol:4:2: Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
    function EbayStore() public{
 ^ (Relevant source part starts here and spans across multiple lines).

Writing artifacts to ./build/contracts

再进行部署合约:

truffle(develop)> migrate
Using network 'develop'.

Running migration: 1_initial_migration.js
Deploying Migrations...
 ... 0x9703f0bcfbea1379917db408adaa99bc708a5a8a4f3a48375ef39bda5e9436b6
Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0
Saving successful migration to network...
... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying EbayStore...
... 0x4ff35a0843e9a3c9df51963e90212830a1f663ecba21721798880111ee6a5161
EbayStore: 0x345ca3e014aaf5dca488057592ee47305d9b3e10
Saving successful migration to network...
... 0xf36163615f41ef7ed8f4a8f192149a0bf633fe1a2398ce001bf44c43dc7bdda0
Saving artifacts...
六、遇到的问题(解决问题占用时间的2/3):
1、启动geth的时候不能启动/无反应或一下提示

fatal error: runtime: out of memory

top查看占用内存最多的进程,并且把不用的删除掉

2、truffle在部署migrate的时候,提示geth客户端没有启动/没有启动rpc/没有配置好truffle.js

首先一个个来做:
启动geth(第二种方式同时启动geth和rpc):

./geth --datadir "./chain" --rpc --rpcapi "db,eth,net,web3,personal,admin,miner" --nodiscover console 2>>eth_output.log

更改Ebay项目下的truffle.js文件

require('babel-register')

module.exports = {
  networks: {
    development: {
      host: '127.0.0.1',
      port: 8545, //该端口是默认的rpc监听端口
      network_id: '*' // Match any network id
    }
  }
}
3、migrate报错

Running migration: 1_initial_migration.js
Could not connect to your Ethereum client. Please check that your Ethereum client:
- is running
- is accepting RPC connections (i.e., "--rpc" option is used in geth)
- is accessible over the network
- is properly configured in your Truffle configuration file (truffle.js)

解决办法:
重启,然后先启动私链,再启动truffle develop

4、truffle compile 时而好时而不好

解决办法:reboot

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

推荐阅读更多精彩内容

  • 【本文目标】 通过本文的学习和时间,你将熟悉以太坊开发框架Truffle的配置和运行,并借助Truffle完成一...
    笔名辉哥阅读 13,032评论 8 55
  • 这个Dapp教程会分为三部分。从简单的投票功能开始,慢慢熟悉Dapp的开发环境与生态圈,后面再慢慢加入ERC20 ...
    youclavier阅读 4,434评论 1 3
  • 前不久读了骆玉明的《诗里特别有禅》,觉得有趣,就搜了相关书籍,淘到了这本《老庄随谈》。全书分为39个章节,从老子到...
    Wendy蔷薇盛开阅读 870评论 3 5
  • 一 “滴…滴滴……”公车司机在狂按喇叭,可是前面堵着,开不动。正是下班高峰期,车辆一窝峰似的挤满了道路,这些年,道...
    知言春秋阅读 513评论 0 0
  • 星期四 是颓废、伤感、孤独的一天 晚上下雨了 我决定回去拿一把伞 因为我喜欢撑开一把伞 就像在黑夜里 点上一把明亮...
    燃溪阅读 228评论 0 1