使用Ruby与Flow进行交互

在本文中,我们将探讨如何使用Ruby编程语言与Flow进行交互。这篇文章也可以作为一个很好的例子,说明你如何利用任何还没有Flow SDK支持的编程语言与Flow进行交互,极大地扩大了你的选择范围。

使用Ruby与Flow进行交互

使用RubyFlow进行交互,Daniel Podaru著。在本文中,我们将探讨如何使用Ruby编程语言与Flow进行交互。这篇文章也可以作为一个很好的例子,说明你如何利用任何还没有Flow SDK支持的编程语言与Flow进行交互,极大地扩大了你的选择范围。

本文的代码可以在Github上找到,在这里[1]

终端/命令提示符

使用MacOS上的Terminal或Windows上的Command Prompt来运行命令。

Ruby

在开始之前,检查你是否安装了Ruby。在终端中,运行以下命令。

ruby -vruby
2.7.1p83

如果你没有安装Ruby,你可以从 https://www.ruby-lang.org[2]

项目文件夹

为你的项目新建一个文件夹。

cd ~
mkdir flow-ruby

gRPC和Protocol Buffers

我们将使用gRPC[3]和Protocol Buffers[4]与Flow节点进行交互。

Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML或JSON能够将结构化数据序列化,但更小、更快、更简单,可用于数据存储、通信协议等方面。gRPC是一个基于Protocol Buffers和HTTP2的RPC[5]框架。

安装grpcgrpc-toolsjson gem

gem install grpc grpc-tools json

Flow Protocol Buffer definitions

从GitHub克隆Flow仓库。

在您的终端中,运行以下命令。

cd ~
git clone https://github.com/onflow/flow

从Flow .proto文件中生成Ruby代码。

在终端中,运行以下命令。

cd flow/protobuf
grpc_tools_ruby_protoc --proto_path=. --ruby_out=ruby/ --grpc_out=ruby/ flow/**/*.proto

将新生成的flow文件夹从protobuf/ruby/复制到flow-ruby在终端,运行以下命令。

cp -r ~/flow/protobuf/ruby/ ~/flow-ruby/

列出flow-ruby文件夹的内容,以确保flow文件夹被复制.在终端中,运行以下命令。

cd ~/flow-ruby
ls flow

Ruby代码

启动你最喜欢的IDE并创建一个名为flow.rb的新文件。

flow.rb文件中添加以下代码。

require 'flow/access/access_services_pb'
require 'flow/execution/execution_services_pb'
require 'json'

class Flow
 # 1
 def initialize(node_address)
   @stub = Access::AccessAPI::Stub.new(node_address, :this_channel_is_insecure)
 end

 # 2
 def ping
   req = Access::PingRequest.new
   @stub.ping(req)
 end

 # 3
 def get_account(address)
   req = Access::GetAccountAtLatestBlockRequest.new(address: to_bytes(address))
   res = @stub.get_account_at_latest_block(req)
   res.account
 end

 # 4
 def execute_script(script, args = [])
   req = Access::ExecuteScriptAtLatestBlockRequest.new(
       script: script,
       arguments: args
   )
   res = @stub.execute_script_at_latest_block(req)
   parse_json(res.value)
 end

  private

 # 5
 def parse_json(event_payload)
   JSON.parse(event_payload, object_class: OpenStruct)
 end

 # 6
 def to_bytes(string)
   [string].pack('H*')
 end

 # 7
 def to_string(bytes)
   bytes.unpack('H*').first
 end
end

Flow类是由协议定义生成的代码的封装器。

•initialize 将在我们实例化 Flow 类时被调用。Access::AccessAPI::Stub 是我们从协议定义中自动生成的类的名称。我们创建一个新的实例,传递一个Flow Access Node的地址。该对象提供了允许调用Access节点上的方法的方法。•.ping方法允许对Flow Access节点进行ping,看看它是否还活着。我们创建一个新的ping请求。Access::PingRequest, 并在ping方法调用中传递它: @stub.ping(req).•get_account(address)方法允许获取Flow网络上的地址信息。我们使用Access::GetAccountAtLatestBlockRequest.new创建一个获取地址信息的请求,并在最新的块上使用@stub.execute_script_at_latest_block(req)执行该请求。•.execute_script方法允许执行一个Cadence脚本。同样,我们创建一个请求对象并执行该请求。•parse_json是一个实用方法,用于将脚本的响应解析为一个结构。•to_bytes是一个实用方法,它将Flow地址从字符串转换为字节。•to_string 是一个实用方法。我们还没有在其他方法中使用它,但如果你想从Flow账户中读取代码字段,它是有用的。

