Skip to content
This repository was archived by the owner on Nov 15, 2021. It is now read-only.

Conversation

@ixje
Copy link
Member

@ixje ixje commented Apr 25, 2019

Continuation of #930

This PR ripped the 3rd party event-driven framework twisted out of neo-python and replaced it with the standard library asyncio. It also introduces new network code.

neo-python doesn't have 100% test coverage and this PR touches pretty much every component, therefore I'm looking for help with general testing of this branch. This can be anything from running the RPC server, to general interactions like opening/closing/rebuilding wallets, sending assets, searching contracts. Whatever feature is in there should have no regression and function as expected. If it shows unexpected behaviour (read the note below first) then please drop a comment here, also for any errors you think shouldn't be there/printed .

Important notes

  1. requires python 3.7
  2. This branch incorporates Fix sys_fee calculation in block persist #905 and will give a warning that the database format has changed. Using np-bootstrap as suggested will not work as the bootstrap files have not yet been updated.
  3. The network code in this branch relies on a new network feature introduced in last weeks release of neo-cli -> v2.10.1. Therefore when using this in a private-net environment make sure you run it against nodes with neo-cli v2.10.1. Upgrade neo-privatenet using:
docker pull cityofzion/neo-privatenet:2.10.1

neo-local is not yet updated afaik.

To elaborate why this is important: the >= 2.9.x <= 2.10.0 series of neo-cli started tracking data sent to a peer and limit requesting the same data to only once per session. In order to keep up to date with the best height of a connected node in those series we have 2 options

  1. reconnect and extract the height information during the handshake
  2. request the last block, read the height from there and cache this block until you can finally process it. When syncing e.g. mainnet this means you can end up caching thousands of blocks in memory because you can't process them until in sync.

I found neither approach acceptable and convinced NEO to add a new network command that allows requesting the best height of a peer without disconnecting. Without going into too much detail, the new network code uses this information to avoid requesting data from a node that doesn't have the data in the first place. The impact for now is that neo-cli nodes < 2.10.1 basically cannot stay in sync. It will be a transition period that we'll have to live with.

ixje added 3 commits April 18, 2019 09:50
…ommits)

Squashed commits:
[8a1cdf0e] - resolve memory leak in VM
- resolve notification exception
[86ff17cf] - fix gas limit check
- some application engine updates according to NeoVM 2.4.1
[8627a8a5] - prevent printing if a node is already removed
- fix access + exception
- gracefully handle port in use exception
- change startup sequence of syncmgr/nodemgr/prompt
- handle prompt_toolkit cleanup failure on exit
- fix edge case in replace_node using wrong loop during disconnect
- add temporary block health check
- make sure replace_node tags addresses as bad
rebase
[fa0cfb9] process feedback
[7469e3b] enable request logging
[98f0a3d] process feedback
[b29bbad] missed file :|
[afa7af6] resolve rebase test regression
[97ed78d] try travis 3.7 fix
[3657513] update travis for python 3.7
[90b42a3] update requirements, set node to use 2.10.1 code, fix typo
[cb43f69] - make sure new wallet gets synced when created
- cleanup logger stuff
- ensure we can't persist blocks that are out of order
- remove tcp session hack
[6028e52] cleanup and fix issues after rebase
[57930ef] New network code + move from twisted to asyncio

- add hack to work around max 1 request per hash session limit causing out of sync
- more logic to shutdown cleanly (+9 squashed commits)
Squashed commits:
[59c5916] - move mempool out of nodemanager
- add relay cache + logic
- add getdata support in node for relay cache items only
[1d081e9] add helper logic to avoid trying to persist blocks multiple times and keeping wallet height in check
[c20cd6e] fix node.relay() , remove property for size in message
[383ad47] - Add new ping payload support
- resolve send_addr issue
- cleanup unused functions, add missing typing
[8bed164] clean up prints to use logger, remove obsolete code
[9791737] Update db schema, ensure setting up an asyncio loop before initialising a DB, don't manually stop loop after run complete
[1499f91] - update requirements
- fix /examples/
- fix `set maxpeers` not adding new CLI clients
- fix exceeding max nodes connection count
- add IPfiltering (blacklist/whitelist)
- fix show nodes extra flags not working with 0 connected nodes
- add code for more graceful shutdown preventing stack traces and db corruption
- update trouble shooting section after OSX update when `scrypt` module fails.
[2743930] cleanup
[ee2f4c6] New network code + move from twisted to asyncio

