星云链DApp开发

更多精彩内容,关注微信公众号“技术哥”。

pdf下载,请加入星球:“区块链开发指南”

  1. Mac下安装的准备工作

Homebrew安装

我们安装Homebrew是为了安装星云链开发环境时更方便快捷。

第1步:安装

命令行输入

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  
复制代码

回车(这里有提示目录不存在,要创建需要按回车键)

安装过程中如果出现:

Warning: /usr/local/bin is not in your PATH.
复制代码

则需要将/usr/local/bin添加到环境变量,方法如下:

vi ~/.bash_profile
复制代码

打开.bash_profile文件,按"i"键可进行编辑,添加:

export PATH=$PATH:/usr/local/bin
复制代码

然后按"Esc"键,再输入":wq",再按回车键保存,然后执行如下命令,重新加载让配置生效:

source ~/.bash_profile
复制代码

第2步:检测是否安装成功

命令行输入

brew help
复制代码

如果出现以下信息,表示安装成功

Example usage:
  brew search [TEXT|/REGEX/]
  brew info [FORMULA...]
  brew install FORMULA...
  brew update
  brew upgrade [FORMULA...]
  brew uninstall FORMULA...
  brew list [FORMULA...]

  ...
复制代码
  1. Mac下安装星链云

版本:1.9.2

Golang环境搭建

打开.bash_profile文件,按i键编辑

vim ~/.bash_profile
复制代码

新增如下内容:

brew install go
export GOPATH=/Users/user/go-workspace
复制代码

让配置生效:

source ~/.bash_profile
复制代码

编译星云链

下载源码

可以使用如下指令直接下载最新版本的星云链源码。

# 进入工作目录
mkdir -p $GOPATH/src/github.com/nebulasio
cd $GOPATH/src/github.com/nebulasio

# 下载源码
git clone https://github.com/nebulasio/go-nebulas.git

# 进入项目目录
cd go-nebulas

# 切换到最稳定的master分支
git checkout master
复制代码

安装rocksdb依赖库

可以直接通过Homebrew安装,运行brew install rocksdb

安装Go依赖库

通过Homebrew直接安装并升级Dep

brew install dep
brew upgrade dep
复制代码

下载GO三方库

cd $GOPATH/src/github.com/nebulasio/go-nebulas
make dep
复制代码

若不成功或速度太慢可

wget http://ory7cn4fx.bkt.clouddn.com/vendor.tar.gz
复制代码

解压开

cd $GOPATH/src/github.com/nebulasio/go-nebulas
tar zxf vendor.tar.gz
复制代码

安装chrome V8依赖库

cd $GOPATH/src/github.com/nebulasio/go-nebulas
make deploy-v8
复制代码

编译可执行文件

cd $GOPATH/src/github.com/nebulasio/go-nebulas
make build
复制代码

编译成功信息:

  1. 运行星链云

创世区块

在项目根目录conf/default/genesis.conf下,配置创世区块,此次,我们使用默认配置即可,暂不用修改。

meta {
  # 每条链的唯一标识
  # 每个区块和交易只会属于一条唯一的链,保证安全性
  # 对于主网,chain_id=1;对于测试网,chain_id=1001
  chain_id: 100
}

consensus {
  # 在贡献度证明(PoD)被充分验证前,星云链采用DPoS共识算法
  # DPoS共识中,21个人组成一个朝代
  # 每隔一段时间都会切换朝代,每个朝代内,21个矿工轮流出块
  # 由于DPoS只是过渡方案,所以暂时不开放给公众挖矿,即当前版本朝代不会发生变更
  dpos {
    # 初始朝代,包含21个初始矿工地址
    dynasty: [
      [ miner address ],
      ...
    ]
  }
}

# 预分配的代币
token_distribution [
  {
    address: [ allocation address ]
    value: [ amount of allocation tokens ]
  },
  ...
]
复制代码

星云节点配置

在项目根目录下的conf/default/config.conf,配置星云节点,此次,我们使用默认配置即可,暂不用修改。

