今天看了一下星云的 DAPP 开发也是因为有奖励,把整个学习过程整理一下
文章目的
记录整个星云学习过程,看完之后可以知道合约的编写
前提
首先是注册社区账号,https://incentive.nebulas.io/cn/signup.html?invite=kyDZ2
然后看到需要一个钱包地址接受奖励又把钱包的教程看了
钱包教程|星云Web钱包教程1:创建NAS钱包
钱包教程|星云Web钱包教程6:部署智能合约这一步测试可以在右上角选测试网络,然后获取测试币,会得到一个交易哈希可以验证第五个教程查看交易状态
编写智能合约
大概知道了什么过程了又看了一个,然后进入开发过程
,先从 官方 demo开始
编写智能合约的简要规范:
- 智能合约代码必须是一个Prototype的对象
Prototype是啥 - 智能合约代码必须有一个init()的方法,这个方法只会在部署的时候被执行一次;
- 智能合约里面的私有方法是以_开头的方法,私有方法不能被外部直接调用;
编写一个银行保险箱
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 的后台接口,后面要编写前端业务了