cleanup

- update requirements
- fix /examples/
- fix `set maxpeers` not adding new CLI clients
- fix exceeding max nodes connection count
- add IPfiltering (blacklist/whitelist)
- fix show nodes extra flags not working with 0 connected nodes
- add code for more graceful shutdown preventing stack traces and db corruption
- update trouble shooting section after OSX update when `scrypt` module fails.

Update db schema, ensure setting up an asyncio loop before initialising a DB, don't manually stop loop after run complete

clean up prints to use logger, remove obsolete code

- Add new ping payload support
- resolve send_addr issue
- cleanup unused functions, add missing typing

fix node.relay() , remove property for size in message

add helper logic to avoid trying to persist blocks multiple times and keeping wallet height in check

- move mempool out of nodemanager
- add relay cache + logic
- add getdata support in node for relay cache items only

- add hack to work around max 1 request per hash session limit causing out of sync
- more logic to shutdown cleanly
@ixje
Copy link
Member Author

ixje commented Apr 25, 2019

TODO's

@coveralls
Copy link

coveralls commented Apr 25, 2019

Coverage Status

Coverage decreased (-1.8%) to 85.051% when pulling dec88b1 on ixje:asyncio_alpha2 into 83dc3eb on CityOfZion:development.

jseagrave21 and others added 7 commits April 25, 2019 17:18
- currently "Block-cache length" only displays zero
- this fix displays the actual value
- adds parameter descriptions for new params
- adds testing for new params

- separately, fixes a test to avoid a RuntimeWarning
- instead of doing nothing, KeyboardInterrupt now mutes stdout while the user inputs a command
- this is especially useful while `config output` includes any DEBUG setting
improve user input for prompt with DEBUG output [2]

async def start(self):
host = 'localhost'
port = 8888 # settings.NODE_PORT
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is settings.NODE_PORT replaced here?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a local test thing that slipped in. The default port conflicts with my privnet

Copy link
Contributor

@jseagrave21 jseagrave21 May 23, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • reminder to revert to settings.NODE_PORT prior to merging

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed in #948

- adds `config minpeers` and tests
- prompt now mirrors api_server logic for minpeers & maxpeers
@jseagrave21
Copy link
Contributor

@ixje I am not sure what changed but I got the same error from #930 trying to access np-api-server -h

(venv) root@DESKTOP-F7E94IM:/mnt/c/users/jseag/neo/ixje# np-api-server -h
usage: np-api-server [-h]
                     (--mainnet | --testnet | --privnet | --coznet | --config CONFIG)
                     [--port-rpc PORT_RPC] [--port-rest PORT_REST]
                     [--logfile LOGFILE] [--syslog] [--syslog-local [0-7]]
                     [--disable-stderr] [--datadir DATADIR]
                     [--minpeers MINPEERS] [--maxpeers MAXPEERS]
                     [--wallet WALLET] [--host HOST]

optional arguments:
  -h, --help            show this help message and exit
  --datadir DATADIR     Absolute path to use for database directories
  --minpeers MINPEERS   Min peers to use for P2P Joining
  --maxpeers MAXPEERS   Max peers to use for P2P Joining
  --wallet WALLET       Open wallet. Will allow you to use methods that
                        require an open wallet
  --host HOST           Hostname ( for example 127.0.0.1)

Network options:
  --mainnet             Use MainNet
  --testnet             Use TestNet
  --privnet             Use PrivNet
  --coznet              Use CozNet
  --config CONFIG       Use a specific config file

Mode(s):
  --port-rpc PORT_RPC   port to use for the json-rpc api (eg. 10332)
  --port-rest PORT_REST
                        port to use for the rest api (eg. 80)

