以太坊合约地址收集及csv文件数据导入到数据库
以太坊合约地址收集
近短时间部署以太坊智能合约部署被区块链确认的时间过长,特别是开发需要用到合约地址的应用时,系统中应保持“一直有合约地址可用”的状态,所以不能在需要用到合约地址时才部署合约生成合约地址。最好的实现方法是geth事先在区块链中批量部署好合约以便系统中保持有地址可用。
简单的做法是每次批量生成的地址 dump 到 csv 文件中,再使用 Rails 任务批量导入合约地址到数据库供系统分配给用户。
另外一种做法是:部署合约生成的合约地址保存在 redis 中,然后跑一个服务监控 geth 生成的合约地址剩余数量。因为这些地址不断地被分配给系统的用户账户从而不断地减少。当降到一个“下限”的阀值时,服务再自动部署合约批量生成合约地址,生成的合约地址继续保存在等待被分配。
第一种做法比较传统,属于远古时代手工做法的手段,后者相对先进一些。
这里讨论手工做法的中把 dump 到 csv 文件的合约地址导入到数据库。
Rails task 导数据
这里需要引入一个 Ruby gem smarter_csv
smarter_csv is a Ruby Gem for smarter importing of CSV Files as Array(s) of Hashes, suitable for direct processing with Mongoid or ActiveRecord, and parallel processing with Resque or Sidekiq.
一个使用例子:
$ cat pets.csv
first name,last name,dogs,cats,birds,fish
Dan,McAllister,2,,,
Lucy,Laweless,,5,,
Miles,O'Brian,,,,21
Nancy,Homes,2,,1,
$ irb
> require 'smarter_csv'
=> true
> pets_by_owner = SmarterCSV.process('/tmp/pets.csv')
=> [ {:first_name=>"Dan", :last_name=>"McAllister", :dogs=>"2"},
{:first_name=>"Lucy", :last_name=>"Laweless", :cats=>"5"},
{:first_name=>"Miles", :last_name=>"O'Brian", :fish=>"21"},
{:first_name=>"Nancy", :last_name=>"Homes", :dogs=>"2", :birds=>"1"}
]
读取之后输出的数据结构为一个数组,csv 文件中每行数据组成一个 hash 作为数组元素。
在 Rails 项目中,把 gem 'smarter_csv'
加到 Gemfile
然后 bundle install
接着就是 rake task
require 'smarter_csv'
namespace :import_address do
desc "Import spare token address from csv file"
task :create_spare => :environment do
tokens = SmarterCSV.process("#{Rails.root}/tmp/contract_address.csv")
tokens.each do |item|
p "Import #{item[:address]}"
Spare.create! item
end
end
end
contract_address.csv 放在rails 项目的 tmp 目录下,而且需要注意的是 csv 文件中内容的格式一定要和 spares 表的字段一致,不然的话 Spare.create! item
会出错。譬如数据库表中有 token_type 和 contract_address 字段,那么文件中应该是这样的结构:
//tmp/contract_address.csv
token_type,contract_address
eth,0xc6e94741eccb04e50d42df821943eed07c74cdc4
nlc,0x3009fc293c582d7caf247f3b75781e1fb4a39tre
sdc,0x3009fc293c582d7caf247f3b75781e1fb4a39245
最后执行任务 rake import_address:create_spare