# 网络配置
network {
  # 对于全网第一个节点,不需要配置seed
  # 否则,其他节点启动时需要配置seed,seed节点将会把网络中其他节点的路由信息同步给刚启动的节点
  # 可以配置多个seed, ["...", "..."]
  seed: ["/ip4/127.0.0.1/tcp/8680/ipfs/QmP7HDFcYmJL12Ez4ZNVCKjKedfE7f48f1LAkUc3Whz4jP"]

  # 节点监听网络消息端口,可以配置多个
  listen: ["0.0.0.0:8680"]

  # 网络私钥,用于确认身份节点
  # private_key: "conf/network/id_ed25519"
}

# 链配置
chain {
  # 链的唯一标识
  chain_id: 100

  # 数据存储地址
  datadir: "data.db"

  # 账户keystore文件存储地址
  keydir: "keydir"

  # 创世区块配置
  genesis: "conf/default/genesis.conf"

  # 签名算法,请勿修改
  signature_ciphers: ["ECC_SECP256K1"]

  # 矿工地址,矿工的keystore文件需要放置在配置的keydir下
  miner: "n1XkoVVjswb5Gek3rRufqjKNpwrDdsnQ7Hq"

  # Coinbase地址,该地址用于接收矿工的挖矿奖励,可以和矿工地址一致
  # 该地址的keystore无需暴露,不用放置在配置的keydir下
  coinbase: "n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE"

  # 矿工地址的密码
  passphrase: "passphrase"
}

# API配置
rpc {
    # GRPC服务端口
    rpc_listen: ["127.0.0.1:8684"]

    # HTTP服务端口
    http_listen: ["127.0.0.1:8685"]

    # 开放的API模块
    # API模块包含所有和用户私钥无关的接口
    # Admin模块包含所有和用户私钥相关的接口,需要慎重考虑该模块的访问权限
    http_module: ["api", "admin"]
}

# 日志配置
app {
    # 日志级别: 支持[debug, info, warn, error, fatal]
    log_level: "info"

    # 日志存放位置
    log_file: "logs"

    # 是否打开crash report服务
    enable_crash_report: false
}

# 监控服务配置
stats {
    # 是否打开监控服务
    enable_metrics: false

    # 监控服务将数据上传到Influxdb
    # 配置Influxdb的访问信息
    influxdb: {
        host: "http://localhost:8086"
        db: "nebulas"
        user: "admin"
        password: "admin"
    }
}
复制代码

更多的配置实例可在 $GOPATH/src/github.com/nebulasio/go-nebulas/conf/中找到。

矿工节点配置

在项目根目录下的conf/example/miner.conf,配置矿工节点,此次依然不改动

network {
  # seed: "UNCOMMENT_AND_SET_SEED_NODE_ADDRESS"
  seed: ["/ip4/127.0.0.1/tcp/8680/ipfs/QmP7HDFcYmJL12Ez4ZNVCKjKedfE7f48f1LAkUc3Whz4jP"]
  listen: ["0.0.0.0:8780"]
  network_id: 1
}

chain {
  chain_id: 100
  datadir: "miner.1.db"
  keydir: "keydir"
  genesis: "conf/default/genesis.conf"
  start_mine: true
  # 总共21个矿工,在我们目前的测试环境中,由于我们只启动了21个矿工中的一个,就是coinbase,挖矿奖励将放入该账户
  coinbase: "n1XkoVVjswb5Gek3rRufqjKNpwrDdsnQ7Hq"
  miner: "n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE"
  # 密码
  passphrase: "passphrase"
  # 加密算法
  signature_ciphers: ["ECC_SECP256K1"]
}

rpc {
    rpc_listen: ["127.0.0.1:8784"]
    http_listen: ["127.0.0.1:8785"]
    http_module: ["api","admin"]

    # http_cors: []
}

app {
    log_level: "debug"
    log_file: "logs/miner.1"
    enable_crash_report: true
}

stats {
    enable_metrics: false
    influxdb: {
        host: "http://localhost:8086"
        db: "nebulas"
        user: "admin"
        password: "admin"
    }
}
复制代码

启动星云链

❗️注意:启动的是本地的私有链,跟官方的测试网和主网没有任何关联。

第一步:启动第一个星云节点