Logging options:
  --logfile LOGFILE     Logfile
  --syslog              Log to syslog instead of to log file ('user' is the
                        default facility)
  --syslog-local [0-7]  Log to a local syslog facility instead of 'user'.
                        Value must be between 0 and 7 (e.g. 0 for 'local0').
  --disable-stderr      Disable stderr logger
[I 190505 20:30:07 api_server:314] Shutting down...
Traceback (most recent call last):
  File "/mnt/c/users/jseag/neo/ixje/neo/bin/api_server.py", line 312, in main
    loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 521, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1738, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/mnt/c/users/jseag/neo/ixje/neo/bin/api_server.py", line 124, in setup_and_start
    args = parser.parse_args()
  File "/usr/lib/python3.7/argparse.py", line 1754, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "/usr/lib/python3.7/argparse.py", line 1786, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "/usr/lib/python3.7/argparse.py", line 1992, in _parse_known_args
    start_index = consume_optional(start_index)
  File "/usr/lib/python3.7/argparse.py", line 1932, in consume_optional
    take_action(action, args, option_string)
  File "/usr/lib/python3.7/argparse.py", line 1860, in take_action
    action(self, namespace, argument_values, option_string)
  File "/usr/lib/python3.7/argparse.py", line 1043, in __call__
    parser.exit()
  File "/usr/lib/python3.7/argparse.py", line 2493, in exit
    _sys.exit(status)
SystemExit: 0

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/mnt/c/users/jseag/neo/ixje/venv/bin/np-api-server", line 11, in <module>
    load_entry_point('neo-python', 'console_scripts', 'np-api-server')()
  File "/mnt/c/users/jseag/neo/ixje/neo/bin/api_server.py", line 316, in main
    loop.run_until_complete(p2p.shutdown())
  File "/usr/lib/python3.7/asyncio/base_events.py", line 566, in run_until_complete
    return future.result()
  File "/mnt/c/users/jseag/neo/ixje/neo/Network/p2pservice.py", line 35, in shutdown
    if self.nodemgr_task.done():
AttributeError: 'NoneType' object has no attribute 'done'
Task exception was never retrieved
future: <Task finished coro=<setup_and_start() done, defined at /mnt/c/users/jseag/neo/ixje/neo/bin/api_server.py:80> exception=SystemExit(0)>
Traceback (most recent call last):
  File "/mnt/c/users/jseag/neo/ixje/neo/bin/api_server.py", line 312, in main
    loop.run_forever()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 521, in run_forever
    self._run_once()
  File "/usr/lib/python3.7/asyncio/base_events.py", line 1738, in _run_once
    handle._run()
  File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "/mnt/c/users/jseag/neo/ixje/neo/bin/api_server.py", line 124, in setup_and_start
    args = parser.parse_args()
  File "/usr/lib/python3.7/argparse.py", line 1754, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "/usr/lib/python3.7/argparse.py", line 1786, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "/usr/lib/python3.7/argparse.py", line 1992, in _parse_known_args
    start_index = consume_optional(start_index)
  File "/usr/lib/python3.7/argparse.py", line 1932, in consume_optional
    take_action(action, args, option_string)
  File "/usr/lib/python3.7/argparse.py", line 1860, in take_action
    action(self, namespace, argument_values, option_string)
  File "/usr/lib/python3.7/argparse.py", line 1043, in __call__
    parser.exit()
  File "/usr/lib/python3.7/argparse.py", line 2493, in exit
    _sys.exit(status)
SystemExit: 0

jseagrave21 and others added 3 commits May 5, 2019 21:44
- previously only "pretty printed" if "verbose", didn't actually complete the command
- fixed the tests to verify expected behavior

- separately, now closes the wallet when exiting a prompt session
- revert checks for 2.x #140
- fix GetEntryScriptHash and GetCallingScriptHash #138
…nto asyncio

* 'asyncio_alpha2' of https://github.com/ixje/neo-python:
  improve user input for prompt with DEBUG output
  improve `show nodes`
  fix `show state`
@ixje
Copy link
Member Author

ixje commented May 6, 2019

I ran into that as well. I have that fixed for np-api-server as well as np-api-server -h. Maybe something went wrong with rebasing. Will push later together with other fixes.

