# 视频课程

## 第一课：DApp介绍及Chain33开发环境搭建

> 介绍DApp和智能合约的基本概念， 石头剪刀布游戏合约的逻辑，以及如何在Windows操作系统上搭建一个单节点的开发环境用于调试。
> 视频地址: [DApp介绍及Chain33开发环境搭建](https://www.bilibili.com/video/av36690009/)
> 第一课用到的一些命令

  ```
    #生成seed，注意：生成的seed要记住，如果不小心误删钱包，通过seed可以找回钱包
    ./chain33-cli.exe seed generate -l 0
    #保存seed，-p后跟的是钱包密码。 注意：密码可以自定义，并且牢牢记住，后面解锁钱包时会用到。密码需满足8位字母数字组合的要求。
    ./chain33-cli.exe seed save -s [上一步生成的seed值] -p tech1234
    #解锁钱包
    ./chain33-cli.exe wallet unlock -p tech1234 -t 0 
    #导入创始账户地址，创始账户在配置文件中配的
    ./chain33-cli.exe account import_key -k 3990969DF92A5914F7B71EEB9A4E58D6E255F32BF042FEA5318FC8B3D50EE6E8  -l genesis
    #新创建一个标签为testA的账户
    ./chain33-cli.exe account create -l testA
    #创始账户向账户A中发起转账
    ./chain33-cli send coins transfer -a 1000 -t 1FbuCnz6Bnw3EiECrv9QYKcnYhP19JL5gb -n "test for transfer bty" -k 3990969DF92A5914F7B71EEB9A4E58D6E255F32BF042FEA5318FC8B3D50EE6E8
    #查询交易
    ./chain33-cli.exe tx query_hash -s [上一步生成的交易hash]
  ```

## 第二课：用GO语言编写石头剪刀布的合约

> 介绍在chain33上，使用GO语言开发石头剪刀布合约的流程。
> 视频地址: [石头剪刀布合约开发介绍](https://www.bilibili.com/video/av36842971/)

## 第三课：石头剪刀布合约的调用

> 介绍石头剪刀布合约的调用。
> 视频地址: [石头剪刀布合约调用](https://www.bilibili.com/video/av37268467/)
> 第三课用到的一些命令

  ```
    #获取合约地址
    curl --data-binary '{"jsonrpc":"2.0", "id": 1, "method":"Chain33.ConvertExectoAddr","params":[{"execname":"fingerguessing"}] }' \
        -H 'content-type:text/plain;' \
        http://localhost:8801
    #往合约中打入金额
    #构建往合约中打币的交易
    curl --data-binary '{"jsonrpc":"2.0", "id": 1, "method":"Chain33.CreateRawTransaction","params":[{"to":"1MwyBkj94REkZadQveucgsH9PRzpSSxTyx","amount":1000000000}] }' \
        -H 'content-type:text/plain;' \
        http://localhost:8801
    #签名交易，对上一步返回的hash值进行签名
     curl --data-binary '{"jsonrpc":"2.0", "id": 1, "method":"Chain33.SignRawTx","params":[{"addr":"1FbuCnz6Bnw3EiECrv9QYKcnYhP19JL5gb", "expire":"2h", "txHex":"上一步生成的数据"}] }' \
        -H 'content-type:text/plain;' \
        http://localhost:8801
    #发送交易
     curl --data-binary '{"jsonrpc":"2.0", "id": 1, "method":"Chain33.SendTransaction","params":[{"data":"上一步生成的数据"}] }' \
        -H 'content-type:text/plain;' \
        http://localhost:8801
    #查询用户A在合约地址中的金额
     curl --data-binary '{"jsonrpc":"2.0", "id": 1, "method":"Chain33.GetBalance","params":[{"addresses":["1FbuCnz6Bnw3EiECrv9QYKcnYhP19JL5gb"],"execer":"fingerguessing"}] }' \
        -H 'content-type:text/plain;' \
        http://localhost:8801
    #创建石头剪刀布游戏步骤
    #构建游戏
    curl --data-binary '{"jsonrpc":"2.0", "id": 1, "method":"Chain33.CreateTransaction","params":[{"execer":"fingerguessing", "actionName":"createGame", "payload":{"amount": 200000000,"hashType":"sha256","hashValue":"001c470a12512811dfc5d1cd5c60deb2ee6acafb1ca153a0ca26e19d1b5995a7"}}] }' \
        -H 'content-type:text/plain;' \
        http://localhost:8801
    #签名交易，用户A的私钥签名，调用方式同上面描述的签名方样一样
    #发送交易，调用方式同上
    #匹配石头剪刀布游戏步骤
    #构建交易
    curl --data-binary '{"jsonrpc":"2.0", "id": 1, "method":"Chain33.CreateTransaction","params":[{"execer":"fingerguessing", "actionName":"matchGame", "payload":{"gameId": "0xae020e911efad0f7ed1a297b915d906c2a0bb9f357b973cd6fe5cce9fcbce471","guess":2}}] }' \
        -H 'content-type:text/plain;' \
        http://localhost:8801
    #签名交易，用户B的私钥签名，调用方式同上
    #发送交易，调用方式同上
    #用户A开奖石头剪刀布游戏步骤
    #构建交易
    curl --data-binary '{"jsonrpc":"2.0", "id": 1, "method":"Chain33.CreateTransaction","params":[{"execer":"fingerguessing", "actionName":"closeGame", "payload":{"gameId": "0xf7275f95c7de6e06fd93567e4c565386ef93a048f07357ea0d08b1484bfd24d3","secret":"123456","result":1}}] }' \
        -H 'content-type:text/plain;' \
        http://localhost:8801
    #签名交易，用户A的私钥签名，调用方式同上
    #发送交易，调用方式同上
  ```

## 第四课：平行链搭建及平行链上发token

> 介绍平行链的概念，如何搭建一条平行链，如何在平行链上发行token
> 视频地址: [平行链上发行Token](https://www.bilibili.com/video/av37367891/)
> 平行链上发token的步骤（命令行模式）
> 最简化配置下，只要一台服务器就可以部署一个主链节点+多条平行链（不同的平行链通过端口区分），服务器的配置4核CPU，8G内存

```
#下载主链,解压，执行（如果已经有可以链接的主链，就不需要重复创建主链节点，支持一个主链节点同时下挂多个平行链节点）：
wget https://bty.oss-ap-southeast-1.aliyuncs.com/chain33/mainChain.tar.gz
tar -zxvf mainChain.tar.gz 
cd mainChain
nohup ./chain33 -f chain33.toml >>  bty.out&
#检查同步情况，这一步会从主链上同步执行区块，需要花一定的时间，目前主网区块已经超过100万，预计要6个小时同步完。
#通过执行以下命令来查看区块同步结果，返回true表示同步完成：
./chain33-cli  net is_sync
#通过执行以下命令来查看区块同步情况：
./chain33-cli  net peer_info
#运行平行链节点，这一步需要在主链节点同步完成后进行
#下载平行链，解压
wget https://bty.oss-ap-southeast-1.aliyuncs.com/chain33/paraChain.tar.gz
tar -zxvf paraChain.tar.gz 
#修改配置文件
cd paraChain/
修改chain33.toml配置文件，这里仅列出需要修改的配置项
# 设置title为自己平行链的名称，注意最后一个.不能省略
Title="user.p.devtest."
# 同主链相链的json/rpc的地址，分别对应主链的ip和端口
mainnetJrpcAddr="http://172.26.8.152:8801"
# 同主链相链的grpc地址，分别对应主链的ip和端口
ParaRemoteGrpcClient = "172.26.8.152:8802"
#指定从主链某高度的区块开始同步，建议配置，可以配成比当前主链高度略小。
startHeight=1000000
#超级管理员地址，配成自己掌握私钥的地址（注意，这个地址里要有比特元，用于缴纳手续费）
superManager=[
    "15WgpzXZWM5QrVadD4hb4eMNWkhQ85HpfX",
]
#token创建人地址，配成掌握私钥的地址（跟上面那个一样就行）
tokenApprs = [
        "15WgpzXZWM5QrVadD4hb4eMNWkhQ85HpfX",
]
# 启动平行链
nohup ./chain33 -f chain33.para.toml >> para.out&
#查询平行链上的区块同步信息
./chain33-cli --rpc_laddr="http://localhost:8901" block last_header
#配置token-finisher
./chain33-cli --rpc_laddr="http://localhost:8901" --paraName "user.p.devtest." config config_tx -c token-finisher -o add -v [token-finisher的地址，直接填上面的superManager地址也行]
./chain33-cli --rpc_laddr="http://localhost:8901"    wallet sign -k [superManager对应的私钥匙] -d [上一步生成的数据]
./chain33-cli --rpc_laddr="http://localhost:8901"   wallet send -d [上一步生成的签名后的数据]
#配置token-blacklist
./chain33-cli --rpc_laddr="http://localhost:8901" --paraName "user.p.devtest." config config_tx -c token-blacklist -o add -v BTY
./chain33-cli --rpc_laddr="http://localhost:8901"  wallet sign -k [superManager对应的私钥匙] -d [上一步生成的数据]
./chain33-cli --rpc_laddr="http://localhost:8901"  wallet send -d [上一步生成的签名后的数据]
#上两步结果的查询，注意只有上两步配置成功才可以进入下面的流程
./chain33-cli --rpc_laddr="http://localhost:8901"   --paraName "user.p.devtest." config query_config -k token-blacklist 
./chain33-cli --rpc_laddr="http://localhost:8901"  --paraName "user.p.devtest." config query_config -k token-finisher
#token预创建 
./chain33-cli --rpc_laddr="http://localhost:8901" --paraName "user.p.devtest."  token precreate -f 0.001 -i 开发者币 -n "DEVELOP COINS" -a [token接收者的地址，可以是自己，也可以指定别人] -p 0 -s "COINSDEVX" -t 19900000000
./chain33-cli --rpc_laddr="http://localhost:8901" wallet sign -k [token-finisher的私钥] -d [上一步生成的签名后的数据]
./chain33-cli --rpc_laddr="http://localhost:8901"  wallet send -d [上一步生成的签名后的数据]
#查询，这一步完成，才可以进入到下面的流程
./chain33-cli --rpc_laddr="http://localhost:8901" --paraName "user.p.devtest." token  get_precreated
#token finish 
./chain33-cli --rpc_laddr="http://localhost:8901" --paraName "user.p.devtest." token finish -s COINSDEVX -f 0.001 -a [token接收者的地址]
./chain33-cli --rpc_laddr="http://localhost:8901" wallet sign -k [token-finisher的私钥] -d [上一步生成的签名后的数据]
./chain33-cli --rpc_laddr="http://localhost:8901"  wallet send -d [上一步生成的签名后的数据]
#查询
./chain33-cli --rpc_laddr="http://localhost:8901"  --paraName "user.p.devtest."  token get_finish_created
#根据地址查询
./chain33-cli --rpc_laddr="http://localhost:8901"  --paraName "user.p.devtest." token token_balance -e "user.p.devtest.token" -a [token接收者的地址]  -s COINSDEVX
```

