在本文中,我们将探讨如何使用Ruby编程语言与Flow进行交互。这篇文章也可以作为一个很好的例子,说明你如何利用任何还没有Flow SDK支持的编程语言与Flow进行交互,极大地扩大了你的选择范围。
使用Ruby与Flow进行交互,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]框架。
安装grpc
、grpc-tools
和json 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/access
、flow/execution
和flow/entities
文件夹中的方法定义。
交易
一个交易是一个Cadence片段,它的执行是为了更新区块链的计算状态。一个事务可以更新一个或多个签名账户的存储。
执行事务的代码已经在 flow/execution
文件夹中生成,但是对事务的有效载荷进行加密签名所需的代码不能从 .proto
定义中生成,必须要实现。在安全的环境中,签名将由硬件安全模块(HSM)处理,它能够安全地存储私钥。如果你对从Ruby中签署交易感兴趣,你将需要自己编写这部分。
首先,你需要安装rlp
和openssl 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立场,转载请联系原作者。