繁体   English   中英

如何将 Ruby 与像 Ganache 这样的个人/测试区块链连接起来?

[英]How to connect Ruby with a personal/test blockchain like Ganache?

我想在 Ganache 区块链上部署智能合约。 作为后端,我想使用 Ruby。我尝试了 ethereum.rb ,我可以使用以下代码读取 Ganache 上的基本帐户信息:

require 'ethereum.rb'

client = Ethereum::HttpClient.new('HTTP://127.0.0.1:7545')
blockNumber = client.eth_block_number
balance = client.get_balance("0x9040DD204B561700e2D08bDCBE5215c976F059d4")
puts blockNumber["result"].to_i(16)
puts "Balance: ", balance

后来,我发现 ethereum.rb 只支持 OpenEthereum,因此可能由于这个原因我无法使用它创建或读取智能合约。

我有哪些选项可以将 Ruby 与 Ganache 连接?

您可以使用eth宝石。

require "eth"

client = Eth::Client.create "http://127.0.0.1:7545"
# => #<Eth::Client::Http:0x000055cd9e1c7430 @gas_limit=21000, @host="127.0.0.1", @id=0, @max_fee_per_gas=0.2e11, @max_priority_fee_per_gas=0, @port=7545, @ssl=false, @uri=#<URI::HTTP http://127.0.0.1:7545>>

block_number = client.eth_block_number["result"].to_i(16)
# => 6912685

address = Eth::Address.new "0xCaA29806044A08E533963b2e573C1230A2cd9a2d"
# => #<Eth::Address:0x000055cd9d6e0738 @address="0xCaA29806044A08E533963b2e573C1230A2cd9a2d">

balance = client.eth_get_balance(address)["result"].to_i(16) / Eth::Unit::ETHER
# => 3.889366000364757678

它还具有完整的智能合约支持:

ens_registry_abi = '[{"inputs":[{"internalType":"contract ENS","name":"_old","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"NewTTL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"old","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"recordExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setRecord","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setSubnodeRecord","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"setTTL","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"ttl","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"}]'

ens_registry_address = Eth::Address.new "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"
# => #<Eth::Address:0x000055cd9e6467b8 @address="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e">

ens_registry_name = "ENSRegistryWithFallback"
# => "ENSRegistryWithFallback"

ens_registry = Eth::Contract.from_abi(name: ens_registry_name, address: ens_registry_address, abi: ens_registry_abi)
# => #<Eth::Contract::ENSRegistryWithFallback:0x000055cd9e1c4960>

ens_registry.address
# => "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"

client.call(ens_registry, "old")
# => "0x112234455c3a32fd11230c42e7bccd4a84e02010"

如果您认为有任何 API 缺失或无法正常工作,请随时提交工单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM