Dice猜数字游戏合约

此文转自于eosfans,原帖:https://eosfans.io/topics/326

1. dice 玩法说明

两个人玩的猜数游戏,两个出一样额度的赌注,然后A写下一个数,B如果在一定时间内猜对,则赢得赌注。(理解可能有误,请懂的大佬指出错误)

2. 操作大致流程

概要:创建钱包,发行货币,创建两个玩家,上传押金,上传同样赌注,开始游戏,结束游戏,拿走货币。

首先启动nodes

  1. nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::account_history_api_plugin

然后创建钱包,然后导入eosio(默认导入)和dice 私钥

  1. cleos wallet create
  2. Creating wallet: default
  3. Save password to use in the future to unlock this wallet.
  4. Without password imported keys will not be retrievable.
  5. "PW5HpvzFiU7kLx6FXcq5RjEyU33mWLEFJuZQPz4znBFDwb6DFFac6"
  6. cleos wallet import 5Jmsawgsp1tQ3GD6JyGCwy1dcvqKZgX6ugMVMdjirx85iv5VyPR
  7. imported private key for: EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4

上传bios合约,用于创建eosio.token账号,为eosio发行货币

  1. cleos set contract eosio build/contracts/eosio.bios -p eosio
  2. Reading WAST/WASM from build/contracts/eosio.bios/eosio.bios.wast...
  3. Assembling WASM...
  4. Publishing contract...
  5. executed transaction: 88355c1ebc31960b521b992f9410f95a5a0921c790f424356453cf5f84edb077 3288 bytes 2200576 cycles
  6. # eosio <= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001581060037f7e7f0060057f7e7e7e7e...
  7. # eosio <= eosio::setabi {"account":"eosio","abi":{"types":[],"structs":[{"name":"set_account_limits","base":"","fields":[{"n...

创建eosio.token账号

  1. cleos create account eosio eosio.token EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
  2. executed transaction: 46c68f270dfceb36ce2270a6bad89ca2228b9750a19a3a3bc92578a46637fbb1 352 bytes 102400 cycles
  3. # eosio <= eosio::newaccount {"creator":"eosio","name":"eosio.token","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7D...

为eosio.token账号部署eosio.token合约

  1. cleos set contract eosio.token build/contracts/eosio.token -p eosio.token
  2. Reading WAST/WASM from build/contracts/eosio.token/eosio.token.wast...
  3. Assembling WASM...
  4. Publishing contract...
  5. executed transaction: 5a0305bcab99b9d9f8590f51ce4d55bb0a0e60c2d79f4d61cd1ab210571171e2 8288 bytes 2200576 cycles
  6. # eosio <= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d010000000183011560067f7e7f7f7f7f00...
  7. # eosio <= eosio::setabi {"account":"eosio.token","abi":{"types":[],"structs":[{"name":"transfer","base":"","fields":[{"name"...

创建dice账号,用来掌管玩家的赌注

  1. cleos create account eosio dice EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
  2. executed transaction: 7d144219ebc5e2098af0b621221ea7d56572037a6adef53b5dd5691999818d18 352 bytes 102400 cycles
  3. # eosio <= eosio::newaccount {"creator":"eosio","name":"dice","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJxentZZ...

部署dice合约

  1. cleos set contract dice build/contracts/dice -p dice
  2. Reading WAST/WASM from build/contracts/dice/dice.wast...
  3. Assembling WASM...
  4. Publishing contract...
  5. executed transaction: c810aa75fe5f00520c16fb7464919756cf8bc7a1f424061a0de2a41dc6c3b6e1 11744 bytes 2200576 cycles
  6. # eosio <= eosio::setcode {"account":"dice","vmtype":0,"vmversion":0,"code":"0061736d0100000001ad011a60047f7f7e7f0060027f7f006...
  7. # eosio <= eosio::setabi {"account":"dice","abi":{"types":[],"structs":[{"name":"offer","base":"","fields":[{"name":"id","typ...

为eosio创建货币,dice只支持EOS

  1. cleos push action eosio.token create '[ "eosio", "1000000000.0000 EOS", 0, 0, 0]' -p eosio.token
  2. executed transaction: b6ffc0fbb62ff4c23b7d24b8b55a34bf0c74e7c710b18d16af326b939ae9ecfd 248 bytes 104448 cycles
  3. # eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"1000000000.0000 EOS","can_freeze":0,"can_recall":0,"can_whitelis...

创建玩家alice和bob

  1. cleos create account eosio alice EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
  2. executed transaction: 5e4b7f4a687db33afa025ab7a5ea86c0e13cab68455b109c5346b02c1c62652f 352 bytes 102400 cycles
  3. # eosio <= eosio::newaccount {"creator":"eosio","name":"alice","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJxentZ...
  4. cleos create account eosio bob EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
  5. executed transaction: 141d6eabefc7e9fa84261559970e54d9674d5278a89a507bce3228dae7169be2 352 bytes 102400 cycles
  6. # eosio <= eosio::newaccount {"creator":"eosio","name":"bob","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJxentZZe...

为alice和bob发行1000 EOS

  1. cleos push action eosio.token issue '[ "alice", "1000.0000 EOS", "" ]' -p eosio
  2. executed transaction: 8e33d754aa7dd8987522c3c76ab9a1bffada096363f71169e6da71d444552631 248 bytes 124928 cycles
  3. # eosio.token <= eosio.token::issue {"to":"alice","quantity":"1000.0000 EOS","memo":""}
  4. >> issue
  5. # eosio.token <= eosio.token::transfer {"from":"eosio","to":"alice","quantity":"1000.0000 EOS","memo":""}
  6. >> transfer
  7. # eosio <= eosio.token::transfer {"from":"eosio","to":"alice","quantity":"1000.0000 EOS","memo":""}
  8. # alice <= eosio.token::transfer {"from":"eosio","to":"alice","quantity":"1000.0000 EOS","memo":""}
  9. cleos push action eosio.token issue '[ "bob", "1000.0000 EOS", "" ]' -p eosio
  10. executed transaction: 6cac95b553404bc98cd7cd88088c4a9368b8ab1be3cd7dde0a337cb3c775a919 248 bytes 124928 cycles
  11. # eosio.token <= eosio.token::issue {"to":"bob","quantity":"1000.0000 EOS","memo":""}
  12. >> issue
  13. # eosio.token <= eosio.token::transfer {"from":"eosio","to":"bob","quantity":"1000.0000 EOS","memo":""}
  14. >> transfer
  15. # eosio <= eosio.token::transfer {"from":"eosio","to":"bob","quantity":"1000.0000 EOS","memo":""}
  16. # bob <= eosio.token::transfer {"from":"eosio","to":"bob","quantity":"1000.0000 EOS","memo":""}

激活alice和bob转账权限

  1. cleos set account permission alice active '{"threshold": 1,"keys": [{"key": "EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4","weight": 1}],"accounts": [{"permission":{"actor":"dice","permission":"active"},"weight":1}]}' owner -p alice
  2. executed transaction: 49275f38369b6966293a9dcd2dd2c76818d6513fbf4f5590ede50840db9337b4 312 bytes 102400 cycles
  3. # eosio <= eosio::updateauth {"account":"alice","permission":"active","parent":"owner","data":{"threshold":1,"keys":[{"key":"EOS7...
  4. cleos set account permission bob active '{"threshold": 1,"keys": [{"key": "EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4","weight": 1}],"accounts": [{"permission":{"actor":"dice","permission":"active"},"weight":1}]}' owner -p bob
  5. executed transaction: 78aee9021742cb71e3d0dd0683a10037c4001f1381334ed401ff4d060bb29b2e 312 bytes 102400 cycles
  6. # eosio <= eosio::updateauth {"account":"bob","permission":"active","parent":"owner","data":{"threshold":1,"keys":[{"key":"EOS7ij...

