Пример #1
0
def fetch_charter(charter_url):
  while True:
    try:
      charter_json = liburl_wrapper.safe_read(charter_url, timeout_time=10)
      return json.loads(charter_json)
    except:
      print "retrying..."
Пример #2
0
def fetch_charter(charter_url):
    while True:
        try:
            charter_json = liburl_wrapper.safe_read(charter_url,
                                                    timeout_time=10)
            return json.loads(charter_json)
        except:
            print "retrying..."
Пример #3
0
def fetch_charter():

  if CHARTER_URL:
     print "fetching charter: %s" % CHARTER_URL
     while True:
        try:
          charter_json = liburl_wrapper.safe_read(charter_url, timeout_time=10)
          return json.loads(charter_json)
        except:
          logging.exception('error fetching charter')
          print "retrying..."
  else:
    return CHARTER_DATA
Пример #4
0
def fetch_charter():

    if CHARTER_URL:
        print "fetching charter: %s" % CHARTER_URL
        while True:
            try:
                charter_json = liburl_wrapper.safe_read(charter_url,
                                                        timeout_time=10)
                return json.loads(charter_json)
            except:
                logging.exception('error fetching charter')
                print "retrying..."
    else:
        return CHARTER_DATA
Пример #5
0
  def handle_task(self, task):
    message = json.loads(task['json_data'])

    response = safe_read("https://www.bitstamp.net/api/ticker/", 10)
    if not response:
      if not 'retries_number' in message:
        message['retries_number'] = 0

      if message['retries_number'] > 10:
        return

      message['retries_number'] += 1
      self.oracle.task_queue.save({
          "operation": 'pricecheck_create',
          "json_data": json.dumps(message),
          "done": 0,
          "next_check": int(task['locktime']) + 600
      })

    response_dict = json.loads(response)

    price = Decimal(response_dict['last'])
    expected_price = Decimal(message['price'])

    if price > expected_price:
      return_address = message['return_if_greater']
    else:
      return_address = message['return_if_lesser']

    message['return_address'] = return_address

    future_transaction = self.try_prepare_raw_transaction(message)
    assert(future_transaction is not None) # should've been verified gracefully in handle_request

    logging.debug('transaction ready to be signed')

    self.oracle.signer.sign(future_transaction, message['pwtxid'], message['prevtxs'], message['req_sigs'])
Пример #6
0
def pricecheck_create(args):
  if len(args)<5:
    print "USAGE: `%s pricecheck_create <pubkey_once> <locktime_minutes> <return_address_if_greater> <return_address_if_smaller> <value>`" % START_COMMAND
    print "- run `%s main` to obtain pubkey_once" % START_COMMAND
    print "- keep in mind that this is alpha, don't expect oracles to run properly for any extended periods of time"
    return

  btc = BitcoinClient()

  request = {}
  client_pubkey = args[0]
  request['locktime'] = time.time() + int(args[1])*60
  request['return_if_greater'] = args[2]
  request['return_if_lesser'] = args[3]
  request['price'] = float(args[4])

  print "fetching charter url" # hopefully it didn't check between running main1 and main2
  charter = fetch_charter(CHARTER_URL)

  oracle_pubkeys = []
  oracle_fees = {}
  oracle_bms = []

  for o in charter['nodes']:
    oracle_pubkeys.append(o['pubkey'])
    oracle_fees[o['address']] = o['fee']
    oracle_bms.append(o['bm'])

  oracle_fees[charter['org_address']] = charter['org_fee']

  min_sigs = int(ceil(float(len(oracle_pubkeys))/2))

  key_list = [client_pubkey] + oracle_pubkeys

  response = btc.create_multisig_address(min_sigs, key_list)
  msig_addr = response['address'] # we're using this as an identificator
  redeemScript = response['redeemScript']

  request['message_id'] = "%s-%s" % (msig_addr, str(randrange(1000000000,9000000000)))
  request['pubkey_list'] = key_list

  request['miners_fee_satoshi'] = MINERS_FEE

  print "fetching transactions incoming to %s ..." % msig_addr

  # for production purposes you might want to fetch the data using bitcoind, but that's expensive
  address_json = liburl_wrapper.safe_read("https://blockchain.info/address/%s?format=json" % msig_addr, timeout_time=10)
  try:
    address_history = json.loads(address_json)
  except:
    print "blockchain.info problem"
    print address_json
    return

  prevtxs = []
  sum_satoshi = 0

  for tx in address_history['txs']:
    outputs = []
    if 'out' in tx:
      outputs = outputs + tx['out']
    if 'outputs' in tx:
      outputs = outputs + tx['outputs']

    for vout in tx['out']:
      print vout
      if vout['addr'] == msig_addr:
        prevtx = {
          'scriptPubKey' : vout['script'],
          'vout': vout['n'],
          'txid': tx['hash'],
          'redeemScript': redeemScript,
        }
        sum_satoshi += vout['value']
        prevtxs.append(prevtx)

  if len(prevtxs) == 0:
    print "ERROR: couldn't find transactions sending money to %s" % msig_addr
    return

  request['prevtxs'] = prevtxs
  request['outputs'] = oracle_fees

  request["req_sigs"] = min_sigs
  request['operation'] = 'pricecheck_create'
  request['sum_satoshi'] = sum_satoshi

  bm = BitmessageClient()
  print "sending: %r" % json.dumps(request)
  print bm.chan_address

  request_content = json.dumps(request)

  print bm.send_message(bm.chan_address, request['operation'], request_content)
