资讯专栏INFORMATION COLUMN

(三) 用 JavaScript 写 DApp:FO 转帐

sherlock221 / 1332人阅读

摘要:官网上的说法感觉容易产生误解。上述三个链或者网完全隔离。目前我申请了两个账户,并且空投了一些测试链的。初始化客户端一切准备就绪,我们要实现转账,我们需要获取一个客户端。后记转账操作相关的内容就介绍完了。

FO 是官方在 FibOS 发行的数字货币,也在多个交易所上交易,作者在写文章的时候,大概报价是 0.05 元。官方也推出了一个简洁易用的钱包 APP 供大家管理自己的 FO 资产,有兴趣的同学也可以下载使用(https://wallet.fo/zh-cn)。有 FO 账户还没有 FO 的小伙伴不妨留下 FO 账户,说不定我会抽几个给大家打 FO 呢。

但是怎么打 FO 呢,很简单,大家可以 FO 钱包 APP 中点击转帐,输入收款账户和转账数量后点确定一气呵成。

但是例如我们在一些需要大批量转账或自动化转账的情况下,我们如何通过代码实现呢?接下来我带领大家一起来体验一下:

1. 创建项目

我们创建一个文件夹叫 transfer,并且进入该文件夹:

mkdir transfer
cd transfer

初始化项目。我们可以执行 fibos 命令是因为我们已经安装了 fibos 命令行工具。如果不清楚如何安装的可以阅读我本专栏的前一篇文章。

fibos --init

安装 fibos 依赖包。这里可以 使用 fibos 安装也可以选择 npm 命令安装。当然如果您安装特别慢,可以使用 cnpm 或者淘宝 npm 镜像。

fibos --install fibos.js

到此为止,准备工作就做完了。此时你的 transfer 文件夹的目录结构是这样的:

.
├── node_modules
└── package.json
2. 主网和测试网介绍

这里需要解释一下的是,我们在开发过程中经常碰到的链主要有三类:

主链/主网(Main Chain / Main Net),是由 21 个投票当选的节点负责出块。我们上述说到的价值 0.05 的 FO 就记录在主链上。

测试链/测试网 (Test Chain / Test Chain),测试链运行着跟主链一模一样的机制,就是大家都知道这是一条开发用来测试的链,上面的 FO 并没有价值。

本地链/本地网。这个是我生造的一个词。根据官网:https://dev.fo/zh-cn/guide/tu... 的介绍应该是在本地生成一个链或者网,只是只有你一个节点。官网上的说法感觉容易产生误解。

上述三个链或者网完全隔离。大家不要搞混了。

主链:

ID:6aa7bd33b6b45192465afa3553dedb531acaaff8928cf64b70bd4c5e49b7ec6a
EndPoint: http://api.fibos.me  
# 当然还有其他,可以在官方文档中查询:节点介绍 — Dev.fo

测试链:

ID:68cee14f598d88d340b50940b6ddfba28c444b46cd5f33201ace82c78896793a
EndPoint:http://api.testnet.fo
这里我们为了快速开始,建议使用测试网络,减少工作量和不必要的坑打击积极性。

我们可以在测试网的网站上创建几个测试账户并给几个账户空投几个 FO,创建方法:

进入http://api.testnet.fo/account,点击随机账户随机密钥,记录你的账户、私钥和公钥匙,点击创建

进入 http://api.testnet.fo/reward,输入你刚才创建的账户名称,点击获取奖励。

目前我申请了两个账户,并且空投了一些测试链的 FO。分别是:

账户: gtcmpcrcm2h5
私钥: 5JVtt2nHcr52xfULsRCAKGAFDuCazWs5Z1RcvZmerE8W3Fr66UL
公钥: FO7zZJJdfTvGKpdudAcYQp1y97wP9cC9vG2McmeWzvgLWVnkVy9m

账户: cmvdkvfgedjg
私钥: 5JBoQimR9kDB4922S7BaDjQnm8zaD5D2qNXRbbVKZryRCdUxhfc
公钥: FO7wwaYC7r1z1sP7xyBBa9prEt7dFNoMXY9ZMREEyRUYxKgx4KD4

⚠️ 注意:此处是测试链,且为了方便大家才列在这里。千万千万不要在任何地方泄露你的私钥,泄露代表资产丢失。

3. 初始化客户端

一切准备就绪,我们要实现转账,我们需要获取一个客户端。我们在目录下创建一个 initClien.js 文件,编写以下代码:

var FIBOS = require("fibos.js");

function initClient(_keyProvider) {
    return FIBOS({
        chainId: "68cee14f598d88d340b50940b6ddfba28c444b46cd5f33201ace82c78896793a",
        keyProvider: _keyProvider,
        httpEndpoint: "http://api.testnet.fo",
        logger: {
            log: null,
            error: null
        }
    });
}

module.exports = initClient;

其中 chainId 即链的 ID,这里我们接入测试链,所以输入的是测试链的 ID。httpEndpoint 即为接入点,也是测试链的接入点。_keyProvider 为要创建 Client 的那个账户的私钥,我们后续会以参数的形式传入。

此时目录结构为:

.
├── initClient.js
├── node_modules
└── package.json
4. 转帐

我们在目录中新建一个 transfer.js 文件,在文件中编码:

  var FIBOS = require("./initClient.js")
    var config = {
        "public-key": "FO7zZJJdfTvGKpdudAcYQp1y97wP9cC9vG2McmeWzvgLWVnkVy9m", // FO 转出方私钥
        "private-key": "5JVtt2nHcr52xfULsRCAKGAFDuCazWs5Z1RcvZmerE8W3Fr66UL" // FO 转入方私钥
    };

console.log(config["private-key"])
var fibos = FIBOS(config["private-key"]);

let ctx = fibos.contractSync("eosio.token");
var r = ctx.transferSync(
    "gtcmpcrcm2h5",  // FO 转出方
    "cmvdkvfgedjg",   // FO 转入方
    "0.1000 FO",  // FO数量
    "Hello Fibos",  // 附言
    {
  authorization: "gtcmpcrcm2h5" // FO 转出方账户
});
console.log(r);

此时目录结构为:

.
├── initClient.js
├── node_modules
├── package.json
└── transfer.js

执行以下命令进行转账:

fibos transfer.js

成功后会输出这次转账的详情:

{
  "broadcast": true,
  "transaction": {
    "compression": "none",
    "transaction": {
      "expiration": "2019-07-03T11:49:58",
      "ref_block_num": 52798,
      "ref_block_prefix": 459488456,
      "max_net_usage_words": 0,
      "max_cpu_usage_ms": 0,
      "delay_sec": 0,
      "context_free_actions": [],
      "actions": [
        {
          "account": "eosio.token",
          "name": "transfer",
          "authorization": [
            {
              "actor": "gtcmpcrcm2h5",
              "permission": "active"
            }
          ],
          "data": "509a90e8a22a5166c05e526c6d98b644e80300000000000004464f00000000000b48656c6c6f204669626f73"
        }
      ],
      "transaction_extensions": []
    },
    "signatures": [
      "SIG_K1_K46edAAzozP1bThRBGnkNX5M11z4kVBzAAt4qrLZfFVcqaUBhsww3rBdiYgxvhdy3K39bZso1uZGMTp6PEMiQQiDWZATnx"
    ]
  },
  "transaction_id": "5dc6a856f8821a395993a083945e919eb19c0dc277c2a88e60ea31655cc07fba",
  "processed": { ... }
5. 常见错误

Provided keys, permissions, and delays do not satisfy declared authorizations
{

"code":500,
"message":"Internal Service Error",
"error":{
    "code":3090003,
    "name":"unsatisfied_authorization",
    "what":"Provided keys, permissions, and delays do not satisfy declared authorizations",
    "details":[
        {
            "message":"transaction declares authority "{"actor":"cmvdkvfgedjg","permission":"active"}", but does not have signatures for it under a provided delay of 0 ms, provided permissions [], provided keys ["FO7zZJJdfTvGKpdudAcYQp1y97wP9cC9vG2McmeWzvgLWVnkVy9m"], and a delay max limit of 3888000000 ms",
            "file":"authorization_manager.cpp",
            "line_number":520,
            "method":"check_authorization"
        }
    ]
}

}
检查 transfer.js 文件中的公钥、私钥和 authorization 是否正确,而且都是 FO 转出方的。这里官网的示例代码注释写错了:https://dev.fo/zh-cn/guide/to...

symbol precision mismatch

{
    "code":500,
    "message":"Internal Service Error",
    "error":{
        "code":3050003,
        "name":"eosio_assert_message_exception",
        "what":"eosio_assert_message assertion failure",
        "details":[
            {
                "message":"assertion failure with message: symbol precision mismatch",
                "file":"wasm_interface.cpp",
                "line_number":924,
                "method":"eosio_assert"
            },
            {
                "message":"pending console output: ",
                "file":"apply_context.cpp",
                "line_number":72,
                "method":"exec_one"
            }
        ]
    }
}

FO 的精度错误,FO 数量一定要写四位小数。多了少了都会报这个错误。

missing contract
/Users/charlie/Code/fibos/transfer/node_modules/_eosjs@16.0.2@eosjs/lib/structs.js:546:7
      assert(contract != null, "missing contract");
      ^
Error: missing contract extransfer.quantity action.data transaction.actions
    at Object.fromObject (/Users/charlie/Code/fibos/transfer/node_modules/_eosjs@16.0.2@eosjs/lib/structs.js:546:7)
    at Object.fromObject (/Users/charlie/Code/fibos/transfer/node_modules/_fcbuffer@2.2.0@fcbuffer/lib/struct.js:151:34)
    at actionDataFromObject (/Users/charlie/Code/fibos/transfer/node_modules/_eosjs@16.0.2@eosjs/lib/structs.js:753:29)
    at Object.fromObject (/Users/charlie/Code/fibos/transfer/node_modules/_fcbuffer@2.2.0@fcbuffer/lib/struct.js:148:15)
    at Object.fromObject (/Users/charlie/Code/fibos/transfer/node_modules/_fcbuffer@2.2.0@fcbuffer/lib/types.js:384:28)
    at Object.fromObject (/Users/charlie/Code/fibos/transfer/node_modules/_fcbuffer@2.2.0@fcbuffer/lib/struct.js:151:34)
    at _callee2$ (/Users/charlie/Code/fibos/transfer/node_modules/_eosjs@16.0.2@eosjs/lib/write-api.js:657:38)
    at tryCatch (/Users/charlie/Code/fibos/transfer/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:62:40)
    at Generator.invoke [as _invoke] (/Users/charlie/Code/fibos/transfer/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:296:22)
    at Generator.forEach.prototype.(anonymous function) [as next] (/Users/charlie/Code/fibos/transfer/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:114:21)

这个使用错了 transfer 和 extransfer 函数。其中 transfer 函数表示的是与 EOS 主网兼容的转账方法,函数原型为:

其中 transfer 函数表示的是与 EOS 主网兼容的转账方法,函数原型为:

void transfer(account_name from, account_name to, asset quantity, string memo)

示例:

transfer("accountfrom", "accountto", "1.0000 FO", "memo field")

其中 extransfer 函数表示的是与 FIBOS 主网扩展的转账方法,该方法支持在 FIBOS 上发行的所有通证的转账,函数原型为:

void extransfer(account_name from, account_name to, extended_asset quantity, string memo)

示例:

extransfer("accountfrom", "accountto", "1.0000 FO@eosio", "memo field")

其中,@ 字符后表示的是该通证的发行方,系统通证 FO 为 FO@eosio,eosio 表示的是该通证是系统原生发行的通证。

6. 后记

转账操作相关的内容就介绍完了。有什么问题留言。也可以在知乎上关注我:https://zhuanlan.zhihu.com/p/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105302.html

相关文章

  • 使智能合约实现自动分账

    摘要:编写合约的智能合约分为文件和合约两部分。相当于合约接口,合约则是功能实现。用户账户金额内容提供者账户金额平台合约账户金额结果显示,分账账户和平台合约账户如预期那样获得和。综上,我们成功使用了智能合约实现了自动分账。 自动分账是很多平台都会用到的支付功能。很多互联网内容售卖平台都会跟内容提供者分账。比如:Apple 的 App Store 跟 App 开发者三七分成。很多平台都使用了支付...

    VishKozus 评论0 收藏0
  • 使智能合约实现自动分账

    摘要:编写合约的智能合约分为文件和合约两部分。相当于合约接口,合约则是功能实现。用户账户金额内容提供者账户金额平台合约账户金额结果显示,分账账户和平台合约账户如预期那样获得和。综上,我们成功使用了智能合约实现了自动分账。 自动分账是很多平台都会用到的支付功能。很多互联网内容售卖平台都会跟内容提供者分账。比如:Apple 的 App Store 跟 App 开发者三七分成。很多平台都使用了支付...

    xavier 评论0 收藏0
  • 做好 FIBOS 生态门户 —— FO 钱包 v2.0.0 新版上线

    摘要:上周的钱包上线最新版本,快来看看有哪些变化吧。未来的钱包不仅可以用来兑换或者进行的转账交易,而且可以通过实现更多的应用。如果把这个确认的时间砍掉的话,可能会存在资产分叉的风险。 上周 FIBOS 的 FO 钱包上线最新版本,快来看看有哪些变化吧。 一.视觉上的优化升以及首页快捷操作的删减和添加 最初 FO 钱包上线的时候,因为要和 FIBOS 同步,有些设计细节没有打磨好,而这次的新版...

    dreamtecher 评论0 收藏0
  • 做好 FIBOS 生态门户 —— FO 钱包 v2.0.0 新版上线

    摘要:上周的钱包上线最新版本,快来看看有哪些变化吧。未来的钱包不仅可以用来兑换或者进行的转账交易,而且可以通过实现更多的应用。如果把这个确认的时间砍掉的话,可能会存在资产分叉的风险。 上周 FIBOS 的 FO 钱包上线最新版本,快来看看有哪些变化吧。 一.视觉上的优化升以及首页快捷操作的删减和添加 最初 FO 钱包上线的时候,因为要和 FIBOS 同步,有些设计细节没有打磨好,而这次的新版...

    468122151 评论0 收藏0
  • FIBOS DAPP场景详解

    摘要:据中国防伪材料市场分析报告统计,全世界受假冒伪劣产品影响的市场金额达到了亿美元。区块链在食品领域的应用还有家乐福,年月日,家乐福正式对外宣布,家乐福中国首个区块链应用落地,上链的首个家优鲜产品琯溪蜜柚今天正式上市。 在去年的 10 月, FIBOS 举办的第一季「一念巨浪」DAPP 大赛圆满结束。大赛共收到 80 多个项目咨询,其中 62 个项目报名成功,最终 29 个项目入围进行最后...

    jone5679 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<