进行游戏前,两人要上交100EOS押金(有点小贵哦)

  1. cleos push action dice deposit '[ "alice", "100.0000 EOS" ]' -p alice
  2. executed transaction: 235e78118f80b11eb295815ebc2558019c1ac633f7c1c22dc8a0afd9e1a4babb 248 bytes 123904 cycles
  3. # dice <= dice::deposit {"from":"alice","a":"100.0000 EOS"}
  4. # eosio.token <= eosio.token::transfer {"from":"alice","to":"dice","quantity":"100.0000 EOS","memo":""}
  5. >> transfer
  6. # alice <= eosio.token::transfer {"from":"alice","to":"dice","quantity":"100.0000 EOS","memo":""}
  7. # dice <= eosio.token::transfer {"from":"alice","to":"dice","quantity":"100.0000 EOS","memo":""}
  8. cleos push action dice deposit '[ "bob", "100.0000 EOS" ]' -p bob
  9. executed transaction: d309b2090d2a5e73d97f0d198b2967b20dcfa9ced2d80cc75e445e10b0f43c6f 248 bytes 122880 cycles
  10. # dice <= dice::deposit {"from":"bob","a":"100.0000 EOS"}
  11. # eosio.token <= eosio.token::transfer {"from":"bob","to":"dice","quantity":"100.0000 EOS","memo":""}
  12. >> transfer
  13. # bob <= eosio.token::transfer {"from":"bob","to":"dice","quantity":"100.0000 EOS","memo":""}
  14. # dice <= eosio.token::transfer {"from":"bob","to":"dice","quantity":"100.0000 EOS","memo":""}

alice 随机生成一个32长度的串,hex显示,在通过sha256加密后,生成一个加密串,然后将赌注和加密串同时上传到dice监管

  1. openssl rand 32 -hex
  2. 15fe76d25e124b08feb835f12e00a879bd15666a33786e64b655891fba7d6c12
  3. echo -n '15fe76d25e124b08feb835f12e00a879bd15666a33786e64b655891fba7d6c12' | xxd -r -p | sha256sum -b | awk '{print $1}'
  4. 50ed53fcdaf27f88d51ea4e835b1055efe779bb87e6cfdff47d28c88ffb27129
  5. cleos push action dice offerbet '[ "3.0000 EOS", "alice", "d533f24d6f28ddcef3f066474f7b8355383e485681ba8e793e037f5cf36e4883" ]' -p alice
  6. executed transaction: 2acc94e4d1fb6937fc5686740855230f3ad45f15d2406cf76daa55a57fe2a1af 280 bytes 106496 cycles
  7. # dice <= dice::offerbet {"bet":"3.0000 EOS","player":"alice","commitment":"d533f24d6f28ddcef3f066474f7b8355383e485681ba8e793...

然后让bob干同样的事情,然后游戏已经开始了

  1. openssl rand 32 -hex
  2. 15fe76d25e124b08feb835f12e00a879bd15666a33786e64b655891fba7d6c12
  3. echo -n '15fe76d25e124b08feb835f12e00a879bd15666a33786e64b655891fba7d6c12' | xxd -r -p | sha256sum -b | awk '{print $1}'
  4. 50ed53fcdaf27f88d51ea4e835b1055efe779bb87e6cfdff47d28c88ffb27129
  5. cleos push action dice offerbet '[ "3.0000 EOS", "bob", "50ed53fcdaf27f88d51ea4e835b1055efe779bb87e6cfdff47d28c88ffb27129" ]' -p bob
  6. executed transaction: bcb28be69afd0eab7d125fb4fae79019f55bb18046fb4e6ee7e7982a8aed4309 280 bytes 112640 cycles
  7. # dice <= dice::offerbet {"bet":"3.0000 EOS","player":"bob","commitment":"50ed53fcdaf27f88d51ea4e835b1055efe779bb87e6cfdff47d...

检查一下EOS是不是真确操作了,alice和bob,dice

  1. cleos get table dice dice account
  2. {
  3. "rows": [{
  4. "owner": "alice",
  5. "eos_balance": "97.0000 EOS",
  6. "open_offers": 0,
  7. "open_games": 1
  8. },{
  9. "owner": "bob",
  10. "eos_balance": "97.0000 EOS",
  11. "open_offers": 0,
  12. "open_games": 1
  13. }
  14. ],
  15. "more": false
  16. }
  17. cleos get table dice dice game
  18. {
  19. "rows": [{
  20. "id": 1,
  21. "bet": "3.0000 EOS",
  22. "deadline": "1970-01-01T00:00:00",
  23. "player1": {
  24. "commitment": "d533f24d6f28ddcef3f066474f7b8355383e485681ba8e793e037f5cf36e4883",
  25. "reveal": "0000000000000000000000000000000000000000000000000000000000000000"
  26. },
  27. "player2": {
  28. "commitment": "50ed53fcdaf27f88d51ea4e835b1055efe779bb87e6cfdff47d28c88ffb27129",
  29. "reveal": "0000000000000000000000000000000000000000000000000000000000000000"
  30. }
  31. }
  32. ],
  33. "more": false
  34. }