Пример #7
0
def main2(args):
  if len(args)<3:
    print "USAGE: `%s main2 <pubkey_once> <locktime_minutes> <return_address>`" % START_COMMAND
    print "- run `%s main` to obtain pubkey_once" % START_COMMAND
    print "- keep in mind that this is alpha, don't expect oracles to run properly for any extended periods of time"
    return

  btc = BitcoinClient()

  request = {}
  client_pubkey = args[0]
  request['locktime'] = time.time() + int(args[1])*60
  request['return_address'] = args[2]

  print "fetching charter url" # hopefully it didn't check between running main1 and main2
  charter = fetch_charter(CHARTER_URL)

  oracle_pubkeys = []
  oracle_fees = {}
  oracle_bms = []

  for o in charter['nodes']:
    oracle_pubkeys.append(o['pubkey'])
    oracle_fees[o['address']] = o['fee']
    oracle_bms.append(o['bm'])

  oracle_fees[charter['org_address']] = charter['org_fee']

  min_sigs = int(ceil(float(len(oracle_pubkeys))/2))

  key_list = [client_pubkey] + oracle_pubkeys

  response = btc.create_multisig_address(min_sigs, key_list)
  msig_addr = response['address'] # we're using this as an identificator
  redeemScript = response['redeemScript']

  request['message_id'] = "%s-%s" % (msig_addr, str(randrange(1000000000,9000000000)))
  request['pubkey_list'] = key_list

  request['miners_fee_satoshi'] = MINERS_FEE

  print "fetching transactions incoming to %s ..." % msig_addr

  # for production purposes you might want to fetch the data using bitcoind, but that's expensive
  address_json = liburl_wrapper.safe_read("https://blockchain.info/address/%s?format=json" % msig_addr, timeout_time=10)
  try:
    address_history = json.loads(address_json)
  except:
    print "blockchain.info problem"
    print address_json
    return

  prevtxs = []
  sum_satoshi = 0

  for tx in address_history['txs']:
    outputs = []
    if 'out' in tx:
      outputs = outputs + tx['out']
    if 'outputs' in tx:
      outputs = outputs + tx['outputs']

    for vout in tx['out']:
      print vout
      if vout['addr'] == msig_addr:
        prevtx = {
          'scriptPubKey' : vout['script'],
          'vout': vout['n'],
          'txid': tx['hash'],
          'redeemScript': redeemScript,
        }
        sum_satoshi += vout['value']
        prevtxs.append(prevtx)

  if len(prevtxs) == 0:
    print "ERROR: couldn't find transactions sending money to %s" % msig_addr
    return

  request['prevtxs'] = prevtxs
  request['outputs'] = oracle_fees

  request["req_sigs"] = min_sigs
  request['operation'] = 'timelock_create'
  request['sum_satoshi'] = sum_satoshi

  bm = BitmessageClient()
  print "sending: %r" % json.dumps(request)
  print bm.chan_address

  request_content = json.dumps(request)

  print bm.send_message(bm.chan_address, request['operation'], request_content)

  print ""
  print "Gathering oracle responses. It may take BitMessage 30-60 seconds to deliver a message one way."
  print "Although we've seen delays up to half an hour, especially if BitMessage client was just launched."
  print ""


  oracles_confirmed = 0
  while oracle_bms:
    messages = bm.get_unread_messages()
    print "oracles confirmed: {}".format(oracles_confirmed)
    for msg in messages:
      if msg.from_address in oracle_bms:
        try:
          content = json.loads(msg.message)
        except:
          print msg.message
          print 'failed decoding message'
          continue

        if 'in_reply_to' not in content:
          continue

        if content['in_reply_to'] == request['message_id']:
            print "[%r][%r] %r" % (msg.subject, msg.from_address, msg.message)
            print ""
            oracle_bms.remove(msg.from_address)

    if oracle_bms: #if still awaiting replies from some oracles
      time.sleep(10)
Пример #8
0
def main2(args):
    if len(args) < 3:
        print "USAGE: `%s main2 <pubkey_once> <locktime_minutes> <return_address>`" % START_COMMAND
        print "- run `%s main` to obtain pubkey_once" % START_COMMAND
        print "- keep in mind that this is alpha, don't expect oracles to run properly for any extended periods of time"
        return

    btc = BitcoinClient()

    request = {}
    client_pubkey = args[0]
    request['locktime'] = time.time() + int(args[1]) * 60
    request['return_address'] = args[2]

    print "fetching charter url"  # hopefully it didn't check between running main1 and main2
    charter = fetch_charter(CHARTER_URL)

    oracle_pubkeys = []
    oracle_fees = {}
    oracle_bms = []

    for o in charter['nodes']:
        oracle_pubkeys.append(o['pubkey'])
        oracle_fees[o['address']] = o['fee']
        oracle_bms.append(o['bm'])

    oracle_fees[charter['org_address']] = charter['org_fee']

    min_sigs = int(ceil(float(len(oracle_pubkeys)) / 2))

    key_list = [client_pubkey] + oracle_pubkeys

    response = btc.create_multisig_address(min_sigs, key_list)
    msig_addr = response['address']  # we're using this as an identificator
    redeemScript = response['redeemScript']

    request['message_id'] = "%s-%s" % (msig_addr,
                                       str(randrange(1000000000, 9000000000)))
    request['pubkey_list'] = key_list

    request['miners_fee_satoshi'] = MINERS_FEE

    print "fetching transactions incoming to %s ..." % msig_addr

    # for production purposes you might want to fetch the data using bitcoind, but that's expensive
    address_json = liburl_wrapper.safe_read(
        "https://blockchain.info/address/%s?format=json" % msig_addr,
        timeout_time=10)
    try:
        address_history = json.loads(address_json)
    except:
        print "blockchain.info problem"
        print address_json
        return

    prevtxs = []
    sum_satoshi = 0

    for tx in address_history['txs']:
        outputs = []
        if 'out' in tx:
            outputs = outputs + tx['out']
        if 'outputs' in tx:
            outputs = outputs + tx['outputs']

        for vout in tx['out']:
            print vout
            if vout['addr'] == msig_addr:
                prevtx = {
                    'scriptPubKey': vout['script'],
                    'vout': vout['n'],
                    'txid': tx['hash'],
                    'redeemScript': redeemScript,
                }
                sum_satoshi += vout['value']
                prevtxs.append(prevtx)

    if len(prevtxs) == 0:
        print "ERROR: couldn't find transactions sending money to %s" % msig_addr
        return

    request['prevtxs'] = prevtxs
    request['outputs'] = oracle_fees

    request["req_sigs"] = min_sigs
    request['operation'] = 'timelock_create'
    request['sum_satoshi'] = sum_satoshi

    bm = BitmessageClient()
    print "sending: %r" % json.dumps(request)
    print bm.chan_address

    request_content = json.dumps(request)

    print bm.send_message(bm.chan_address, request['operation'],
                          request_content)

    print ""
    print "Gathering oracle responses. It may take BitMessage 30-60 seconds to deliver a message one way."
    print "Although we've seen delays up to half an hour, especially if BitMessage client was just launched."
    print ""

    oracles_confirmed = 0
    while oracle_bms:
        messages = bm.get_unread_messages()
        print "oracles confirmed: {}".format(oracles_confirmed)
        for msg in messages:
            if msg.from_address in oracle_bms:
                try:
                    content = json.loads(msg.message)
                except:
                    print msg.message
                    print 'failed decoding message'
                    continue

                if 'in_reply_to' not in content:
                    continue

                if content['in_reply_to'] == request['message_id']:
                    print "[%r][%r] %r" % (msg.subject, msg.from_address,
                                           msg.message)
                    print ""
                    oracle_bms.remove(msg.from_address)

        if oracle_bms:  #if still awaiting replies from some oracles
            time.sleep(10)