Flow Emulator

Flow Emulator[6]是一个轻量级的工具,它可以模拟真实Flow网络的行为。

我们将使用仿真器来测试Ruby客户端。按照以下步骤[7]安装模拟器。

启动Flow模拟器,在一个单独的终端窗口中,运行以下命令。

flow emulator start

与Flow的互动

启动Ruby REPL并调用flow.rb文件。

irb -I . -r flow.rb

在终端中,运行以下命令。在启动 REPL 的终端窗口中,运行以下命令。

f = Flow.new("127.0.0.1:3569")
f.ping
< Access::PingResponse: >

我们ping通了Flow模拟器,它响应成功。

获取现有账户的信息

要使用现有的Flow地址进行测试,请在启动Flow模拟器的终端窗口中查找,并使用服务账户的地址。

运行以下命令。

a = f.get_account('0xf8d6e0586b0a20c7')

< Entities::Account: address: "\xF8\xD6\xE0Xk
 \xC7", balance: 0, code: "", keys: []>

响应会显示地址为Flow账户的信息。0xf8d6e0586b0a20c7。

数据显示为字节,我们可以使用unpack('H*').first将其解码为十六进制字符串。

a.address
"\xF8\xD6\xE0Xk
\xC7"

a.address.unpack('H*').first
"f8d6e0586b0a20c7"

a.balance
0

a.keys.first.public_key.unpack('H*').first
"61762b3fd6d94e456701938c43432a899431673aa75905a90b50fcf0af4eddae455d13f93941af12302979adca61c

我们可以看到,该账户的余额为0,目前有一个公钥被授权访问。

执行Cadence脚本

脚本是一个只读的Cadence片段,用于查询区块链的计算状态。

运行以下命令。

script = 'pub fun main(): Int { return 1 }'
result = f.execute_script(script)

result.type
"Int"

result.value
"1"

脚本是一个简单的Cadence脚本,返回1。

脚本由execute_script函数执行,结果在result变量中可用。

访问和执行API

流程访问节点和流程执行节点提供的方法比较多。

探索flow/accessflow/executionflow/entities文件夹中的方法定义。

交易

一个交易是一个Cadence片段,它的执行是为了更新区块链的计算状态。一个事务可以更新一个或多个签名账户的存储。

执行事务的代码已经在 flow/execution 文件夹中生成,但是对事务的有效载荷进行加密签名所需的代码不能从 .proto 定义中生成,必须要实现。在安全的环境中,签名将由硬件安全模块(HSM)处理,它能够安全地存储私钥。如果你对从Ruby中签署交易感兴趣,你将需要自己编写这部分。

首先,你需要安装rlpopenssl gem。接下来,你需要看看Go SDK[8] 中的签名实现,了解签名的工作原理,然后再将代码移植到Ruby中。

结束语

如果您正在开发的编程语言尚未提供Flow SDK,您仍然可以使用该语言与Flow交互。Protocol Buffers是语言中立和平台中立的,所以你可以从任何编程语言的协议定义中生成代码。

我们在本文中写的Ruby代码可以作为Ruby的Flow SDK的开始。我们鼓励你加入Discord上的Flow社区,在那里你可以和其他开发者一起用你最喜欢的编程语言构建Flow SDK。

References

[1] 在这里: https://github.com/cybercent/flow-ruby
[2] https://www.ruby-lang.org: https://www.ruby-lang.org/zh_cn/
[3] gRPC: https://grpc.io/
[4] Protocol Buffers: https://developers.google.com/protocol-buffers
[5] RPC: https://en.wikipedia.org/wiki/Remote_procedure_call
[6] Flow Emulator: https://github.com/onflow/flow-emulator
[7] 以下步骤: https://github.com/onflow/flow/blob/master/docs/cli.md
[8] Go SDK: https://github.com/onflow/flow-go-sdk/tree/master/crypto

本文转载自公众号“FlowTimes福洛时代”(gh_6ccc48f0f87b),已获授权。

本文来自FlowTimes福洛时代,经授权后发布,本文观点不代表DAppChaser立场,转载请联系原作者。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

邮件:contact@dappchaser.com

QR code