bob揭示他的字符串

  1. cleos push action dice reveal '[ "50ed53fcdaf27f88d51ea4e835b1055efe779bb87e6cfdff47d28c88ffb27129", "15fe76d25e124b08feb835f12e00a879bd15666a33786e64b655891fba7d6c12" ]' -p bob
  2. executed transaction: 8bd988a929970e4f110d4c9500dc13c81110eff4a8a02743bcf433f5bd8709e1 288 bytes 105472 cycles
  3. # dice <= dice::reveal {"commitment":"50ed53fcdaf27f88d51ea4e835b1055efe779bb87e6cfdff47d28c88ffb27129","source":"15fe76d25...

再来看一下dice

  1. cleos get table dice dice game
  2. {
  3. "rows": [{
  4. "id": 1,
  5. "bet": "3.0000 EOS",
  6. "deadline": "2018-04-19T07:58:56",
  7. "player1": {
  8. "commitment": "d533f24d6f28ddcef3f066474f7b8355383e485681ba8e793e037f5cf36e4883",
  9. "reveal": "0000000000000000000000000000000000000000000000000000000000000000"
  10. },
  11. "player2": {
  12. "commitment": "50ed53fcdaf27f88d51ea4e835b1055efe779bb87e6cfdff47d28c88ffb27129",
  13. "reveal": "15fe76d25e124b08feb835f12e00a879bd15666a33786e64b655891fba7d6c12"
  14. }
  15. }
  16. ],
  17. "more": false
  18. }

alice 揭示他的code,游戏就结束了,赢得是alice(没看懂怎么赢得)

  1. cleos push action dice reveal '[ "d533f24d6f28ddcef3f066474f7b8355383e485681ba8e793e037f5cf36e4883", "28349b1d4bcdc9905e4ef9719019e55743c84efa0c5e9a0b077f0b54fcd84905" ]' -p alice
  2. executed transaction: 16400e6850ea39d3afec89cf257e840248ea2d515533b785d72e0dc8e431f8ef 288 bytes 110592 cycles
  3. # dice <= dice::reveal {"commitment":"d533f24d6f28ddcef3f066474f7b8355383e485681ba8e793e037f5cf36e4883","source":"28349b1d4...

对一下账号信息

  1. cleos get table dice dice account
  2. {
  3. "rows": [{
  4. "owner": "alice",
  5. "eos_balance": "103.0000 EOS",
  6. "open_offers": 0,
  7. "open_games": 0
  8. },{
  9. "owner": "bob",
  10. "eos_balance": "97.0000 EOS",
  11. "open_offers": 0,
  12. "open_games": 0
  13. }
  14. ],
  15. "more": false
  16. }

alice拿走 押金和赢的赌注

  1. cleos push action dice withdraw '[ "alice", "103.0000 EOS" ]' -p alice
  2. executed transaction: 6e9524dfe59dc79c0016c7afa5c080368b1f09eacd9b0823340051183aca10a7 248 bytes 124928 cycles
  3. # dice <= dice::withdraw {"to":"alice","a":"103.0000 EOS"}
  4. # eosio.token <= eosio.token::transfer {"from":"dice","to":"alice","quantity":"103.0000 EOS","memo":""}
  5. >> transfer
  6. # dice <= eosio.token::transfer {"from":"dice","to":"alice","quantity":"103.0000 EOS","memo":""}
  7. # alice <= eosio.token::transfer {"from":"dice","to":"alice","quantity":"103.0000 EOS","memo":""}

最后再查询一下alice的balance(未通过)

  1. cleos get currency balance eosio.token alice eos
  2. 1003.0000 EOS