EOS区块链开发的第一步

对于区块链的初创企业来说,去年真的是史诗般的一年。由于以太坊区块链以及它为开发人员创建去中心化的应用程序带来了机会,许多区块链公司诞生了。

以太坊引入了Solidity语言和智能合约 - 去中心化应用的构建模块,开启了区块链开发的火花。然而,以太坊才刚刚开始。区块链技术正在快速发展,现在又出现了一个新的,最强大的技术。是时候介绍EOS区块链了

EOS的目标是成为第一个支持工业规模去中心化应用的操作系统。它引入了一种新的区块链架构,旨在实现dApp的垂直和水平扩展。它是通过创建一个类似操作系统的构造来实现的,可以在其上构建应用程序。

EOSIO软件提供帐户,身份验证,数据库,异步通信以及跨多个CPU核心或群集的应用程序调度。由此产生的技术是一种区块链架构,最终可以扩展到每秒数百万次交易,没有用户费用,并允许在受治理的区块链环境中快速轻松地部署和维护分散式应用程序。

当然,与其兄弟姐妹相比,EOS设定的水平非常高!

EOS区块链开发

为了帮助EOS区块链开发社区,Infinite X Labs的开发团队决定运行一系列专门用于EOS开发的教程。在本教程中,我们将探讨有助于您设置环境并运行第一个testnet节点的步骤。我们将创建一个帐户,我们将部署一个示例智能合约到EOS区块链,以便我们可以与之交互。

请注意,EOSIO仍处于开发阶段,未来某些步骤可能会发生变化。但是,我们的团队将尽力保持教程始终是最新的

上次更新 - 201811月25日 - 本教程使用最新版本的EOSIO - v1.4.4进行了更新

那么,让我们开始吧!

1.设置构建/开发环境

为了构建EOS dApp,我们首先需要设置我们的环境。当您在大多数情况下构建dApp时,您将使用testnet。EOS为我们提供了构建本地testnet或公共testnet的选择。在编写本教程时,公共testnet目前不可用,因此我们将使用本地testnet。

出于本教程的目的,我们将使用macOS Mojave版本10.14

由于EOSIO的自动构建脚本,设置环境非常简单。它安装所有依赖项并构建EOSIO。在运行脚本之前,作为第一步,使用以下命令以递归方式克隆EOS repo:

git clone https://github.com/eosio/eos --recursive

完成此操作后,转到eos文件夹并使用以下命令运行eosio_build.sh脚本:

sh ./eosio_build.sh darwin

在安装所有依赖项然后构建之前可能需要相当长的时间。


image

如果你终于看到这个屏幕,那么恭喜你!您已成功安装所有依赖项并构建了EOSIO。最好验证您的安装,但我们会在一段时间内完成。在此之前,让我们检查一下安装产生了什么。

构建EOSIO后,它创建了大量文件和文件夹。我们来看看其中一些。

programs文件夹 - /eos/programs

该程序的文件夹包含一些来自EOSIO的非常有用的程序

  • nodeos - 服务器端区块链节点组件。可以配置插件来运行节点的核心EOSIO守护程序。如用于区块生产,专用API端点和本地开发。
  • cleos - 与区块链交互的命令行界面
  • keosd - 一个EOSIO钱包守护程序,用于加载与钱包相关的插件,例如HTTP接口和RPC API
  • eosio-launcher - 用于协助部署多节点区块链网络的应用程序

build文件夹 - /eos/build

build文件夹是所有编译的内容所在的位置。您可以在eos/build/programs中的子文件夹中找到eos/programs文件夹的可执行文件。

build文件夹是我们要进行编译验证的地方。这是一组可以针对您的编译运行的测试,以执行一些基本验证。要在编译之后运行测试套件,我们需要启动mongo守护程序,然后运行 **make test **命令。

/usr/local/bin/mongod -f /usr/local/etc/mongod.conf &
cd build
make test

注意:要运行该命令,您必须位于build文件夹中

如果一切顺利,所有测试都应该通过。如果你看到超过24个测试,不要感到惊讶。EOSIO 不断为每个版本添加新测试🙂


image

现在是时候安装可执行文件了。为了便于合约的开发,可以使用make install命令将内容安装在/urs/local文件夹中。这一步骤在build文件夹运行。安装需要足够的权限。

cd build 
sudo make install

2.创建和启动单节点Testnet

最后是时候推出我们的第一个testnet节点了。

使用最新版本的EOSIO,您可以使用以下命令启动自己的单节点区块链:

nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --contracts-console

如果您收到错误“nodeos”:command not found,则应将新的二进制文件路径添加到PATH环境变量中。在GitHub上查看有关该问题的更多信息

它将开始生成块。真棒!


image

如果终端窗口已关闭,并且您想再次启动节点,请运行上面的命令。它将开始从你最新的块生产块。

此外,当您第一次运行上述命令,会在路径~/Library/Application Support/eosio/上创建了几个文件夹。在那里,您可以找到我们将在接下来的两行中讨论的一些文件。

