前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Bytom 储蓄分红 DAPP 开发指南

Bytom 储蓄分红 DAPP 开发指南

原创
作者头像
比原链Bytom
修改于 2019-07-18 09:35:32
修改于 2019-07-18 09:35:32
5300
举报
文章被收录于专栏:比原链比原链

储蓄分红DAPP

储蓄分红合约简介

储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:

从上图中可以看出,项目方发布了一个利润为20%的锁仓项目,其中储蓄合约FixedLimitCollect锁定了1000个票据资产(bill),同时项目方将200个储蓄资产(deposit)锁定到利息合约中。待项目方发布完合约之后,所有用户便可以参与了。例如上图中user1调用合约储蓄了500,这500个储蓄资产将被锁定在取现合约FixedLimitProfit中,同时user1获得了500个票据资产,剩余找零的资产将继续锁定在储蓄合约FixedLimitCollect中,以此类推,user2user3也是相同的流程,直到储蓄合约没有资产为止。取现合约FixedLimitProfit跟储蓄合约的模型大致相同,只是取现合约是由多个UTXO组成的,用户在取现的时候可以并行操作。但是如果合约中的面值不能支持用户一次性取现的话,需要分多次提取。例如user1拥有500个票据资产,而可以获得的本息总额为600,但是取现的UTXO面值为500,那么user1一次最多只能取500,剩下的100需要再构造一笔交易来提现。

合约源代码

