星云Dapp学习记录

今天看了一下星云的 DAPP 开发也是因为有奖励,把整个学习过程整理一下

文章目的

记录整个星云学习过程,看完之后可以知道合约的编写

前提

首先是注册社区账号,https://incentive.nebulas.io/cn/signup.html?invite=kyDZ2

然后看到需要一个钱包地址接受奖励又把钱包的教程看了

钱包教程|星云Web钱包教程1:创建NAS钱包

钱包教程|星云Web钱包教程2:发起转账

钱包教程|星云Web钱包教程3:离线签名交易

钱包教程|星云Web钱包教程4:查看钱包信息

钱包教程|星云Web钱包教程5:查看交易状态

钱包教程|星云Web钱包教程6:部署智能合约这一步测试可以在右上角选测试网络,然后获取测试币,会得到一个交易哈希可以验证第五个教程查看交易状态

编写智能合约

大概知道了什么过程了又看了一个,然后进入开发过程
,先从 官方 demo开始

编写智能合约的简要规范:

  1. 智能合约代码必须是一个Prototype的对象
    Prototype是啥
  2. 智能合约代码必须有一个init()的方法,这个方法只会在部署的时候被执行一次;
  3. 智能合约里面的私有方法是以_开头的方法,私有方法不能被外部直接调用;

编写一个银行保险箱
1. 用户可以向这个银行保险柜存钱。
1. 用户可以从这个银行保险柜取钱。
1. 用户可以查询银行保险柜中的余额。

里面涉及到一些LocalContractStorage BigNumber Blockchain这些全局对象在这个文档里面查看
Smart Contract

LocalContractStorage

可以存储数字,字符串,JavaScript对象,存储数据只能在智能合约内使用,其他合约不能读取存储的内容。

BigNumber()

The BigNumber module use the bignumber.js,
具体用法直接看这个
bignumber.js

Blockchain

提供生成交易或者执行合约的区块信息

'use strict';

//创建DepositeContent用来保存余额
var DepositeContent = function (text) {
  if (text) {
    var o = JSON.parse(text);
    this.balance = new BigNumber(o.balance);
    this.expiryHeight = new BigNumber(o.expiryHeight);
  } else {
    this.balance = new BigNumber(0);
    this.expiryHeight = new BigNumber(0);
  }
};

DepositeContent.prototype = {
  toString: function () {
    return JSON.stringify(this);
  }
};

var BankVaultContract = function () {
//定义了一个属于 this的名为"bankVault"的StorageMap
  LocalContractStorage.defineMapProperty(this, "bankVault", {
    parse: function (text) {
      return new DepositeContent(text);
    },
    stringify: function (o) {
      return o.toString();
    }
  });
};

// save value to contract, only after height of block, users can takeout
BankVaultContract.prototype = {
//1. 智能合约代码必须有一个init()的方法,这个方法只会在部署的时候被执行一次;
  init: function () {
    //TODO:
  },
//存钱
  save: function (height) {
  //执行合同的交易
    var from = Blockchain.transaction.from;
    var value = Blockchain.transaction.value;
    var bk_height = new BigNumber(Blockchain.block.height);

    //从bankVault查询是否保存过
    var orig_deposit = this.bankVault.get(from);

    if (orig_deposit) {
    //存过加上原值
      value = value.plus(orig_deposit.balance);
    }

    var deposit = new DepositeContent();
    deposit.balance = value;
    deposit.expiryHeight = bk_height.plus(height);

    this.bankVault.put(from, deposit);
  },
//取钱
  takeout: function (value) {
    var from = Blockchain.transaction.from;
    var bk_height = new BigNumber(Blockchain.block.height);
    var amount = new BigNumber(value);

    var deposit = this.bankVault.get(from);
    if (!deposit) {
      throw new Error("No deposit before.");
    }

    if (bk_height.lt(deposit.expiryHeight)) {
      throw new Error("Can not takeout before expiryHeight.");
    }

    if (amount.gt(deposit.balance)) {
      throw new Error("Insufficient balance.");
    }

    var result = Blockchain.transfer(from, amount);
    if (!result) {
      throw new Error("transfer failed.");
    }
    //Event.Trigger(topic, obj);
    //The Event module records execution events in contract. The recorded events are stored in the event trie on the chain, which can be fetched by FetchEvents method in block with the execution transaction hash. All contract event topics have a chain.contract. prefix before the topic they set in contract.
    Event.Trigger("BankVault", {
      Transfer: {
        from: Blockchain.transaction.to,
        to: from,
        value: amount.toString()
      }
    });

    deposit.balance = deposit.balance.sub(amount);
    this.bankVault.put(from, deposit);
  },
 //查询余额
  balanceOf: function () {
    var from = Blockchain.transaction.from;
    return this.bankVault.get(from);
  },
  //检查地址
  verifyAddress: function (address) {
    // 1-valid, 0-invalid
    var result = Blockchain.verifyAddress(address);
    return {
      valid: result == 0 ? false : true
    };
  }
};
module.exports = BankVaultContract;

部署

先通过钱包第六个教程通过可视化网页来部署,以后再通过网页的源码了解部署的过程,

获取测试币在测试网络部署,按照教程就可以测试提交 ok

交易哈希可以查询交易信息,包含等待上链和已经打包的交易。在交易打包验证时需要多次刷新查询交易的打包状态变更。


5b2fb49acfb1657169032245f4a9276b62f93f49ca07abcc2cb0614a5ad5e6a1

交易详情

TX Hash 43d366c4733846814d94fd13011b47fdf005845ca7381b51754af056ca551a2e
Contract address    n1veuXgaaEysjakVcGLKm9ss4WAMEfpf5mF

在钱包 合约-搜索 里面输入交易能看到合约代码

执行智能合约中的方法

在钱包合约-执行输入函数,需要参数填上参数,例子中 save 需要参数否则BigNumber会报错 ,测试,用钱包操作起来要方便很多比用 http 请求,本质是一样的。

做了这些就相当于写好了 app 的后台接口,后面要编写前端业务了

官方帮助文档链接

获取测试币

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值