image

但首先,您可能想知道命令中所有这些参数是什么,所以让我们来看看

1.主命令

nodeos

2.配置eosio::producer_plugin的选项

-e -即使链是陈旧的 ,也启用块生产

-p <producer_name> -此节点控制的生产者的ID

3.应用程序配置选项

--plugin arg -要启用的插件,可以多次指定

使用EOSIO Dawn 4.2,您可以使用eosio::chain_plugin的几个命令行选项:

# 恢复可逆块数据库,如果该数据库处于错误状态
--fix-reversible-blocks

# 不要跳过重放不可逆块时可以跳过的任何检查
--force-all-checks

# 重置链的状态和数据库并重播所有块
--replay-blockchain

# 重置链的状态和数据库,从该块的日志恢复尽可能多的块作为可能的,然后重放这些块
--hard-replay-blockchain

# 重置链的状态和数据库以及区块日志
--delete-all-blocks 

3.验证环境

你准备好做一些有趣的事吗?

EOSIO附带了示例合同,可以上传并运行以进行测试。我们将使用eosio.token合同验证我们的单节点设置。假设nodeos如上所述运行。

创建一个钱包

每份合同都需要一个关联的帐户,所以首先,您需要创建一个钱包。要创建钱包,您需要将wallet_api_plugin加载到nodeos进程中。这可以通过以下两种方式之一完成:

  • config.ini的插件一条。~/Library/Application Support/eosio/nodeos/config文件夹中的configini文件(即 plugin = eosio::wallet_api_plugin
  • 调用nodeos时通过插件命令行选项(即 --plugin eosio::wallet_api_plugin

使用cleoswallet create子命令创建钱包。

cd ~/eos/build/programs/cleos/ 

# 你需要保存输出的密码,用于上锁和解锁钱包
# 如果你不想使用default钱包,可以在命令的最后增加 -n {钱包名称}
cleos wallet create  --to-console # or --file

导入eosio帐户的私钥

注意:您应该仅将其用于测试目的

密钥可以在config.ini文件中找到,该文件位于〜/ Library/Application Support/eosio/nodeos/config中。

# faucet-private-key = [public key, WIF private key] for signing for faucet creator account (eosio::faucet_testnet_plugin) 
[EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV,5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3]

获得密钥后,您需要将其导入钱包:

cleos wallet import --private-key={eosio_account_private_key}

为“eosio.token”合同创建一个帐户

名为“token”的帐户将用于“eosio.token”合同。生成两个公钥/私钥对,稍后将其分配为public-OwnerKeypublic-ActiveKey

cleos create key # OwnerKey 
cleos create key # ActiveKey

这将输出以下形式的两对公钥和私钥:

私钥:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

公钥:EOSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

将两个私钥导入钱包。

cleos wallet import --private-key={private-OwnerKey} 
cleos wallet import --private-key={private-ActiveKey}

注意:如果您未指定钱包的名称,则将使用“默认”钱包。另外,不要忘记保存生成的密钥。

使用cleos create account 命令创建token帐户。创建将由eosio帐户授权。上面生成的两个公钥将与帐户关联,一个作为其OwnerKey,另一个作为其ActiveKey。您应该使用事务ID获取JSON响应,确认它已成功执行。

cleos create account eosio token {public-OwnerKey} {public-ActiveKey}

executed transaction: e0d7f17de1e7f1a7b73dfda511ce7714d25fceec6b43d86ddf997fb38852e0c2  200 bytes  2774 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"token","owner":{"threshold":1,"keys":[{"key":"EOS6EhzztSvBp1K76GqF6A893bL...

如果您看到“ warning: transaction executed locally, but may not be confirmed by the network yet ”,请不要担心。本地执行的事务警告是正常的,它适用于所有事务。成功提交交易并不能保证交易将被执行。如果块生成器当时负载很重,则可能会丢弃该事务。

使用以下命令验证是否已成功创建帐户:

cleos get account token --json

如果一切顺利,您将收到类似于以下内容的输出:

{
  "account_name": "token",
  "head_block_num": 70942,
  "head_block_time": "2018-07-29T16:53:48.000",
  "privileged": false,
  "last_code_update": "1970-01-01T00:00:00.000",
  "created": "2018-07-29T16:49:47.500",
  "ram_quota": -1,
  "net_weight": -1,
  "cpu_weight": -1,
  "net_limit": {
    "used": -1,
    "available": -1,
    "max": -1
  },
  "cpu_limit": {
    "used": -1,
    "available": -1,
    "max": -1
  },
  "ram_usage": 2724,
  "permissions": [{
      "perm_name": "active",
      "parent": "owner",
      "required_auth": {
        "threshold": 1,
        "keys": [{
            "key": "EOS5h87m6u3DppJ4eMsSP6X9As9DAtXDzxsWzRN8RsUBCjk4axnjw",
            "weight": 1
          }
        ],
        "accounts": [],
        "waits": []
      }
    },{
      "perm_name": "owner",
      "parent": "",
      "required_auth": {
        "threshold": 1,
        "keys": [{
            "key": "EOS6s2JuFtzQAnPSNu9R9w3k53d7kEDVEjTmceTsZwy4Wn235Yf5W",
            "weight": 1
          }
        ],
        "accounts": [],
        "waits": []
      }
    }
  ],
  "total_resources": null,
  "self_delegated_bandwidth": null,
  "refund_request": null,
  "voter_info": null
}

将“eosio.token”合约上传到区块链

使用token帐户上传合同。响应应该是带有一些JSON的transaction_id。这表示您的合同已成功上传:

# cleos set contract token {path_to_contract_folder} {path_to_wast_file} {path_to_abi_file}
cleos set contract token ./contracts/eosio.token/ ./contracts/eosio.token/eosio.token.wast ./contracts/eosio.token/eosio.token.abi

Reading WAST/WASM from ./contracts/eosio.token/eosio.token.wast...
Assembling WASM...
Publishing contract...
executed transaction: 82f252b7b1e71197626cf912a975562c08cd452e47b6582399b47baca22d83b5  8096 bytes  8986 us
#         eosio <= eosio::setcode               {"account":"token","vmtype":0,"vmversion":0,"code":"0061736d01000000017e1560037f7e7f0060057f7e7e7f7f...
#         eosio <= eosio::setabi                {"account":"token","abi":"0e656f73696f3a3a6162692f312e30010c6163636f756e745f6e616d65046e616d65050874...

译者注:####

如果使用上面命令上传智能合约提示Error 3160009: No wasm file found或者Error 3160010: No abi file found,请尝试:

cleos set contract token ./contracts/eosio.token --abi eosio.token.abi -p token@active

如果提示Error 3120003: Locked wallet,请解锁您的钱包。

cleos wallet unlock

注结束####:

您还可以使用以下命令验证代码是否已设置:

cleos get code token
code hash: 48a05166e9a5493b422288d137a08a7b2ccf7fb2c3473b630909440d7bbf177a

在使用eosio.token合同之前,您必须先创建然后发布令牌。

# Create
cleos push action token create '{"issuer":"token","maximum_supply":"1000000.0000 TKN","can_freeze":"0","can_recall":"0","can_whitelist":"0"}' -p token

executed transaction: 9c2ef8724134d693f60c7c68e38a25d37450944b78a7df09f9cc3cb360a9f078  120 bytes  1861 us
#         token <= token::create                {"issuer":"token","maximum_supply":"1000000.0000 TKN"}

# Issue
cleos push action token issue '{"to":"token","quantity":"1000.0000 TKN","memo":""}' -p token

executed transaction: c37952237ed5521575edb19d201841f2ac256ebe84c0957f0266963b96cc64cc  120 bytes  490 us
#         token <= token::issue                 {"to":"token","quantity":"1000.0000 TKN","memo":""}

接下来,验证初始余额:

cleos get table token token accounts

{
  "rows": [{
      "balance": "1000.0000 TKN"
    }
  ],
  "more": false
}

使用“eosio.token”合同转移资金

以下命令显示发送到eosio.token合同的“转移”操作,将“20.0000 TKN”从“令牌”帐户转移到“eosio”帐户。成功提交的事务将生成类似于以下内容的事务ID和JSON输出。

cleos push action token transfer '{"from":"token","to":"eosio","quantity":"20.0000 TKN","memo":"my first transfer"}' -p token

executed transaction: be3929724d07d796df9913d944e1ebd20ca527ec273415ecbc94cb6fc08230e1  144 bytes  6097 us
#         token <= token::transfer              {"from":"token","to":"eosio","quantity":"20.0000 TKN","memo":"my first transfer"}
#         eosio <= token::transfer              {"from":"token","to":"eosio","quantity":"20.0000 TKN","memo":"my first transfer"}

检查余额

检查上一个事务中涉及的两个帐户的状态,如下所示:

cleos get table token eosio accounts
{
  "rows": [{
      "balance": "20.0000 TKN"
    }
  ],
  "more": false
}

cleos get table token token accounts
{
  "rows": [{
      "balance": "980.0000 TKN"
    }
  ],
  "more": false
}

接收帐户eosio现在具有20 TKN的余额,并且发送帐户令牌现在比最初的问题少20 TKN。

让我们总结到目前为止的所有步骤。我们首先安装了EOSIO,然后设置了我们的开发环境。我们安装了合同开发所需的可执行文件,我们已经启动了第一个在区块链上生成块的testnet节点。我们学习了如何生成公钥/私钥并将其导入我们的钱包。我们使用公钥创建了一个帐户 - OwnerKey和ActiveKey,我们部署了eosio.token合同。作为结局,我们使用账户之间的eosio.token合同转账。

原文链接

推荐阅读更多精彩内容