代码语言:txt
AI代码解释
复制
// 储蓄合约
import "./FixedLimitProfit"
contract FixedLimitCollect(assetDeposited: Asset,
                        totalAmountBill: Amount,
                        totalAmountCapital: Amount,
                        dueBlockHeight: Integer,
                        expireBlockHeight: Integer,
                        additionalBlockHeight: Integer,
                        banker: Program,
                        bankerKey: PublicKey) locks billAmount of billAsset {
    clause collect(amountDeposited: Amount, saver: Program) {
        verify below(dueBlockHeight)
        verify amountDeposited <= billAmount && totalAmountBill <= totalAmountCapital
        define sAmountDeposited: Integer = amountDeposited/100000000
        define sTotalAmountBill: Integer = totalAmountBill/100000000
        verify sAmountDeposited > 0 && sTotalAmountBill > 0
        if amountDeposited < billAmount {
            lock amountDeposited of assetDeposited with FixedLimitProfit(billAsset, totalAmountBill, totalAmountCapital, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
            lock amountDeposited of billAsset with saver
            lock billAmount-amountDeposited of billAsset with FixedLimitCollect(assetDeposited, totalAmountBill, totalAmountCapital, dueBlockHeight, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
        } else {
            lock amountDeposited of assetDeposited with FixedLimitProfit(billAsset, totalAmountBill, totalAmountCapital, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
            lock billAmount of billAsset with saver
        }
    }
    clause cancel(bankerSig: Signature) {
        verify above(dueBlockHeight)
        verify checkTxSig(bankerKey, bankerSig)
        unlock billAmount of billAsset
    }
}
代码语言:txt
AI代码解释
复制
// 取现合约(本金加利息)
contract FixedLimitProfit(assetBill: Asset,
                        totalAmountBill: Amount,
                        totalAmountCapital: Amount,
                        expireBlockHeight: Integer,
                        additionalBlockHeight: Integer,
                        banker: Program,
                        bankerKey: PublicKey) locks capitalAmount of capitalAsset {
    clause profit(amountBill: Amount, saver: Program) {
        verify above(expireBlockHeight)
        define sAmountBill: Integer = amountBill/100000000
        define sTotalAmountBill: Integer = totalAmountBill/100000000
        verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill < totalAmountBill
        define gain: Integer = totalAmountCapital*sAmountBill/sTotalAmountBill
        verify gain > 0 && gain <= capitalAmount
        if gain < capitalAmount {
            lock amountBill of assetBill with banker
            lock gain of capitalAsset with saver
            lock capitalAmount - gain of capitalAsset with FixedLimitProfit(assetBill, totalAmountBill, totalAmountCapital, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
        } else {
            lock amountBill of assetBill with banker
            lock capitalAmount of capitalAsset with saver
        }
    }
    clause cancel(bankerSig: Signature) {
        verify above(additionalBlockHeight)
        verify checkTxSig(bankerKey, bankerSig)
        unlock capitalAmount of capitalAsset
    }
}

合约的源代码说明可以具体参考Equity合约介绍.

注意事项:

  • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
  • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000
  • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产

编译并实例化合约

编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:

代码语言:txt
AI代码解释
复制
assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
totalAmountBill         :10000000000
totalAmountCapital      :20000000000
dueBlockHeight          :1070
expireBlockHeight       :1090
additionalBlockHeight   :1100
banker                  :0014dedfd406c591aa221a047a260107f877da92fec5
bankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf

其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpubPath,否则无法正确调用clause cancel

实例化合约命令如下:

代码语言:txt
AI代码解释
复制
// 储蓄合约
./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf

// 取现合约
./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf

发布合约交易

发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:

代码语言:txt
AI代码解释
复制
{
  "base_transaction": null,
  "actions": [
    {
      "account_id": "0ILGLSTC00A02",
      "amount": 20000000,
      "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
      "type": "spend_account"
    },
    {
      "account_id": "0ILGLSTC00A02",
      "amount": 100000000000,
      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
      "type": "spend_account"
    },
    {
      "amount": 100000000000,
      "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
      "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",
      "type": "control_program"
    }
  ],
  "ttl": 0,
  "time_range": 1521625823
}

合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。

此外,开发者需要存储一下合约UTXOassetIDprogram,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:

代码语言:txt
AI代码解释
复制
// 储蓄合约
assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3
program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0

// 取现合约
assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0

储蓄分红DAPP架构模型

比原链的DAPP总体框架模型描述了DAPP的大致结构模型,结合储蓄分红合约案例,其具体流程如下:

DAPP前端

储蓄分红合约前端逻辑处理流程大致如下:

  • 1)调用插件
代码语言:txt
AI代码解释
复制
比原的`chrome`插件源码位于[Bytom-JS-SDK](https://github.com/Bytom/Bytom-JS-SDK),开发比原`DAPP`时调用插件的说明可以参考[Dapp Developer Guide](https://github.com/Bytom/Bystore/wiki/Dapp-Developer-Guide)
  • 2)配置合约参数
代码语言:txt
AI代码解释
复制
该`Dapp demo`中需要配置实例化的参数为`assetDeposited`、`totalAmountBill`、`totalAmountCapital`、`dueBlockHeight`、`expireBlockHeight`、`additionalBlockHeight`、`banker`、`bankerKey`。其前端配置文件为[`configure.json.js`](https://github.com/Bytom/Bytom-Dapp-Demo/blob/master/contracts/configure.json.js)
代码语言:txt
AI代码解释
复制
```js
代码语言:txt
AI代码解释
复制
var config = {
代码语言:txt
AI代码解释
复制
    "solonet": {
代码语言:txt
AI代码解释
复制
        "depositProgram": "2091194ddbf3614cafbadb1274c33e61afd4d5044c6ec4c30f8202980199c30083160014c800033d5e94de5f22e23a6d3cbeaed87b55bd640600204aa9d101050010a5d4e8203310d9951697418af3cdbe7a9cdde1dc49bb5439503dacb33828d6c9ef5af5a24dfc01567a64f5010000c358797ca153795579a19a6957790400e1f5059653790400e1f505967c00a07c00a09a69c358797c9f91616429010000005879c2547951005b79895a7989597989587989537a894c9a567a649300000057790400e1f5059653790400e1f505967800a07800a09a5a7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f9161647c0000000059795479515979c1695178c2515b79c16952c3527994c251005b79895a79895979895879895779895679890274787e008901c07ec169638e0000000059795479515979c16951c3c2515b79c169639a000000567a567aae7cac890274787e008901c07ec169515879c2515a79c16952c3597994c251005a79895979895879895779895679895579890274787e008901c07ec16963f0010000005879c2547951005b79895a7989597989587989537a894c9a567a649300000057790400e1f5059653790400e1f505967800a07800a09a5a7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f9161647c0000000059795479515979c1695178c2515b79c16952c3527994c251005b79895a79895979895879895779895679890274787e008901c07ec169638e0000000059795479515979c16951c3c2515b79c169639a000000567a567aae7cac890274787e008901c07ec16951c3c2515a79c16963fc010000567a567aae7cac747800c0",
代码语言:txt
AI代码解释
复制
        "profitProgram": "2091194ddbf3614cafbadb1274c33e61afd4d5044c6ec4c30f8202980199c30083160014c800033d5e94de5f22e23a6d3cbeaed87b55bd640600204aa9d101050010a5d4e820666f298d34806a6db0528c3b3d081bc00fa58aa393e7c42f90d67eb7db2a524f4c9a567a649300000057790400e1f5059653790400e1f505967800a07800a09a5a7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f9161647c0000000059795479515979c1695178c2515b79c16952c3527994c251005b79895a79895979895879895779895679890274787e008901c07ec169638e0000000059795479515979c16951c3c2515b79c169639a000000567a567aae7cac747800c0",
代码语言:txt
AI代码解释
复制
        "assetDeposited": "3310d9951697418af3cdbe7a9cdde1dc49bb5439503dacb33828d6c9ef5af5a2",
代码语言:txt
AI代码解释
复制
        "assetBill": "666f298d34806a6db0528c3b3d081bc00fa58aa393e7c42f90d67eb7db2a524f",
代码语言:txt
AI代码解释
复制
        "totalAmountBill": 1000000000000,
代码语言:txt
AI代码解释
复制
        "totalAmountCapital": 2000000000000,
代码语言:txt
AI代码解释
复制
        "dueBlockHeight": 0,
代码语言:txt
AI代码解释
复制
        "expireBlockHeight": 0,
代码语言:txt
AI代码解释
复制
        "banker": "0014c800033d5e94de5f22e23a6d3cbeaed87b55bd64",
代码语言:txt
AI代码解释
复制
        "gas": 0.4
代码语言:txt
AI代码解释
复制
    },
代码语言:txt
AI代码解释
复制
    "testnet":{
代码语言:txt
AI代码解释
复制
        "depositProgram": "20f39af759065598406ca988f0dd79af9175dd7adcbe019317a2d605578b1597ac1600147211ec12410ce8bd0d71cab0a29be3ea61c71eb103c8260203da240203da2402060080f420e6b50600407a10f35a2000d38a1c946e8cba1a69493240f281cd925002a43b81f516c4391b5fb2ffdacd4d4302597a64370200005479cda069c35b790400e1f5059600a05c797ba19a53795579a19a695a790400e1f5059653790400e1f505967800a07800a09a6955797b957c9600a069c35b797c9f9161645b010000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec1696332020000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c1696343020000547acd9f69587a587aae7cac747800c0",
代码语言:txt
AI代码解释
复制
        "profitProgram": "20f39af759065598406ca988f0dd79af9175dd7adcbe019317a2d605578b1597ac1600147211ec12410ce8bd0d71cab0a29be3ea61c71eb103c8260203da2402060080f420e6b50600407a10f35a20f855baf98778a892bad0371f5afca845191824dc8584585d566fbbc8ef1f304c4ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac747800c0",
代码语言:txt
AI代码解释
复制
        "assetDeposited": "00d38a1c946e8cba1a69493240f281cd925002a43b81f516c4391b5fb2ffdacd",
代码语言:txt
AI代码解释
复制
        "assetBill": "f855baf98778a892bad0371f5afca845191824dc8584585d566fbbc8ef1f304c",
代码语言:txt
AI代码解释
复制
        "totalAmountBill": 100000000000000,
代码语言:txt
AI代码解释
复制
        "totalAmountCapital": 200000000000000,
代码语言:txt
AI代码解释
复制
        "dueBlockHeight": 140506,
代码语言:txt
AI代码解释
复制
        "expireBlockHeight": 140506,
代码语言:txt
AI代码解释
复制
        "banker": "00147211ec12410ce8bd0d71cab0a29be3ea61c71eb1",
代码语言:txt
AI代码解释
复制
        "gas": 0.4
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
```
  • 3)前端预计算处理
代码语言:txt
AI代码解释
复制
以储蓄合约`FixedLimitCollect`为例,前端需要对该合约进行`verify`语句的预判断逻辑,以防用户输入参数之后执行失败。此外,合约中`billAmount of billAsset`表示锁定的资产和数量,而`billAmount`、`billAsset`和`utxohash`都是储存在缓冲服务器的数据表里面,因此前端需要调用`list-utxo`查找与该资产`asset`和`program`相关的所有未花费的utxo。 具体可以参考[`DAPP DEMO`前端案例](https://github.com/Bytom/Bytom-Dapp-Demo/tree/master/src)。
  • 4)交易组成
代码语言:txt
AI代码解释
复制
比原的交易是多输入多输出的模板结构,如果合约中包含了多个`lock`或`unlock`语句,那么就需要用户构造多输入多输出的交易模板,同时,构造交易还需要根据`lock`语句或`unlock`语句来变换。交易构造具体可以参考[储蓄合约交易模型](https://github.com/Bytom/Bytom-Dapp-Demo/tree/master/src/components/layout/save)和[取现合约交易模型](https://github.com/Bytom/Bytom-Dapp-Demo/tree/master/src/components/layout/profit)的前端源代码。
  • 交易input结构如下:
代码语言:txt
AI代码解释
复制
`spendUTXOAction(utxohash)`表示花费的合约`utxo`,其中`utxohash`表示合约`UTXO`的`hash`,而`spendWalletAction(amount, Constant.assetDeposited)`表示用户输入的储蓄或取现的数量(仅包含中需要资产交换的合约中),而资产类型则由前端固定。
代码语言:txt
AI代码解释
复制
```ecmascript 6
代码语言:txt
AI代码解释
复制
export function spendUTXOAction(utxohash){
代码语言:txt
AI代码解释
复制
    return {
代码语言:txt
AI代码解释
复制
        "type": "spend_utxo",
代码语言:txt
AI代码解释
复制
        "output_id": utxohash
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
export function spendWalletAction(amount, asset){
代码语言:txt
AI代码解释
复制
    return {
代码语言:txt
AI代码解释
复制
        "amount": amount,
代码语言:txt
AI代码解释
复制
        "asset": asset,
代码语言:txt
AI代码解释
复制
        "type": "spend_wallet"
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
const input = []
代码语言:txt
AI代码解释
复制
input.push(spendUTXOAction(utxohash))
代码语言:txt
AI代码解释
复制
input.push(spendWalletAction(amount, Constant.assetDeposited))
代码语言:txt
AI代码解释
复制
```
  • 交易output结构如下:
代码语言:txt
AI代码解释
复制
根据合约中`if-else`判定逻辑,下面便是储蓄分红合约的`output`的构造模型。
代码语言:txt
AI代码解释
复制
```ecmascript 6
代码语言:txt
AI代码解释
复制
export function controlProgramAction(amount, asset, program){
代码语言:txt
AI代码解释
复制
    return {
代码语言:txt
AI代码解释
复制
        "amount": amount,
代码语言:txt
AI代码解释
复制
        "asset": asset,
代码语言:txt
AI代码解释
复制
        "control_program": program,
代码语言:txt
AI代码解释
复制
        "type": "control_program"
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
export function controlAddressAction(amount, asset, address){
代码语言:txt
AI代码解释
复制
    return {
代码语言:txt
AI代码解释
复制
        "amount": amount,
代码语言:txt
AI代码解释
复制
        "asset": asset,
代码语言:txt
AI代码解释
复制
        "address": address,
代码语言:txt
AI代码解释
复制
        "type": "control_address"
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
const output = []
代码语言:txt
AI代码解释
复制
if(amountDeposited < billAmount){
代码语言:txt
AI代码解释
复制
    output.push(controlProgramAction(amountDeposited, Constant.assetDeposited, Constant.profitProgram))
代码语言:txt
AI代码解释
复制
    output.push(controlAddressAction(amountDeposited, billAsset, saver))
代码语言:txt
AI代码解释
复制
    output.push(controlProgramAction((billAmount-amountDeposited), billAsset, Constant.depositProgram))
代码语言:txt
AI代码解释
复制
}else{
代码语言:txt
AI代码解释
复制
    output.push(controlProgramAction(amountDeposited, Constant.assetDeposited, Constant.profitProgram))
代码语言:txt
AI代码解释
复制
    output.push(controlAddressAction(billAmount, billAsset, saver))
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
```
  • 5)启动前端服务
代码语言:txt
AI代码解释
复制
编译前端命令如下:
代码语言:txt
AI代码解释
复制
```sh
代码语言:txt
AI代码解释
复制
npm run build
代码语言:txt
AI代码解释
复制
```
代码语言:txt
AI代码解释
复制
启动之前需要先启动`bufferserver`缓冲服务器,然后再启动前端服务,其前端启动命令如下:
代码语言:txt
AI代码解释
复制
```sh
代码语言:txt
AI代码解释
复制
npm start
代码语言:txt
AI代码解释
复制
```

DAPP缓冲服务器

缓冲服务器主要是为了在管理合约UTXO层面做一些效率方面的处理,包括了对bycoin服务器是如何同步请求的,此外对DAPP的相关交易记录也进行了存储。具体可以参考一下bufferserver源代码

  • 1)储蓄分红合约的架构说明如下:
  • 缓冲服务器构成,目前设计了3张数据表:baseutxobalance表。其中base表用于初始化该DAPP关注的合约program,即在查找utxo集合的时候,仅仅只需过滤出对应的program和资产即可; utxo表是该DAPP合约的utxo集合,其数据是从bycoin服务器中实时同步过来的,主要是为了提高DAPP的并发性; balance表是为了记录用户参与该合约的交易列表。
  • 后端服务由API进程和同步进程组成,其中API服务进程用于管理对外的用户请求,而同步进程包含了两个方面:一个是从bycoin服务器同步utxo,另一个是则是通过区块链浏览器查询交易状态
  • 项目管理员调用update-base接口更新DAPP关注的合约programasset。而utxo同步进程会根据base表的记录来定时扫描并更新本地的utxo表中的信息,并且根据超时时间定期解锁被锁定的utxo
  • 用户在调用储蓄或取现之前需要查询合约的utxo是否可用,可用的utxo集合中包含了未确认的utxo。用户在前端在点击储蓄或取现按键的时候,会调用utxo最优匹配算法选择最佳的utxo,然后调用update-utxo接口对该utxo进行锁定,最后就用户就可以通过插件钱包调用bycoin服务器的构建交易接口来创建交易、签名交易和提交交易。倘若所有合约utxo都被锁定了,则会缩短第一个utxo的锁定时间为60s,设置该时间间隔是为了保证未确认的交易被成功验证并生成未确认的utxo。如果该时间间隔并没有产生新的utxo,则认为前面一个用户并没有产生交易,则60s后可以再次花费该utxo
  • 用户发送交易成功后会生成两条balance记录表,默认状态是失败的,其中交易ID用于向区块链浏览器查询交易状态,如果交易成功则会更新balance的交易状态。此外,前端页面的balance列表表只显示交易成功的记录。
  • 2)编译bufferserver源代码
代码语言:txt
AI代码解释
复制
按照[`README`](https://github.com/oysheng/bufferserver/blob/master/README.md)安装部署服务需要的软件包`Mysql`和`Redis`,然后下载源代码并编译:
代码语言:txt
AI代码解释
复制
```sh
代码语言:txt
AI代码解释
复制
make all
代码语言:txt
AI代码解释
复制
```
代码语言:txt
AI代码解释
复制
编译完成之后,在`target`目录下会生成可执行文件`api`和`updater`。
  • 3)启动服务
代码语言:txt
AI代码解释
复制
使用`root`用户创建数据库和数据表,其命令如下:
代码语言:txt
AI代码解释
复制
```sh
代码语言:txt
AI代码解释
复制
mysql -u root -p < database/dump.sql
代码语言:txt
AI代码解释
复制
```
代码语言:txt
AI代码解释
复制
修改配置文件`config_local.json`,字段说明参考[`README`](https://github.com/oysheng/bufferserver/blob/master/README.md)的`config`配置参数详解。
代码语言:txt
AI代码解释
复制
启动`api`和`updater`服务器,其中`api`是提供`JSON RPC`请求的服务进程,`updater`是提供同步`blockcenter`和区块链浏览器数据请求的服务进程。
代码语言:txt
AI代码解释
复制
```sh
代码语言:txt
AI代码解释
复制
./target/api config_local.json
代码语言:txt
AI代码解释
复制
./target/updater config_local.json
代码语言:txt
AI代码解释
复制
```

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
分享个开源项目,Excelize 是开源的专业 Excel 文档基础库 https://github.com/xuri/excelize 支持条件格式、数据验证、公式、图表、数据透视表、Sparkline、富文本、冻结窗格、高性能流式读写等复杂功能,可以在较低的资源占用率下生成数十万行、千万级单元格,希望能够帮助到有需要的朋友~
分享个开源项目,Excelize 是开源的专业 Excel 文档基础库 https://github.com/xuri/excelize 支持条件格式、数据验证、公式、图表、数据透视表、Sparkline、富文本、冻结窗格、高性能流式读写等复杂功能,可以在较低的资源占用率下生成数十万行、千万级单元格,希望能够帮助到有需要的朋友~
回复回复1举报
推荐阅读
GraphRAG失效?快用Prompt Tune适配文档的领域和语言
我最近在arXiv上下载RAG相关的论文,几百篇的论文,肉眼去一一观看实在是太难了。因此打算通过强大的GraphRAG索引这些文章的摘要,我希望GraphRAG能够根据实体提取和社群分区,能够告知我RAG的研究脉络和大概的研究领域。然而效果并不理想,提取出的实体和问答实在难以恭维,是GraphRAG失效了吗?今天让我们通过实验测试默认prompt索引与查询,并使用Prompt Tune对输入文档领域进行适配后的索引与查询,但是否会更好呢,让我们一探究竟。本文分为5小结,如何下载论文摘要、默认prompt索引查询与可视化,使用prompt tune进行领域适配索引查询和可视化,总结全文与不足。
AgenticAI
2025/03/18
920
GraphRAG失效?快用Prompt Tune适配文档的领域和语言
GraphRAG手调Prompt提取自定义实体
GraphRAG在使用Prompt-Tune根据领域自动生成的实体总是不理想怎么办?这个时候就需要手动调整啦,当然我们还需要借助ChatGPT类的助手帮助我们生成一些Example。
AgenticAI
2025/03/18
1160
GraphRAG手调Prompt提取自定义实体
75% 成本和时间削减:优化微软 GraphRAG 索引的秘密
书接上回《实战微软新一代RAG:GraphRAG强大的全局理解能力,碾压朴素RAG?》,想必大家都知道我最近在测试GraphRAG,由于其惊人的理解能力,我一直在探索。当然遇到的问题也比较多,比如community_reports不生效,tokens per minute和requests per minute不生效,全局搜索经常JSONDecodeError,以及高昂的成本和时间。这4个问题,我提交了4个PR去修复。本篇将围绕这4个问题和PR说明,最主要的是如何大幅降低成本和时间进行说明,修改很简单,但是精度上升了。
AgenticAI
2025/03/18
840
75% 成本和时间削减:优化微软 GraphRAG 索引的秘密
NLTK vs LLM:GraphRAG实体提取方法深度大比
书接上文《75% 成本和时间削减:优化微软 GraphRAG 索引的秘密》,我们在修复一些bug和缩减大量成本后,使得GraphRAG更易于使用。其实在缩减成本上,GraphaRAG还有一个隐藏的功能,那就是使用NLTK来提取实体。NLTK,全称Natural Language Toolkit(自然语言工具包),是一个开源的Python库,主要用于自然语言处理(NLP)的研究和开发。这篇文章主要讨论了如何通过使用NLTK和LLM两种不同的方法来进行实体提取,以优化和比较在GraphRAG中的应用效果。
AgenticAI
2025/03/18
830
NLTK vs LLM:GraphRAG实体提取方法深度大比
解密prompt系列41. GraphRAG真的是Silver Bullet?
这一章我们介绍GraphRAG范式,算着时间也是该到图谱了,NLP每一轮新模型出来后,往往都是先研究微调,然后各种预训练方案,接着琢磨数据,各种主动学习半监督,弱监督,无监督,再之后就到图谱和对抗学习~
风雨中的小七
2024/10/24
3800
解密prompt系列41. GraphRAG真的是Silver Bullet?
Graph RAG 生成图谱的关键Prompt
上一篇就Graph RAG主要作用、生成流程进行了简要描述,如果我们想要在系统层面实现知识图谱的生成,当然仅有理论还是不够的,需要进一步看一下各个步骤具体的做法是怎样的。
神采奕奕
2024/08/16
2600
小白也能看懂,手把手教你启动graphrag-server
最近我基于微软GraphRAG,编写了一个支持极速流式输出的Web服务graphrag-server,还支持可访问的参考文档链接。然而很多粉丝说之前的视频不够傻瓜,今天我就带你手把手安装graphrag-server,并配合桌面应用使用,告别使用命令行傻等结果。极速流式输入的演示效果,可参考上一个视频《不要再傻等了GraphRAG查询极速流式输出,秒速回复》。本文分为安装、配置、索引、启动web服务和配置桌面应用。可视化请参考前文《喂饭教程!全网首发Neo4J可视化GraphRAG索引》,脚本已经内置在graphrag-server的script中。
AgenticAI
2025/03/18
1470
小白也能看懂,手把手教你启动graphrag-server
实战微软新一代RAG:GraphRAG强大的全局理解能力,碾压朴素RAG?
微软近日开源了新一代RAG框架GraphRAG[1],以解决当前RAG在大型语料库上全局理解问题。当前RAG主要聚焦于局部检索能力,即根据查询语句在向量库中匹配部分知识,然后通过大型语言模型合成这些检索到的信息,生成一个自然流畅的回答。相信大部分同学看过《仙逆》这部小说,如果你问王林这一生有几个相好?如果让RAG来回答,它能回答出来吗?而GraphRAG通过两个阶段构建基于图的文本索引:首先从源文档中推导出实体知识图谱,然后为所有紧密相关的实体群体生成社区摘要。给定一个问题,每个社区摘要用于生成部分回应,然后将所有部分回应总结为最终用户的回答。通过这样的方法,那么我们再问王林这一生有多少女人,是不是会容易的多了呢?下图来自百度百科-王林词条[2]。本文将先首先概述RAG和GraphRAG,然后介绍如何安装、如何使用GraphRAG对《仙逆》进行索引和回答测试。
AgenticAI
2025/03/18
1910
实战微软新一代RAG:GraphRAG强大的全局理解能力,碾压朴素RAG?
实战使用 GraphRAG 索引整本《西游记》,解锁黑悟空通关路
最近游戏科学的《黑神话:悟空》爆火,然而我发现为啥好多妖怪妖精我都记不得了呢?怎么和我小时候看的动画版西游记不一样呢?亢金星君是谁?白衣秀士是谁?广智?金池长老?老了呀,都不记得了。本文尝试用 GraphRAG 索引整本《西游记》,带你重温经典。本文分为手调实体、索引、可视化、问答几个部分。另外,我们也会测试一下 GraphRAG 可否识别孙行者、行者孙、者行孙和孙悟空是否为同一个人。
AgenticAI
2025/03/18
470
实战使用 GraphRAG 索引整本《西游记》,解锁黑悟空通关路
GitHub Models
The first step in developing generative AI applications is to choose a model. How to choose a model is the key. This includes
JusterZhu
2025/01/23
810
GitHub Models
使用Neo4j和LangChain实现“Local to Global”的GraphRAG
GraphRAG是一种基于知识图谱的检索增强技术。它使用多来源数据构建图模型的知识表达,将实体和关系之间的联系以图的形式展示,然后利用大语言模型进行检索增强。这种方法能更高效准确地检索相关信息,并为LLM生成响应提供更好的上下文。微软和领英的技术人员已经科学的验证了这种技术相较于基线 RAG 的优势,并发表了相关论文。
马超的博客
2024/07/15
3.1K0
使用Neo4j和LangChain实现“Local to Global”的GraphRAG
GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
今天看到这样一篇文章,文章的标题是【关于AI技术的思考,是 提高 or 降低 | 开发者的职业天花板】,文章的链接:https://cloud.tencent.com/developer/article/2466467 文章很有作者个人的思考,有些见解比较独到,让我深有所思。
zhouzhou的奇妙编程
2024/12/09
1.6K3
知识图谱
一般我们选用的是neo4j。下载地址:https://we-yun.com/doc/neo4j-chs/
算法之名
2025/02/06
840
知识图谱
将微软GraphRAG输出到Neo4J并使用Langchain或LlamaIndex实现本地和全局检索
微软的 GraphRAG 实现最近获得了极大的关注。在上一篇博文中,我讨论了如何构建图形,并探讨了研究论文中强调的一些创新方面。从高层次来看,GraphRAG 库的输入是包含各种信息的源文件。这些文档使用大语言模型(LLM)进行处理,以提取文档中出现的实体及其关系的结构化信息。提取的结构化信息随后被用于构建知识图谱。
AgenticAI
2025/03/18
1640
将微软GraphRAG输出到Neo4J并使用Langchain或LlamaIndex实现本地和全局检索
利用知识图谱提高 RAG 应用的准确性
在 RAG 应用中使用 Neo4j 和 LangChain 构建和检索知识图谱信息的实用指南
大数据杂货铺
2024/04/02
7670
利用知识图谱提高 RAG 应用的准确性
微调大型语言模型进行命名实体识别
大型语言模型的目标是理解和生成与人类语言类似的文本。它们经过大规模的训练,能够对输入的文本进行分析,并生成符合语法和语境的回复。这种模型可以用于各种任务,包括问答系统、对话机器人、文本生成、翻译等。
deephub
2024/03/20
3480
微调大型语言模型进行命名实体识别
7 种查询策略教你用好 Graph RAG 探索知识图谱
近来 NebulaGraph 社区在 LLM + Graph 和 Graph RAG 领域进行了深入的探索和分享。在 LlamaIndex 和 LangChain 中,NebulaGraph 引入了一系列知识图谱和图存储工具,支持编排、图谱与大模型间的交互。之前,NebulaGraph 布道师古思为作为这项工作的主要贡献者已向大家详细介绍了如何构建图谱、Text2Cypher、GraphRAG、GraphIndex 等方法,并展示了相关示例与效果。
NebulaGraph
2023/12/06
2.9K0
7 种查询策略教你用好 Graph RAG 探索知识图谱
使用GraphRAG+LangChain+Ollama:LLaMa 3.1跑通知识图谱与向量数据库集成(Neo4j)
我将向你展示如何使用 LLama 3.1(一个本地运行的模型)来执行GraphRAG操作,总共就50号代码。。。
AI进修生
2024/12/02
7780
使用GraphRAG+LangChain+Ollama:LLaMa 3.1跑通知识图谱与向量数据库集成(Neo4j)
NebulaGraph7 种查询(关键词、向量、混合检索),Graph RAG 探索知识图谱
如果你熟悉知识图谱和图数据库 NebulaGraph,可以直接跳到 “RAG 具体实现” 章节。如果你不熟悉 NebulaGraph,请继续往下读。
汀丶人工智能
2024/01/20
3.1K0
NebulaGraph7 种查询(关键词、向量、混合检索),Graph RAG 探索知识图谱
【AI落地应用实战】构建基于知识图谱的知识问答系统
今天给大家分享的这篇好事文章:《腾讯IMA:AI智能工作台的革命性创新》,腾讯IMA的特点是能够把很多文章保存到知识库中,让你一下子就可以拥有一个专题的文章库。 这一点其实很适合去钻研某一个问题。这个知识库其实就是利用了混元大模型+RAG的架构,在借助于混元大模型的帮助,同时不需要微调的情况下,我们就可以搭建属于自己的知识库。 简单来说就是通过大模型LLM的能力,在其基础上引入外部的知识库数据,这样大模型AI在回答问题的时候更加的精确。
中杯可乐多加冰
2024/11/14
3300
推荐阅读
相关推荐
GraphRAG失效?快用Prompt Tune适配文档的领域和语言
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文