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
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