예제 #1
0
    def post(self):
        try:
            App = _eth_worker.App
            parser = reqparse.RequestParser()
            parser.add_argument('account', type=str)
            args = parser.parse_args()

            # do something this values
            _accounts = App.services.accounts.accounts
            account_index = ENUMS[args['account']]
            account_info = _accounts[account_index]

            block_head = App.services.chain.chain.head
            state = State(block_head.state_root, App.services.chain.chain.env)
            log.info(state.get_balance(account_info.address))
            balance_amount = int(
                state.get_balance(account_info.address) / 10**22)

            # TODO: account info parsing
            return {
                'status': 200,
                'pubkey': account_info.pubkey[0],
                'balance_amount': balance_amount
            }

        except Exception as e:
            return {'error': str(e)}
예제 #2
0
def test_send_transaction_with_contract(test_app):
    serpent_code = '''
def main(a,b):
    return(a ^ b)
'''
    tx_to = b''
    evm_code = serpent.compile(serpent_code)
    chainservice = test_app.services.chain
    chain = test_app.services.chain.chain
    state = State(chainservice.head_candidate.state_root, chain.env)
    sender = test_app.services.accounts.unlocked_accounts[0].address
    assert state.get_balance(sender) > 0
    tx = {
        'from': address_encoder(sender),
        'to': address_encoder(tx_to),
        'data': encode_hex(evm_code)
    }
    data_decoder(test_app.client.call('eth_sendTransaction', tx))
    assert len(chainservice.head_candidate.transactions) == 1
    creates = chainservice.head_candidate.transactions[0].creates

    candidate_state_dict = State(chainservice.head_candidate.state_root,
                                 chain.env).to_dict()
    code = candidate_state_dict[encode_hex(creates)]['code']
    assert len(code) > 2
    assert code != '0x'

    test_app.mine_next_block()

    assert len(chain.head.transactions) == 1
    creates = chain.head.transactions[0].creates
    state_dict = State(chain.head.state_root, chain.env).to_dict()
    code = state_dict[encode_hex(creates)]['code']
    assert len(code) > 2
    assert code != '0x'
예제 #3
0
def test_send_transaction_with_contract(test_app):
    serpent_code = '''
def main(a,b):
    return(a ^ b)
'''
    tx_to = b''
    evm_code = serpent.compile(serpent_code)
    chain = test_app.services.chain.chain
    chainservice = test_app.services.chain
    hc_state = State(chainservice.head_candidate.state_root, chain.env)
    sender = test_app.services.accounts.unlocked_accounts[0].address
    assert hc_state.get_balance(sender) > 0

    eth = test_app.services.console.console_locals['eth']
    tx = eth.transact(to='', data=evm_code, startgas=500000, sender=sender)

    hc_state_dict = State(chainservice.head_candidate.state_root,
                          chain.env).to_dict()
    code = hc_state_dict[encode_hex(tx.creates)]['code']
    assert len(code) > 2
    assert code != '0x'

    test_app.mine_next_block()

    creates = chain.head.transactions[0].creates
    code = chain.state.to_dict()[encode_hex(creates)]['code']
    assert len(code) > 2
    assert code != '0x'
예제 #4
0
def test_genesis_config():
    "test setting genesis alloc using the config"
    alloc = {
        '1' * 40: {
            'wei': 1
        },  # wei
        '2' * 40: {
            'balance': 2
        },  # balance
        '3' * 20: {
            'balance': 3
        },  # 20 bytes
    }
    config = dict(eth=dict(genesis=dict(alloc=alloc)))
    konfig.update_config_with_defaults(config,
                                       {'eth': {
                                           'block': default_config
                                       }})

    # Load genesis config
    update_config_from_genesis_json(config, config['eth']['genesis'])

    bc = config['eth']['block']
    pprint(bc)
    env = Env(DB(), bc)

    genesis = mk_genesis_block(env)
    state = State(genesis.state_root, env)
    for address, value_dict in list(alloc.items()):
        value = list(value_dict.values())[0]
        assert state.get_balance(address) == value
예제 #5
0
def test_console_name_reg_contract(test_app, solidity_code):
    """
    exercise the console service with the NameReg contract found in The_Console wiki
    https://github.com/ethereum/pyethapp/wiki/The_Console#creating-contracts
    """

    import ethereum.tools._solidity

    solidity = ethereum.tools._solidity.get_solidity()
    if solidity is None:
        pytest.xfail("solidity not installed, not tested")
    else:
        # create the NameReg contract
        tx_to = b''
        evm_code = solidity.compile(solidity_code)
        chainservice = test_app.services.chain
        chain = test_app.services.chain.chain
        hc_state = State(chainservice.head_candidate.state_root, chain.env)
        sender = test_app.services.accounts.unlocked_accounts[0].address
        assert hc_state.get_balance(sender) > 0

        eth = test_app.services.console.console_locals['eth']
        tx = eth.transact(to='', data=evm_code, startgas=500000, sender=sender)

        hc_state_dict = State(chainservice.head_candidate.state_root,
                              chain.env).to_dict()
        code = hc_state_dict[encode_hex(tx.creates)]['code']
        assert len(code) > 2
        assert code != '0x'

        test_app.mine_next_block()

        creates = chain.head.transactions[0].creates
        state_dict = chain.state.to_dict()
        code = state_dict[encode_hex(creates)]['code']
        assert len(code) > 2
        assert code != '0x'

        # interact with the NameReg contract
        abi = solidity.mk_full_signature(solidity_code)
        namereg = eth.new_contract(abi, creates, sender=sender)

        register_tx = namereg.register('alice',
                                       startgas=90000,
                                       gasprice=50 * 10**9)

        test_app.mine_next_block()

        result = namereg.resolve(sender)
        assert result == b'alice' + ('\x00' * 27).encode()
예제 #6
0
def test_send_transaction(test_app):
    chainservice = test_app.services.chain
    chain = chainservice.chain
    hc = chainservice.head_candidate
    state = State(hc.state_root, chain.env)
    assert state.get_balance(b'\xff' * 20) == 0
    sender = test_app.services.accounts.unlocked_accounts[0].address
    assert state.get_balance(sender) > 0
    tx = {
        'from': address_encoder(sender),
        'to': address_encoder(b'\xff' * 20),
        'value': quantity_encoder(1)
    }
    tx_hash = data_decoder(test_app.client.call('eth_sendTransaction', tx))
    test_app.mine_next_block()
    assert len(chain.head.transactions) == 1
    assert tx_hash == chain.head.transactions[0].hash
    assert chain.state.get_balance(b'\xff' * 20) == 1

    # send transactions from account which can't pay gas
    tx['from'] = address_encoder(
        test_app.services.accounts.unlocked_accounts[1].address)
    tx_hash = data_decoder(test_app.client.call('eth_sendTransaction', tx))
    assert chainservice.head_candidate.transactions == []
예제 #7
0
def send_transaction(app, sender_id, receiver_id,value):
    chain = app.services.chain.chain
    chainservice = app.services.chain

    hc_state = State(chainservice.head_candidate.state_root, chain.env)
    sender = app.services.accounts.unlocked_accounts[sender_id].address
    receiver = app.services.accounts.unlocked_accounts[receiver_id].address
    print sender
    print type(sender)

    assert hc_state.get_balance(sender) > 0

    eth = app.services.console.console_locals['eth']
    tx = eth.transact(to=receiver, value=value, startgas=500000, sender=sender)

    return tx
예제 #8
0
def test_send_raw_transaction_with_contract(test_app):
    serpent_code = '''
def main(a,b):
    return(a ^ b)
'''
    tx_to = b''
    evm_code = serpent.compile(serpent_code)
    chainservice = test_app.services.chain
    chain = test_app.services.chain.chain
    state = State(chainservice.head_candidate.state_root, chain.env)
    sender = test_app.services.accounts.unlocked_accounts[0].address
    assert state.get_balance(sender) > 0
    nonce = state.get_nonce(sender)
    tx = ethereum.transactions.Transaction(nonce, default_gasprice,
                                           default_startgas, tx_to, 0,
                                           evm_code, 0, 0, 0)
    test_app.services.accounts.sign_tx(sender, tx)
    raw_transaction = data_encoder(
        rlp.codec.encode(tx, ethereum.transactions.Transaction))
    data_decoder(
        test_app.client.call('eth_sendRawTransaction', raw_transaction))
    assert len(chainservice.head_candidate.transactions) == 1
    creates = chainservice.head_candidate.transactions[0].creates

    candidate_state_dict = State(chainservice.head_candidate.state_root,
                                 chain.env).to_dict()
    code = candidate_state_dict[encode_hex(creates)]['code']
    assert len(code) > 2
    assert code != '0x'

    test_app.mine_next_block()

    assert len(chain.head.transactions) == 1
    creates = chain.head.transactions[0].creates
    state_dict = State(chain.head.state_root, chain.env).to_dict()
    code = state_dict[encode_hex(creates)]['code']
    assert len(code) > 2
    assert code != '0x'
예제 #9
0
def test_send_transaction_with_contract(test_app, serpent_code, sender_id,
                                        receiver_id):
    evm_code = serpent.compile(serpent_code)
    chain = test_app.services.chain.chain
    chainservice = test_app.services.chain
    hc_state = State(chainservice.head_candidate.state_root, chain.env)
    sender = test_app.services.accounts.unlocked_accounts[sender_id].address
    receiver = test_app.services.accounts.unlocked_accounts[
        receiver_id].address
    print sender
    print type(sender)

    assert hc_state.get_balance(sender) > 0

    eth = test_app.services.console.console_locals['eth']
    tx = eth.transact(to=receiver,
                      value=1,
                      data=evm_code,
                      startgas=500000,
                      sender=sender)

    test_app.mine_next_block()
    return tx
예제 #10
0
    block_head = test.services.chain.chain.head
    log.info(block_head.header)
    value = test.config['node']['id'].encode('hex')
    # read_blocks = read_blocks_thread(test)
    # time.sleep(2)

    # test_receive_newblock(test)

    #     # Make contract code
    serpent_code = '''
def main(a,b):
    return(a ^ b)
    '''
    state = State(block_head.state_root, test.services.chain.chain.env)
    log.info('Andy accounts\' coin amount: ' +
             str(state.get_balance(accounts_list[Andy].address)))
    # Make transaction with contract, sender of transaction is 'Andy', receiver is 'Choi'
    tx = test_send_transaction_with_contract(test,
                                             serpent_code,
                                             sender_id=Andy,
                                             receiver_id=Choi)
    log.info(tx.__dict__)
    log.info(tx.sender.encode('hex'))

    # Check latest block, Not mining yet
    block_head = test.services.chain.chain.head
    state = State(block_head.state_root, test.services.chain.chain.env)
    log.info('Andy accounts\' coin amount: ' +
             str(state.get_balance(accounts_list[Andy].address)))
    # proto.send_packet(test.services.chain.chain.head)
예제 #11
0
def test_console_name_reg_contract(test_app):

    solidity_code = """
    contract NameReg  {
       event AddressRegistered(bytes32 indexed name, address indexed account);
       mapping (address => bytes32) toName;

       function register(bytes32 name) {
               toName[msg.sender] = name;
               AddressRegistered(name, msg.sender);
       }

       function resolve(address addr) constant returns (bytes32 name) {
               return toName[addr];
       }
    }
    """

    import ethereum.tools._solidity
    solidity = ethereum.tools._solidity.get_solidity()
    if solidity is None:
        pytest.xfail("solidity not installed, not tested")
    else:
        # create the NameReg contract
        tx_to = b''
        evm_code = solidity.compile(solidity_code)
        chainservice = test_app.services.chain
        chain = test_app.services.chain.chain
        hc_state = State(chainservice.head_candidate.state_root, chain.env)
        sender = test_app.services.accounts.unlocked_accounts[0].address
        assert hc_state.get_balance(sender) > 0

        eth = test_app.services.console.console_locals['eth']
        tx = eth.transact(to='', data=evm_code, startgas=500000, sender=sender)

        hc_state_dict = State(chainservice.head_candidate.state_root,
                              chain.env).to_dict()
        code = hc_state_dict[encode_hex(tx.creates)]['code']
        assert len(code) > 2
        assert code != '0x'

        test_app.mine_next_block()

        creates = chain.head.transactions[0].creates
        state_dict = chain.state.to_dict()
        code = state_dict[encode_hex(creates)]['code']
        assert len(code) > 2
        assert code != '0x'

        # interact with the NameReg contract
        abi = solidity.mk_full_signature(solidity_code)
        namereg = eth.new_contract(abi, creates, sender=sender)

        register_tx = namereg.register('alice',
                                       startgas=90000,
                                       gasprice=50 * 10**9)

        test_app.mine_next_block()

        result = namereg.resolve(sender)
        assert result == b'alice' + ('\x00' * 27).encode()