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