cd $GOPATH/src/github.com/nebulasio/go-nebulas
./neb -c conf/default/config.conf
复制代码

启动成功的景象

第二步:启动第一个矿工节点

cd $GOPATH/src/github.com/nebulasio/go-nebulas
./neb -c conf/example/miner.conf
复制代码

开始挖矿咯,哈哈

挖到了第一个区块哦

提示: 目前的DPoS共识算法,会有21个节点轮流出块。由于我们只启动了21个矿工节点中的一个矿工节点,所以每隔15*21s才出一个块。你可以启动更多的矿工节点,填补的空缺。但是需要注意,多个节点间的端口号不要相互冲突了。

  1. 在星链云上发送交易

三种方式发送我们的交易

  1. 签名 & 发送
  2. 密码 & 发送
  3. 解锁 & 发送

❗️注意:在本文中,只讲解最安全的方式1。

准备账户

在发送交易前,我们需要准备两个账户:一个账户用来发送代币 (称为"from") 和另一个账户来接收代币 (称为"to").

发送者账户

在这里,我们将会使用配置文件conf/default/genesis.conf中预分配过代币的账户中选择一个作为发送者账户,默认选择n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE。

接收者账户

我们使用如下指令创建一个全新的账户来做接收者,请记住输入的密码。

$ ./neb account new
复制代码

提示:你创建的新账户和上面可能不一样,请以你创建的账户做为接受者继续接下来的实验。

⚠️注意:刚才新建的账户地址是:n1MhrP4mQuqX7sHrMJBBqUvbJDPNsX7PDzx

新账户的keystore文件将会被放置在$GOPATH/src/github.com/nebulasio/go-nebulas/keydir/内。

启动私有链

参见上节内容,分别启动种子节点矿工节点。

一旦一个新区块被挖出,挖块奖励将会被自动发送到当前矿工配置的Coinbase账户中,在conf/example/miner.conf里,该账户就是n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE.

在星云链发送交易

星云链提供给开发者HTTP API, RPC API和CLI来和运行中的星云节点交互。在教程中,我们将会基于HTTP API(API Module| Admin Module)来介绍三种发送交易的方法。

提示:星云链的HTTP服务默认端口号为8685。

检查账户状态

每个交易如果需要上链,都需要给矿工缴纳一部分手续费,所以发送者账户中需要有一部分钱才能成功发送交易。一般一个普通转账交易,手续费在0.000000002NAS左右,非常少。

我们可以通过API Module中的/v1/user/accountstate接口来获取发送者账户n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE的账户信息,检查下是否有足够的钱支付上链手续费。

> curl -i -H Accept:application/json -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE"}'
复制代码

如我们所见,发送者账户在预分配后拥有5000000000000000000000000(5 * 10^24)个代币,1个NAS是1000000000000000000(10^18)个代币,用于支付交易上链的手续费绰绰有余。

然后我们检查接受者账户的状态

curl -i -H Accept:application/json -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"n1MhrP4mQuqX7sHrMJBBqUvbJDPNsX7PDzx"}'
复制代码

此时的结果当然是一毛钱都没有。

发送交易

签名&发送

最安全的发送交易的方式

curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/admin/sign -d '{"transaction":{"from":"n1FF1nz6tarkDVwWQkMnnwFPuPKUaQTdptE","to":"n1MhrP4mQuqX7sHrMJBBqUvbJDPNsX7PDzx", "value":"1000000000000000000","nonce":1,"gasPrice":"1000000","gasLimit":"2000000"}, "passphrase":"passphrase"}'
复制代码

结果:

然后,将签好名的交易原始数据提交到本地私有链的星云节点

curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/user/rawtransaction -d '{"data":"CiA76Vus0gugqBmtWc3XvZvU9tmLBynPTkOuBRqRRdv+PBIaGVcH+WT/SVMkY18ix7SG4F1+Z8evXJoA35caGhlXTt2F6ok3bUcfMnruUylZhLpIGu2z7+hhIhAAAAAAAAAAAA3gtrOnZAAAKAEwoIDd2QU6CAoGYmluYXJ5QGRKEAAAAAAAAAAAAAAAAAAPQkBSEAAAAAAAAAAAAAAAAAAehIBYAWJBA6veKbZCtTKyxrG9cgC2p1Vugc11rsHnRthKcEEZR6Yy9iI2WRC3Xk7VmQjjPDQj+nt5FMQX5rUwIVFRKBpr7AE="}'
复制代码

