module Ethereum::Utils

Public Instance Methods

base58_check_to_bytes(s) click to toggle source
# File lib/ethereum/utils.rb, line 60
def base58_check_to_bytes(s)
  leadingzbytes = s.match(/\A1*/)[0]
  data = Constant::BYTE_ZERO * leadingzbytes.size + BaseConvert.convert(s, 58, 256)

  raise ChecksumError, "double sha256 checksum doesn't match" unless double_sha256(data[0...-4])[0,4] == data[-4..-1]
  data[1...-4]
end
big_endian_to_int(s) click to toggle source
# File lib/ethereum/utils.rb, line 87
def big_endian_to_int(s)
  RLP::Sedes.big_endian_int.deserialize s.sub(/\A(\x00)+/, '')
end
bytearray_to_int(arr) click to toggle source
# File lib/ethereum/utils.rb, line 135
def bytearray_to_int(arr)
  o = 0
  arr.each {|x| o = (o << 8) + x }
  o
end
bytes_to_base58_check(bytes, magicbyte=0) click to toggle source
# File lib/ethereum/utils.rb, line 68
def bytes_to_base58_check(bytes, magicbyte=0)
  bs = "#{magicbyte.chr}#{bytes}"
  leadingzbytes = bs.match(/\A#{Constant::BYTE_ZERO}*/)[0]
  checksum = double_sha256(bs)[0,4]
  '1'*leadingzbytes.size + BaseConvert.convert("#{bs}#{checksum}", 256, 58)
end
bytes_to_int_array(bytes) click to toggle source
# File lib/ethereum/utils.rb, line 145
def bytes_to_int_array(bytes)
  bytes.unpack('C*')
end
ceil32(x) click to toggle source
# File lib/ethereum/utils.rb, line 75
def ceil32(x)
  x % 32 == 0 ? x : (x + 32 - x%32)
end
child_dao_list() click to toggle source
# File lib/ethereum/utils.rb, line 215
def child_dao_list
  source = '0x4a574510c7014e4ae985403536074abe582adfc8'

  main = [ 
    '0xbb9bc244d798123fde783fcc1c72d3bb8c189413', # TheDAO
    '0x807640a13483f8ac783c557fcdf27be11ea4ac7a'  # TheDAO extrabalance
  ]

  child_daos = []
  child_extra_balances = []
  (1...58).each do |i|
    child_addr = "0x#{encode_hex mk_contract_address(source, i)}"
    child_daos.push child_addr
    child_extra_balances.push "0x#{encode_hex mk_contract_address(child_addr, 0)}"
  end

  main + child_daos + child_extra_balances
end
coerce_addr_to_hex(x) click to toggle source
# File lib/ethereum/utils.rb, line 169
def coerce_addr_to_hex(x)
  if x.is_a?(Numeric)
    encode_hex zpad(int_to_big_endian(x), 20)
  elsif x.size == 40 || x.size == 0
    x
  else
    encode_hex zpad(x, 20)[-20..-1]
  end
end
coerce_to_bytes(x) click to toggle source
# File lib/ethereum/utils.rb, line 159
def coerce_to_bytes(x)
  if x.is_a?(Numeric)
    int_to_big_endian x
  elsif x.size == 40
    decode_hex(x)
  else
    x
  end
end
coerce_to_int(x) click to toggle source
# File lib/ethereum/utils.rb, line 149
def coerce_to_int(x)
  if x.is_a?(Numeric)
    x
  elsif x.size == 40
    big_endian_to_int decode_hex(x)
  else
    big_endian_to_int x
  end
end
decode_hex(s) click to toggle source
# File lib/ethereum/utils.rb, line 83
def decode_hex(s)
  RLP::Utils.decode_hex s
end
decode_int(v) click to toggle source
# File lib/ethereum/utils.rb, line 130
def decode_int(v)
  raise ArgumentError, "No leading zero bytes allowed for integers" if v.size > 0 && (v[0] == Constant::BYTE_ZERO || v[0] == 0)
  big_endian_to_int v
end
double_sha256(x) click to toggle source
# File lib/ethereum/utils.rb, line 32
def double_sha256(x)
  sha256 sha256(x)
end
encode_hex(b) click to toggle source
# File lib/ethereum/utils.rb, line 79
def encode_hex(b)
  RLP::Utils.encode_hex b
end
encode_int(n) click to toggle source
# File lib/ethereum/utils.rb, line 125
def encode_int(n)
  raise ArgumentError, "Integer invalid or out of range: #{n}" unless n.is_a?(Integer) && n >= 0 && n <= UINT_MAX
  int_to_big_endian n
end
hash160(x) click to toggle source
# File lib/ethereum/utils.rb, line 40
def hash160(x)
  ripemd160 sha256(x)
end
hash160_hex(x) click to toggle source
# File lib/ethereum/utils.rb, line 44
def hash160_hex(x)
  encode_hex hash160(x)
end
int_array_to_bytes(arr) click to toggle source
# File lib/ethereum/utils.rb, line 141
def int_array_to_bytes(arr)
  arr.pack('C*')
end
int_to_addr(x) click to toggle source
# File lib/ethereum/utils.rb, line 121
def int_to_addr(x)
  zpad_int x, 20
end
int_to_big_endian(n) click to toggle source
# File lib/ethereum/utils.rb, line 91
def int_to_big_endian(n)
  RLP::Sedes.big_endian_int.serialize n
end
keccak256(x) click to toggle source

Not the keccak in sha3, although it's underlying lib named SHA3

# File lib/ethereum/utils.rb, line 16
def keccak256(x)
  Digest::SHA3.new(256).digest(x)
end
keccak256_rlp(x) click to toggle source
# File lib/ethereum/utils.rb, line 24
def keccak256_rlp(x)
  keccak256 RLP.encode(x)
end
keccak512(x) click to toggle source
# File lib/ethereum/utils.rb, line 20
def keccak512(x)
  Digest::SHA3.new(512).digest(x)
end
lpad(x, symbol, l) click to toggle source
# File lib/ethereum/utils.rb, line 95
def lpad(x, symbol, l)
  return x if x.size >= l
  symbol * (l - x.size) + x
end
mk_contract_address(sender, nonce) click to toggle source
# File lib/ethereum/utils.rb, line 185
def mk_contract_address(sender, nonce)
  keccak256_rlp([normalize_address(sender), nonce])[12..-1]
end
mk_metropolis_contract_address(sender, initcode) click to toggle source
# File lib/ethereum/utils.rb, line 189
def mk_metropolis_contract_address(sender, initcode)
  keccak256(normalize_address(sender) + initcode)[12..-1]
end
mod_exp(x, y, n) click to toggle source
# File lib/ethereum/utils.rb, line 48
def mod_exp(x, y, n)
  x.to_bn.mod_exp(y, n).to_i
end
mod_mul(x, y, n) click to toggle source
# File lib/ethereum/utils.rb, line 52
def mod_mul(x, y, n)
  x.to_bn.mod_mul(y, n).to_i
end
normalize_address(x, allow_blank: false) click to toggle source
# File lib/ethereum/utils.rb, line 179
def normalize_address(x, allow_blank: false)
  address = Address.new(x)
  raise ValueError, "address is blank" if !allow_blank && address.blank?
  address.to_bytes
end
normalize_hex_without_prefix(s) click to toggle source
# File lib/ethereum/utils.rb, line 207
def normalize_hex_without_prefix(s)
  if s[0,2] == '0x'
    (s.size % 2 == 1 ? '0' : '') + s[2..-1]
  else
    s
  end
end
parse_int_or_hex(s) click to toggle source
# File lib/ethereum/utils.rb, line 197
def parse_int_or_hex(s)
  if s.is_a?(Numeric)
    s
  elsif s[0,2] == '0x'
    big_endian_to_int decode_hex(normalize_hex_without_prefix(s))
  else
    s.to_i
  end
end
remove_0x_head(s) click to toggle source
# File lib/ethereum/utils.rb, line 193
def remove_0x_head(s)
  s[0,2] == '0x' ? s[2..-1] : s
end
ripemd160(x) click to toggle source
# File lib/ethereum/utils.rb, line 36
def ripemd160(x)
  Digest::RMD160.digest x
end
rpad(x, symbol, l) click to toggle source
# File lib/ethereum/utils.rb, line 100
def rpad(x, symbol, l)
  return x if x.size >= l
  x + symbol * (l - x.size)
end
sha256(x) click to toggle source
# File lib/ethereum/utils.rb, line 28
def sha256(x)
  Digest::SHA256.digest x
end
to_signed(i) click to toggle source
# File lib/ethereum/utils.rb, line 56
def to_signed(i)
  i > Constant::INT_MAX ? (i-Constant::TT256) : i
end
zpad(x, l) click to toggle source
# File lib/ethereum/utils.rb, line 105
def zpad(x, l)
  lpad x, BYTE_ZERO, l
end
zpad_hex(s, l=32) click to toggle source
# File lib/ethereum/utils.rb, line 117
def zpad_hex(s, l=32)
  zpad decode_hex(s), l
end
zpad_int(n, l=32) click to toggle source
# File lib/ethereum/utils.rb, line 113
def zpad_int(n, l=32)
  zpad encode_int(n), l
end
zunpad(x) click to toggle source
# File lib/ethereum/utils.rb, line 109
def zunpad(x)
  x.sub /\A\x00+/, ''
end