How to replicate getaccountaddress behaviour using getnewaddress and labels api

0

The problem is getaccountaddress is getting deprecated and it has specific behaviour (not related to accounts) I'm relying heavily on. It gives you the same address between multiple calls as long as there are no incoming transactions…

What I'm doing essentially is calling getaccountaddress "" every time an address needs to be displayed.

The problem is getnewaddress is designed to always provide you with a new address, so I end up flooding wallet with meaningless amount of addresses that never receive anything.

I'm trying to replicate that old behaviour using labels API, but the best I've come up with is to combine getaddressesbylabel and parsing everything listtransactions outputs to find if there's an unused receive-typed address, and to generate new one if none found.

This seems both error prone and hardly scalable, because the number of addresses will potentially grow and may become very large very fast.

What are my options? Is there an API call that can be used as a replacement for getaccountaddress "" or a combination of calls?

ConstB

Posted 2019-05-17T02:45:18.483

Reputation: 1

Answers

0

It is possible to mimic the same functionality of getaccountaddress using a label.

This is an example in python:

#!/usr/bin/env python3

import bitcoin.rpc

bitcoin.SelectParams('regtest')
proxy = bitcoin.rpc.Proxy()

def get_unused_address():
    label = 'donations'
    unused = None
    try:
        addr_list = proxy.call('getaddressesbylabel', label)
    except bitcoin.rpc.JSONRPCError as err: 
        if err.error['code'] == -11:
            # No addresses with label
            addr_list = None
    if addr_list:
        # Addresses with label found
        for addr in list(addr_list.keys()):
            # Check for tx received
            r = proxy.call('listreceivedbyaddress', 0, True, False, addr)
            if not len(r[0]['txids']):
                # Unused address found!
                unused = addr
                break
            else:
                # Used address found, remove label
                proxy.call('setlabel', addr, '')
    if not unused:
        # Address with label not found, generate a new one
        unused = proxy.getnewaddress(label)
    return unused

print("Unused address is: %s" % get_unused_address())

cisba

Posted 2019-05-17T02:45:18.483

Reputation: 26

sorry, I cannot accept this answer. this is exactly what I'm describing in the question and the problem with scalability it has is what's important. just imagine getaddressesbylabel returning 1 mln of addresses…ConstB 2019-08-30T04:38:26.950

Sorry, I missed your problem of scalability... In your case I think the answer is very similar to this: https://bitcoin.stackexchange.com/a/70595/47356

cisba 2019-09-02T13:12:03.513

0

Bitcoin wallet accounts are designed for personal use, so your use case requires to develop on a different layer, as explained by G. Maxwell here: https://github.com/bitcoin/bitcoin/issues/3816#issuecomment-37052569

cisba

Posted 2019-05-17T02:45:18.483

Reputation: 26

Also this comment is appropriate, IMHO: https://github.com/bitcoin/bitcoin/issues/3816#issuecomment-37097158

cisba 2019-09-02T13:36:18.610