Saya mencoba memeriksa saldo alamat Bitcoin tertentu dengan HANYA menggunakan blockchain yang disimpan secara lokal (diunduh melalui Bitcoin Core). Sesuatu yang mirip dengan ini (dengan menggunakan NBitCoin dan / atau QBitNinja), tetapi tanpa memerlukan akses ke jaringan:
private static readonly QBitNinjaClient client = new QBitNinjaClient(Network.Main);
public decimal CheckBalance(BitcoinPubKeyAddress address)
{
var balanceModel = client.GetBalance(address, true).Result;
decimal balance = 0;
if (balanceModel.Operations.Count > 0)
{
var unspentCoins = new List<Coin>();
foreach (var operation in balanceModel.Operations)
unspentCoins.AddRange(operation.ReceivedCoins.Select(coin => coin as Coin));
balance = unspentCoins.Sum(x => x.Amount.ToDecimal(MoneyUnit.BTC));
}
return balance;
}
Contoh di atas membutuhkan akses ke jaringan. Saya perlu melakukan hal yang sama secara offline. Saya datang dengan sesuatu seperti ini, tetapi jelas itu tidak berhasil:
public decimal CheckBalanceLocal(BitcoinPubKeyAddress address)
{
var node = Node.ConnectToLocal(Network.Main);
node.VersionHandshake();
var chain = node.GetChain();
var store = new BlockStore(@"F:\Program Files\Bitcoin\Cache\blocks", Network.Main);
var index = new IndexedBlockStore(new InMemoryNoSqlRepository(), store);
index.ReIndex();
var headers = chain.ToEnumerable(false).ToArray();
var balance = (
from header in headers
select index.Get(header.HashBlock)
into block
from tx in block.Transactions
from txout in tx.Outputs
where txout.ScriptPubKey.GetDestinationAddress(Network.Main) == address
select txout.Value.ToDecimal(MoneyUnit.BTC)).Sum();
return balance;
}
- Itu hang selama permintaan
- Saya ingin sesuatu daripada
InMemoryNoSqlRepository
disimpan dalam file untuk mencegah penggunaanReIndex()
yang memperlambat semuanya
Persyaratan saya adalah untuk Periksa Saldo dengan cara yang sama seperti pada metode pertama tetapi dengan menanyakan blok yang disimpan pada disk saya.
Sebenarnya yang saya butuhkan mungkin hanya menjadi jawaban untuk pertanyaan ini :
c#
.net
bitcoin
blockchain
rvnlord
sumber
sumber
Jawaban:
Upaya pertama dan kedua dalam pertanyaan Anda sama saja. Yang pertama menggunakan json rpc untuk meminta keseimbangan pada dasmon (dan saya berani mengatakan itu cara yang tepat - Anda tidak mengambil bagian atas dari mesin mobil Anda dan mendorong piston ke atas dan ke bawah sendiri untuk mencapai gerakan maju, bukan?) yang kedua mencoba untuk membuka database daemon itu sendiri dan menghitung saldo secara langsung.
Anda tidak "memerlukan jaringan" untuk menanyakan localhost, Anda hanya perlu mesin yang memasang dukungan TCP / IP, jadi gunakan saja metode pertama dengan cara apa pun - baik dengan menggunakan perpustakaan yang menulis data json-rpc yang relevan menjadi permintaan http, atau dengan membentuk permintaan http yang relevan sendiri ..
BitcoinLib mungkin atau mungkin tidak dipertahankan (saya tidak tahu) tetapi itu tidak membatalkan kemampuannya untuk menanyakan daemon lokal Anda; sejauh yang saya tahu GetBalance belum dihapus atau dire-refored, dan saya menggunakan BitcoinLib dengan bitcoind terbaru untuk berbagai operasi termasuk GetBalance
sumber