class Platon::Key

Attributes

private_key[R]
public_key[R]

Public Class Methods

decrypt(data, password) click to toggle source
# File lib/platon/key.rb, line 14
def self.decrypt(data, password)
  priv = Decrypter.perform data, password
  new priv: priv
end
encrypt(key, password,options={}) click to toggle source
# File lib/platon/key.rb, line 8
def self.encrypt(key, password,options={})
  key = new(priv: key) unless key.is_a?(Key)

  Encrypter.perform key.private_hex, password ,options
end
encrypt_and_save(key,password,options={}) click to toggle source
# File lib/platon/key.rb, line 19
def self.encrypt_and_save(key,password,options={})
  encrypted_key_info = encrypt(key,password,options)
  ## PlatON似乎打算兼容以太地址, 暂时默认以 0x 地址命名
  keypath = options[:keypath]
  if keypath==nil || keypath=="" 
    address = key.address
    dirname = "#{ENV['HOME']}/.platon/keystore/"
    FileUtils.mkdir_p(dirname) unless Dir.exists?(dirname)
    File.write File.join(dirname, "#{key.address}.json") , encrypted_key_info
  else
    File.write keypath , encrypted_key_info
  end
  return encrypted_key_info
end
list_wallets(options={}) click to toggle source
# File lib/platon/key.rb, line 34
def self.list_wallets(options={})
  keypath = options[:keypath]
  if keypath==nil || keypath=="" 
    Dir.glob("#{ENV['HOME']}/.platon/keystore/*").select { |e| File.file? e }
  else
    Dir.glob(keypath + "/*").select { |e| File.file? e }
  end
end
new(priv: nil) click to toggle source
# File lib/platon/key.rb, line 48
def initialize(priv: nil)
  @private_key = MoneyTree::PrivateKey.new key: priv
  @public_key = MoneyTree::PublicKey.new private_key, compressed: false
end
personal_recover(message, signature) click to toggle source
# File lib/platon/key.rb, line 43
def self.personal_recover(message, signature)
  bin_signature = Utils.hex_to_bin(signature).bytes.rotate(-1).pack('c*')
  OpenSsl.recover_compact(Utils.keccak256(Utils.prefix_message(message)), bin_signature)
end

Public Instance Methods

address() click to toggle source
# File lib/platon/key.rb, line 65
def address
  Utils.public_key_to_address public_hex
end
Also aliased as: to_address
bech32_address(hrp:"lat") click to toggle source
# File lib/platon/key.rb, line 69
def bech32_address(hrp:"lat")
  Utils.to_bech32_address(hrp,address)
end
personal_sign(message) click to toggle source
# File lib/platon/key.rb, line 90
def personal_sign(message)
  Utils.bin_to_hex(sign(Utils.prefix_message(message)).bytes.rotate(1).pack('c*'))
end
private_hex() click to toggle source
# File lib/platon/key.rb, line 53
def private_hex
  private_key.to_hex
end
public_bytes() click to toggle source
# File lib/platon/key.rb, line 57
def public_bytes
  public_key.to_bytes
end
public_hex() click to toggle source
# File lib/platon/key.rb, line 61
def public_hex
  public_key.to_hex
end
sign(message) click to toggle source
# File lib/platon/key.rb, line 74
def sign(message)
  sign_hash message_hash(message)
end
sign_hash(hash) click to toggle source
# File lib/platon/key.rb, line 78
def sign_hash(hash)
  loop do
    signature = OpenSsl.sign_compact hash, private_hex, public_hex
    return signature if valid_s? signature
  end
end
to_address()
Alias for: address
verify_signature(message, signature) click to toggle source
# File lib/platon/key.rb, line 85
def verify_signature(message, signature)
  hash = message_hash(message)
  public_hex == OpenSsl.recover_compact(hash, signature)
end

Private Instance Methods

message_hash(message) click to toggle source
# File lib/platon/key.rb, line 97
def message_hash(message)
  Utils.keccak256 message
end
valid_s?(signature) click to toggle source
# File lib/platon/key.rb, line 101
def valid_s?(signature)
  s_value = Utils.v_r_s_for(signature).last
  s_value <= Secp256k1::N/2 && s_value != 0
end