Как узнать, на каком счете находится неизрасходованный вывод?

Когда я иду отправлять монеты, я хочу, чтобы транзакция игнорировала неизрасходованные монеты на определенной учетной записи.

Я думаю, что могу сделать это в wallet.cpp, но я не уверен, как это сделать.

Может быть, в функции AvailableCoins()? Сделать так, чтобы монеты были на этом счету? Думаю, мне нужно создать такую ​​функцию, как:

bool isInAccount(string strAccountName, CWalletTx *wtx)

Как я могу это сделать?

Ответы (2)

Ваш вопрос основан на непонимании системы учетной записи. Однако это очень распространенное заблуждение.

Неизрасходованные выходы не связаны с учетными записями.

Входящие транзакции кредитуют баланс счета, связанного с адресом, с которым получена транзакция. Но аккаунты имеют только баланс — они не «владеют» отправленными им монетами. Баланс счета может стать отрицательным и может быть изменен с помощью moveкоманды без изменения монет.

Неизрасходованные выходы принадлежат кошельку в целом, и учетные записи просто отслеживают, кто/что владеет их количеством, а не какими конкретно. Это как держать кошелек с деньгами, которые принадлежат и вам, и другу. Вы отслеживаете, сколько вы должны своему другу, но не отслеживаете, какие именно банкноты или монеты в кошельке принадлежат ему.

Чтобы делать то, что вы хотите, вам нужно либо использовать отдельные кошельки (которые полностью хранят монеты отдельно), либо использовать управление монетами или API необработанных транзакций, которые позволяют вам вручную указывать, какие монеты использовать.

Питер, не было бы лучше, если бы функция учетных записей работала таким образом, связывая UTXO с конкретными учетными записями, а затем тратя деньги только из UTXO учетной записи? Если учетная запись не указана, программное обеспечение может воспринять это как расходы с UTXO любой/всех учетных записей. Кажется, именно так большинство людей ожидают / хотят, чтобы это работало. Может быть, проблема с этим связана с обратной совместимостью?
Это совершенно другая модель, и нет, этого не произойдет. Функция учетных записей, скорее всего, просто устареет и будет удалена где-то в будущем.
То, что вы описываете, похоже на поддержку нескольких кошельков. Никто с этим не согласен, но без людей, активно разрабатывающих реализацию кошелька Bitcoin Core, это займет некоторое время.

Вы хотите сделать это с биткойн-демоном? Вы можете проверить

получитьаккаунт
вызов РПК. Помощь для этого метода:

getaccount "биткойн-адрес"

Возвращает учетную запись, связанную с данным адресом.

Аргументы: 1. "bitcoinaddress" (обязательное поле) Биткойн-адрес для поиска учетной записи.

Результат: "accountname" (строка) адрес аккаунта

Примеры:
> биткойн-cli getaccount "1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ"
> curl --user myusername --data-binary '{"jsonrpc": "1.0", "id": "curltest", "method": "getaccount", "params": ["1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ"] }' -H 'тип содержимого: текст/обычный;' http://локальный:8332/
Я знаю, что это для данного адреса, и вы ищете конкретный vout, но, как я предполагаю, эти два, вероятно, соответствуют вашему случаю?
Нет, я хочу сделать это из самого ядра Биткойн. Допустим, у меня есть учетная запись под названием «зарезервирована». Всякий раз, когда я отправляю монеты, я не хочу использовать монеты с «зарезервированного» счета. У меня может быть 1 или 100 адресов в «зарезервированных», но я никогда не хочу, чтобы какие-либо неизрасходованные полученные монеты в этой учетной записи использовались при отправке монет.