结果:

交易收据

不论使用的哪一种方法发送交易,我们都会得到两个返回值,txhash和contract_address。其中txhash为交易hash,是一个交易的唯一标识。使用txhash我们可以查看交易收据,知道当前交易的状态。

curl -i -H Accept:application/json -X POST http://localhost:8685/v1/user/getTransactionReceipt -d '{"hash":"3be95bacd20ba0a819ad59cdd7bd9bd4f6d98b0729cf4e43ae051a9145dbfe3c"}'
复制代码

结果:

这里的status可能有三种状态值,0,1和2。

  • 0: 交易失败。
  • 1: 交易成功。
  • 2: 交易待定。

查询接收者账户余额

curl -i -H Accept:application/json -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"n1MhrP4mQuqX7sHrMJBBqUvbJDPNsX7PDzx"}'
复制代码

结果是:

转账成功!

  1. 安装星云链chrome钱包插件和web钱包

安装chrome钱包插件

链接:https://github.com/nebulasio/WebExtensionWallet

点击“添加至chrome”,接着按下图指示进行操作

安装成功后

这里有三个网络选项

  • Mainnet:主网络
  • Testnet:测试网络
  • localhost:8685:本地网络

钱包怎么玩这里就不说了吧,随便点点看,炸不了的,哈哈。

安装web钱包

下载地址:https://github.com/nebulasio/web-wallet

  1. Dapp开发

安装neb.js

neb.js提供javascript开发的API接口

clone(相当于下载)neb.js

git clone https://github.com/nebulasio/neb.js.git
复制代码

安装依赖

cd neb.js
npm install
复制代码

安装gulp

npm install gulp
复制代码

打包生成

gulp
复制代码

执行生成/dist文件夹

  • neb.js:使用于浏览器,包含外部依赖。
  • neb-light.js:轻量的包,适用于控制台,不包含外部依赖。
  • nebulas.js: 浏览器全功能包,使用者可以创建地址、注册交易、发布智能合约等。

❗️注意:如果上述方法无效,可以使用传统引用方式:


复制代码

安装nebPay

NebPay SDK 为不同平台的交易提供了统一的支付接口,开发者在Dapp页面中使用NebPay API可以通过浏览器插件钱包、手机app钱包等实现交易支付和合约调用。

github地址:https://github.com/nebulasio/nebPay

安装方法同上。会生成nebPay.js文件

❗️注意:如果上述方法无效,可以使用传统引用方式:

 
复制代码

开发Dapp

新建一个index.html







    

    树洞吐槽板





    
标题
内容
0/200
执行结果:
0/200


查询信息:

地址
 
信息:
复制代码

运行Dapp

浏览器打开即可。

  1. 开发资源汇总

  • 官方网站:https://www.nebulas.io
  • Github代码库:https://github.com/nebulasio
  • Web钱包下载地址及使用文档:https://github.com/nebulasio/web-wallet
  • Chrome插件下载地址及使用文档:https://github.com/ChengOrangeJu/WebExtensionWallet
  • 区块浏览器:https://explorer.nebulas.io
  • 申请NAS测试币:https://testnet.nebulas.io/claim
  • 星云社区:https://bbs.xingyun.io
  • 开发者文档库:https://nebulearn.com/official-docs/go-nebulas
  • 开发Dapp的组件nebPay.js及文档:https://github.com/nebulasio/nebPay
  • 开发Dapp的组件neb.js及文档:https://github.com/nebulasio/neb.js
  • 开发智能合约的文档:https://github.com/nebulasio/wiki/blob/master/smart_contract_ch.md
  • 星云激励计划,Dapp开发者大赛注册链接:https://incentive.nebulas.io/cn/signup.html?invite=iFinm

pdf下载,请加入星球:

转载于:https://juejin.im/post/5b384909518825749e4a29d9

你可能感兴趣的:(星云链DApp开发)