jseagrave21 and others added 6 commits May 6, 2019 16:44
- add tests for syncmanager
- fix a node disconnect issue
- change Persist to no longer block the whole process when processing a block with many transactions by yielding control
- limit max peers to 10
@ixje
Copy link
Member Author

ixje commented May 9, 2019

So I found an issue where a node task (receiving headers) and a syncmanager task (checking for header timeout) could alter a shared variable while control was yielded (=await), which in certain scenario's could cause an exception in one of the two that would go unnoticed (but I believe would shutdown or hang a task we didn't expect to ever hang). I believe that this together with a task cancel order issue in disconnect() of node is what was holding us back on a full sync from scratch.

@jseagrave21
Copy link
Contributor

jseagrave21 commented May 22, 2019

Thanks for the report @jseagrave21 , that gave a good starting point. It indeed had todo with the prompt now running on an asyncio loop. The solution was using the same replacement prompt as used for gathering contract details when deploying a contract.

Absolutely! I really like the fix. Definitely an elegant solution! I wish I had thought of that but I hadn't gotten that far yet so I didn't think to reference it, lol.

@ixje
Copy link
Member Author

ixje commented May 23, 2019

So the good part is; I was able to sync test from scratch to nearly max height and still be connected to nodes. The 'bad' is that I found that the syncmanager got stuck in a deadlock (syncmgr_task waiting for a node_task while a node_task was waiting for the sync_task) about 3000 blocks before the end. nodemanager was happily running but syncmanager looked like it died and was completely silent, but no errors anyway. This is really an edge case, but needs to be resolved.

With some manual wizardry (=without starting) I unlocked it and I can say it's still running stable and still connected to nodes after nearly 30 hours 🎉 .
Screenshot from 2019-05-23 16-16-48

I need to find a way to reproduce the behaviour in a test and then resolve it. That should be it for getting it merged. I need to get this thing in and do smaller PRs because it's getting really hard to port back and forth between dev and this.

@jseagrave21
Copy link
Contributor

jseagrave21 commented May 24, 2019

Using the latest commit there are still similar issues shutting down as the ones I mentioned above.
For example:

^C[D 190523 20:13:54 ledger:85] Processed Block 1346811 | Size: 1939 | Transactions: 5
Shutting down sync manager...DONE
[D 190523 20:13:55 nodemanager:368] stopping tasks...
[D 190523 20:13:55 nodemanager:377] disconnecting nodes...
[D 190523 20:13:55 node:104] 2019-05-23 20:13:55.134867 Connection lost 178.63.50.78:20333 excL None
[I 190523 20:13:57 api_server:81] [TestNet] Block 1346811 / 1354000
[D 190523 20:13:58 node:104] 2019-05-23 20:13:58.499673 Connection lost 13.251.243.222:20333 excL None
[D 190523 20:14:04 node:104] 2019-05-23 20:14:04.225658 Connection lost 139.99.148.127:20333 excL None
[D 190523 20:14:04 node:104] 2019-05-23 20:14:04.569536 Connection lost 13.59.64.147:20333 excL None
Shutting down node manager...DONE
[I 190523 20:14:12 api_server:81] [TestNet] Block 1346811 / 1354000
[I 190523 20:14:27 api_server:81] [TestNet] Block 1346811 / 1354000
[I 190523 20:14:42 api_server:81] [TestNet] Block 1346811 / 1354000
[I 190523 20:14:57 api_server:81] [TestNet] Block 1346811 / 1354000
[I 190523 20:15:12 api_server:81] [TestNet] Block 1346811 / 1354000
[I 190523 20:15:27 api_server:81] [TestNet] Block 1346811 / 1354000
[I 190523 20:15:42 api_server:81] [TestNet] Block 1346811 / 1354000
[I 190523 20:15:57 api_server:81] [TestNet] Block 1346811 / 1354000
^CTask was destroyed but it is pending!
task: <Task pending coro=<NeoNode.run() running at /mnt/c/users/seagrave/neo/asyncio/neo/Network/neonetwork/network/node.py:134> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7facfcf38b58>()]>>
Task was destroyed but it is pending!
task: <Task pending coro=<NeoProtocol.read_message.<locals>._read() running at /mnt/c/users/seagrave/neo/asyncio/neo/Network/neonetwork/network/protocol.py:72> cb=[_release_waiter(<Future pendi...cfcf38b58>()]>)() at /usr/lib/python3.7/asyncio/tasks.py:362]>
sys:1: RuntimeWarning: coroutine 'NeoProtocol.read_message.<locals>._read' was never awaited
Task was destroyed but it is pending!
task: <Task pending coro=<NeoNode.run() running at /mnt/c/users/seagrave/neo/asyncio/neo/Network/neonetwork/network/node.py:134> wait_for=<Future finished result=None>>
Task was destroyed but it is pending!
task: <Task pending coro=<NeoNode.run() running at /mnt/c/users/seagrave/neo/asyncio/neo/Network/neonetwork/network/node.py:134> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7facfcf38be8>()]> cb=[<TaskWakeupMethWrapper object at 0x7facfcf38828>()]>
Task was destroyed but it is pending!
task: <Task pending coro=<NeoNode.run() running at /mnt/c/users/seagrave/neo/asyncio/neo/Network/neonetwork/network/node.py:134> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7facfcf38d38>()]>>
Task was destroyed but it is pending!
task: <Task pending coro=<custom_background_code() running at /mnt/c/users/seagrave/neo/asyncio/neo/bin/api_server.py:82> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7facfcf38978>()]>>
Task was destroyed but it is pending!
task: <Task pending coro=<NeoProtocol.read_message.<locals>._read() running at /mnt/c/users/seagrave/neo/asyncio/neo/Network/neonetwork/network/protocol.py:72> cb=[_release_waiter(<Future pendi...cfcf38be8>()]>)() at /usr/lib/python3.7/asyncio/tasks.py:362]>
Task was destroyed but it is pending!
task: <Task pending coro=<NeoProtocol.read_message.<locals>._read() running at /mnt/c/users/seagrave/neo/asyncio/neo/Network/neonetwork/network/protocol.py:72> cb=[_release_waiter(<Future pendi...cfcf38d38>()]>)() at /usr/lib/python3.7/asyncio/tasks.py:362]>

Again, it appears that there are still instances of NeoNode running after nodemanager has already shutdown.

@jseagrave21
Copy link
Contributor

jseagrave21 commented May 24, 2019

I am noticing an odd behavior whenever relaying a transaction:

Regardless of the output level, I always see the debug statement for verifying the transaction. For example:

neo> config output
Select your desired configuration per component.
(1) DEBUG (2) INFO (3) ERROR (enter) keep current

[vm] current: INFO new:
[db] current: INFO new:
[generic] current: INFO new:
[network] current: INFO new:
[peewee] current: ERROR new:
[syncmanager] current: DEBUG new: 2

New Output Levels:
[vm] new: INFO
[db] new: INFO
[generic] new: INFO
[network] new: INFO
[peewee] new: ERROR
[syncmanager] new: INFO
neo> wallet open test_wallet.wallet
[password]> **********
Opened wallet at test_wallet.wallet
neo> sc invoke 0xa225d37c35b7e7752e57aedab79d665b6932000f --i
[Param 0] String input: AG2kcCLRkMsvYRqtnLFV51dyhT3FUHHTrM
[Param 1] String input: create address
[Param 2] String input:

-------------------------------------------------------------------------------------------------------------------------------------
Test invoke successful
Total operations: 113
Results [{'type': 'Integer', 'value': '1'}]
Invoke TX GAS cost: 0.0
Invoke TX fee: 0.0001
-------------------------------------------------------------------------------------------------------------------------------------

Enter your password to send this invocation to the network
[password]> **********
[D 190523 21:19:00 Transaction:590] Verifying transaction: b'b51f64b3f655cc4a5576d864f93c253ddd25c915d71b77d230ec870c9ba8f5a2'
Relayed Tx: b51f64b3f655cc4a5576d864f93c253ddd25c915d71b77d230ec870c9ba8f5a2

Notice [D 190523 21:19:00 Transaction:590] Verifying transaction: b'b51f64b3f655cc4a5576d864f93c253ddd25c915d71b77d230ec870c9ba8f5a2'
Is this expected?

