【项目目标】
开发一个去中介化的租房EOS DAPP,实现租客与房东互赢。
【项目需求】
1、建立本地节点,创建钱包、加载biod合约、创建代币分配账户。
2、部署eosjs项目,提供创建代币合约、创建账户(可批量)、转账、查询代币余额等API。
3、WEB前端为一个简易租房界面,可以浏览租房信息,会员注册(赠送代币)后,可以预约看房,看房后可以对房源打分(赠送代币),租房后可以对房源打分(赠送代币),后台房东可以发布出租房源(赠送代币),翻转房源状态(赠送代币),代币在平台增值后,可以做为房租支付或抵押。
4、本项目代币名称为:BLR(BlockRent的简写)
【测试环境】
在Win7下安装的VMWare10,在VMWare10中安装Ubuntu18.04、Docker18.03.1-ce、EOS DAWN v1.0.8,环境看起来有点兜转,就暂且用做测试吧。
1、启动节点
$ sudo docker run --rm--name eosio -d -p 8888:8888 -p 9876:9876 -v /tmp/work:/work -v/tmp/eosio/data:/mnt/dev/data -v /tmp/eosio/config:/mnt/dev/configeosio/eos-dev /bin/bash -c "nodeos-e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::wallet_plugin--plugin eosio::producer_plugin --plugin eosio::history_plugin --plugineosio::chain_api_plugin --plugin eosio::history_api_plugin --plugineosio::http_plugin -d /mnt/dev/data --config-dir /mnt/dev/config--http-server-address=0.0.0.0:8888 --access-control-allow-origin=*--contracts-console"
$ docker exec -it eosio/bin/bash
2、查找eosio公私钥
在当前路径下,我们可以打开config.ini文件,查找signature-provider,即可找到eosio公私钥:
EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
笔者注:在DAWNv1.0.2时,公私钥是可以独立于钱包创建账户操作的,但v1.0.5后就必须先将私钥导入到钱包里才能操作,所以我们早早地就把公私钥复制下来,准备好接下来的操作。
3、创建钱包
cleos wallet create -nblockrent_wallet
PW5KPFSWL3YfgRPVaER9EjoScBk1Afdcx6T3RVWHCqpjfuuySmC7G
4、将eosio账户密钥导入钱包
cleos wallet import -nblockrent_wallet 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
5、创建bios合约
cleos set contract eosiocontracts/eosio.bios -p eosio
#返回的交易地址
cd15f3ee17c043f202f801444e73b69165d0becd6d153ad8e41c870e88421a87
6、创建KEY
# 创建合约账户blockrent111
cleos create key
Private key:5JhDyR6zNDifzoJPE5MnfxvLvbHdXTSBuKzaXEr82rL6ChoRyvL
Public key:EOS5JPDqzVDQ8kCo6AWdxhKpynmJsWUfbwBiaDs2fMNhAnEDSd525
# 团队及基金会blockrent222
cleos create key
Private key:5KQYJzZAR8CgrLW3x7vkhm86NKxziDoZn2JJKhdbTbH9WjTdGZ8
Public key: EOS6t22TsDrrSnmkDv2pv4jagZMxnw4Hc8pQcmTo8476inymwqn9d
# 社区培养及推广blockrent333
cleos create key
Private key:5JKqGKqPkCtQc8EHy5paZ9KJKnRKY4XEukWtVn1w7HT9ZHZGip5
Public key:EOS5qGrpjdFR647sbec1sQyqvnQ8hrUZJGR1t24EGue1HUJKWLEes
# 激励池blockrent444
cleos create key
Private key:5JQ85e4AMagc3D43dvH6ngFG6ak6ubVamweMhHcTxBjKTfSWGXP
Public key:EOS63yTyuJnbgoCVDXkrgjG9SGCSxBLUAYscZWQf4NaLV7oTkM2ex
# 定向邀约机构方blockrent555
cleos create key
Private key:5JmQQpEGgXBD33g1yy4bFfaPfsQZrwqU9UwUKwphC1hZ5WqBsXL
Public key: EOS7X9EPbQdGxUMfN7bXTQz1cUSWxwpGjTPt8yGsiFxuDfFAWkhS8
7、导入KEY到钱包
cleos wallet import -nblockrent_wallet 5KQYJzZAR8CgrLW3x7vkhm86NKxziDoZn2JJKhdbTbH9WjTdGZ8
cleos wallet import -nblockrent_wallet 5JKqGKqPkCtQc8EHy5paZ9KJKnRKY4XEukWtVn1w7HT9ZHZGip5
cleos wallet import -nblockrent_wallet 5JQ85e4AMagc3D43dvH6ngFG6ak6ubVamweMhHcTxBjKTfSWGXP
cleos wallet import -nblockrent_wallet 5JmQQpEGgXBD33g1yy4bFfaPfsQZrwqU9UwUKwphC1hZ5WqBsXL
8、创建账户
cleos create account eosioblockrent111 EOS5JPDqzVDQ8kCo6AWdxhKpynmJsWUfbwBiaDs2fMNhAnEDSd525 #需要EOS抵押
cleos create accountblockrent111 blockrent222 EOS6t22TsDrrSnmkDv2pv4jagZMxnw4Hc8pQcmTo8476inymwqn9d
cleos create accountblockrent111 blockrent333 EOS5qGrpjdFR647sbec1sQyqvnQ8hrUZJGR1t24EGue1HUJKWLEes
cleos create accountblockrent111 blockrent444 EOS63yTyuJnbgoCVDXkrgjG9SGCSxBLUAYscZWQf4NaLV7oTkM2ex
cleos create accountblockrent111 blockrent555 EOS7X9EPbQdGxUMfN7bXTQz1cUSWxwpGjTPt8yGsiFxuDfFAWkhS8
我们可以通过cleosget account <账户名> -j来查看一下账户详细信息,-j参数表示输出json格式。
9、创建代币合约BLR
cleos set contractblockrent111 contracts/eosio.token/ -p blockrent111
# cleos push actionblockrent111 create '["eosio", "1000000000.0000 BLR", 0, 0,0]' -p blockrent111
cleos push actionblockrent111 create '["blockrent111", "1000000000.0000BLR", 0, 0, 0]' -p blockrent111
10、发行代币
在产品设计阶段,我们约定的激励分配是这样的:
· 总发行 10亿BLR
· 团队及基金会(blockrent222) 25%=250000000.0000 BLR
· 社区培养及推广(blockrent333) 15%=150000000.0000 BLR
· 激励池(blockrent444) 40%=400000000.0000 BLR
· 定向邀约机构方(blockrent555) 20%=200000000.0000 BLR
cleos push actionblockrent111 issue '["blockrent222", "250000000.0000 BLR","给blockrent222发行25%"]' -pblockrent111
cleos push actionblockrent111 issue '["blockrent333", "150000000.0000 BLR","给blockrent333发行15%"]' -pblockrent111
cleos push actionblockrent111 issue '["blockrent444", "400000000.0000 BLR","给blockrent444发行40%"]' -pblockrent111
cleos push actionblockrent111 issue '["blockrent555", "200000000.0000 BLR","给blockrent555发行20%"]' -pblockrent111
到目前为止,我们建立一条本地私有区块链,创建了一个代币合约BLR,并按激励分配规则发行到了4个分账户,在接下来的开发中,我们将使用激励池blockrent444中的余额来进行交易。
1、克隆eosjs项目代码
此处项目代码部署在运行着本地节点的Ubuntu系统中,如果是在生产环境中,可以单独部署这个项目,对外有一个独立IP可访问即可。
cd ~/
git clone https://github.com/luoxiaohui/eos4node.git
访问 http://localhost:8888/v1/chain/get_info 获取本地节点信息,localhost 也可以换成局域网IP地址,复制chain_id字段值。
找到~/eos4node/app/controller/home.js文件,根据本地节点数据不同,做如下修改:
13行处const pk = '***',修改为 blockrent444 账户私钥。
20行处const eosServer ='***'注释掉,启用22行本地服务地址。
28行处const mainAccount = '***',修改成blockrent444。
45行处const eos = Eos(...);,其中chainId修改为chain_id字段值,如cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f。
295行处myaccount.create...,可修改代币名称和总发行量。
保存并上传。
2、运行项目,开启服务
cd ~/eos4node
# 下载node_modules需要等待一段时间,也可以提示下载
$ npm i
$ npm run dev
> eos4node@1.0.0 dev/home/simon/eos4node
> egg-bin dev
2018-07-09 17:45:36,209INFO 24999 [master] node version v8.11.3
2018-07-09 17:45:36,211INFO 24999 [master] egg version 2.9.1
2018-07-09 17:45:36,664INFO 24999 [master] agent_worker#1:25005 started (450ms)
2018-07-09 17:45:37,580INFO 24999 [master] egg started on http://127.0.0.1:7001 (1369ms)
如上结果所示,我们服务端的API就准备就绪了。
这里为了简洁,我们把界面给省略了,我们新开一个终端来模拟前端访问API,也可以下载一个chrome插件postman来访问。
1、创建账户API
临时新建一个KEY:
cleos create key
Private key:5KbRAog4DxwAMthSrb44ZNGtGD828mzCfEvXkvVDSakxQtFBr15
Public key:EOS6y7ok9AwmToGmgsFWCQU7iGJMsStTQf6g4F6aoHTH56zEos5Sk
比如创建新账户 ouyangxinmin :
curl -i -X POSThttp://localhost:7001/account/create -d username=ouyangxinmin -dactive=EOS6y7ok9AwmToGmgsFWCQU7iGJMsStTQf6g4F6aoHTH56zEos5Sk -downer=EOS6y7ok9AwmToGmgsFWCQU7iGJMsStTQf6g4F6aoHTH56zEos5Sk
2、转账API
blockrent111给账户 ouyangxinmin 转账:
curl -i -X POSThttp://localhost:7001/transfer -d contract=blockrent111 -d from=blockrent111 -dto=ouyangxinmin -d pk=5JhDyR6zNDifzoJPE5MnfxvLvbHdXTSBuKzaXEr82rL6ChoRyvL -dquantity="1000.0000 BLR" -d mome="token reward"
ouyangxinmin 给账户blockrent222转账:
curl -i -X POSThttp://localhost:7001/transfer -d contract=blockrent111 -d from=ouyangxinmin -dto=blockrent222 -d pk=5KbRAog4DxwAMthSrb44ZNGtGD828mzCfEvXkvVDSakxQtFBr15 -dquantity="10.0000 BLR" -d mome="token reward"
3、获取代币余额
curl -i -X POSThttp://localhost:7001/currency/balance -d contract=blockrent111 -daccount=ouyangxinmin
在上文中第一节第9、10步,我们已经通过命令终端部署了合约、创建了代币合约,也可以把这个功能集成到后台操作,如果已经操作过了第一节第9、10步,以下第1、2步可跳过。
1、调用部署合约API
curl -i -X POSThttp://localhost:7001/deployContract -d contract=blockrent111
2、调用创建代币合约接口
代币名称BLR已经写在home.js代码中,可参考第二节第1点做修改,也可以改进一下做为参数传入。
curl -i -X POSThttp://localhost:7001/createCurrency -d contract=blockrent111
3、批量创建测试账户
curl -i -X POSThttp://localhost:7001/createCurrency -d contract=blockrent111
# 返回5个账户,可以配置创建个数
"4ksalziynrzc","jsa4pocy3rzi","l5eauvfqmu2h","ihl1wsbau1yr","zaxwz2lkhkkn","glkecjmtfnwk"
为了提高用户体验,让用户无感知地创建账户,可以提前在后台批量创建一些测试账户,当用户注册时,自动绑定到注册账号,实现无缝对接区块链,但这样有点过于中心化了,类似交易所的做法。
内容来源:海阳之新(简书)专栏
作者:HiBlock&创业股 上海技术工坊 分享嘉宾欧阳新民
以下是我们的社区介绍,欢迎各种合作、交流、学习:)