@jseagrave21
Copy link
Contributor

jseagrave21 commented May 24, 2019

Using pretty print makes wallet address alias obsolete because there is no method to see the named addresses. For example:

neo> wallet address alias AG2kcCLRkMsvYRqtnLFV51dyhT3FUHHTrM mine
neo> wallet
Path       : test_wallet.wallet
Height     : 2293
Sync status: 100%

Address    : AG2kcCLRkMsvYRqtnLFV51dyhT3FUHHTrM
[NEO]      : 500.0
[NEOGas]   : 509.98655

Claims:
   unlocked: 0
   locked  : 0.01313

If this is expected and desired, I recommend removing the alias feature from prompt; otherwise, I recommend adding logic to show named addresses if they are available.

@ixje if you let me know how you'd like to proceed, I think I can submit a PR to resolve this issue.

@ixje
Copy link
Member Author

ixje commented May 27, 2019

Notice [D 190523 21:19:00 Transaction:590] Verifying transaction: b'b51f64b3f655cc4a5576d864f93c253ddd25c915d71b77d230ec870c9ba8f5a2'
Is this expected?

Well, that is not expected, but the root cause is simple.

from logzero import logger

it looks like we missed removing a logzero usage entry

@ixje
Copy link
Member Author

ixje commented May 27, 2019

If this is expected and desired, I recommend removing the alias feature from prompt; otherwise, I recommend adding logic to show named addresses if they are available.

@ixje if you let me know how you'd like to proceed, I think I can submit a PR to resolve this issue.

I think we should extend the pretty print to add aliasing output

@ixje ixje mentioned this pull request May 27, 2019
@jseagrave21
Copy link
Contributor

jseagrave21 commented May 27, 2019

@ixje, I'm sure you're aware but I just wanted to put in a reminder to

  • reset the default logger level to "INFO" for syncmanager before merging

@jseagrave21
Copy link
Contributor

jseagrave21 commented May 27, 2019

Also, I wanted to bring this up again: I still see a deprecation warning during make test when performing test_1_bad_bootstrap_file (reference)

Example:

***                                     ***
*** This test expects a `404 Not found` ***
***                                     ***
/mnt/c/users/jseag/neo/ixje/venv/share/python-wheels/requests-2.18.4-py2.py3-none-any.whl/requests/models.py:177: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
Could not download: 404 Client Error: Not Found for url: https://s3.us-east-2.amazonaws.com/blah.tar.gz
cleaning up btestchain

Notice /mnt/c/users/jseag/neo/ixje/venv/share/python-wheels/requests-2.18.4-py2.py3-none-any.whl/requests/models.py:177: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working

@jseagrave21
Copy link
Contributor

Notice [D 190523 21:19:00 Transaction:590] Verifying transaction: b'b51f64b3f655cc4a5576d864f93c253ddd25c915d71b77d230ec870c9ba8f5a2'
Is this expected?

Well, that is not expected, but the root cause is simple.

from logzero import logger

it looks like we missed removing a logzero usage entry

@ixje I found one more instance in Send.py. I think that is all that needs fixing and addressed the issue in this PR: https://github.com/ixje/neo-python/pull/17

@jseagrave21
Copy link
Contributor

If this is expected and desired, I recommend removing the alias feature from prompt; otherwise, I recommend adding logic to show named addresses if they are available.
@ixje if you let me know how you'd like to proceed, I think I can submit a PR to resolve this issue.

I think we should extend the pretty print to add aliasing output

I addressed this issue in https://github.com/ixje/neo-python/pull/18

ixje added 4 commits May 29, 2019 10:07
…nto asyncio

* 'asyncio_alpha2' of https://github.com/ixje/neo-python:
  update build_run test for --i input
  process feedback
  fixes `wallet verbose` - previously only "pretty printed" if "verbose", didn't actually complete the command - fixed the tests to verify expected behavior
  add minpeers features
@ixje ixje merged commit e7e57e5 into CityOfZion:development May 29, 2019

async def start(self):
host = 'localhost'
port = 8888 # settings.NODE_PORT
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ixje it looks like this was not reverted prior to merging

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed in #948

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants