C # .NET으로 LOCAL 비트 코인 블록 체인 쿼리


175

로컬로 저장된 블록 체인 (Bitcoin Core를 통해 다운로드) 사용하여 주어진 Bitcoin 주소 의 잔액 을 확인하려고합니다 . NBitCoin 및 / 또는 QBitNinja를 사용하여 이와 유사하지만 네트워크에 액세스 할 필요가없는 것 :

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;
}

위의 예는 네트워크에 액세스해야합니다. 오프라인에서도 같은 작업을 수행해야합니다. 나는 이와 같은 것을 생각해 냈지만 분명히 작동하지 않습니다.

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;
}
  1. 쿼리 중에 멈춤
  2. 모든 것을 느리게 InMemoryNoSqlRepository사용 ReIndex()하는 것을 방지하기 위해 파일에 저장하는 대신 무언가를 원합니다.

내 요구 사항은 잔액확인하는 것입니다 첫 번째 방법과 동일한 방식으로 디스크에 저장된 블록을 쿼리하여 하는 것입니다.

실제로 내가 필요한 것은 이 질문에 대한 대답 일 수 있습니다 .


1
이상적으로는 작동하지 않는 두 번째 방법에서만 NBitcoin을 사용하고 싶습니다. 왜 그런지 모르겠습니다. IIS의 QBitNinja Server는 두 번째 옵션이지만 BitcoinLib을 언급했듯이 마지막 수단으로 시도해 볼 수 있습니다. 여기서 균형은 단지 예일뿐입니다. 많은 흥미로운 것들에 대해 로컬 블록 체인을 쿼리하고 싶습니다. BitcoinLib가 더 이상 업데이트되지 않는다고 생각했지만. 도움을 주셔서 감사하며 지금까지 시도한 유일한 사람처럼 보입니다. :). 그래서 아무도 더 나은 대답을하지 않으면 50 담당자를 줄 것입니다.
rvnlord

1
로컬 노드는 없지만 약 4 년 전에 블록 체인 코드를 다루었습니다. 시간이 오래 걸리는 이유는 직렬화 된 블록 체인 데이터가 구성되는 방식과 linq 엔진이 해당 데이터를 쿼리하는 방식이기 때문에 잘 교육 된 추측을 줄 수 있습니다. 기본 구문 분석 / 쿼리 코드가 최적화되어 있지 않아 루틴이 "매달려"있는 것 같습니다. 코드가 잘 작동하지만 반응 형 실행을위한 기본 최적화가 필요할 수 있습니다.
RLH

12
안녕하세요, 그것은 오래된 질문이지만 어제 이것을 보았습니다. NBitcoin으로 코드를 시도했습니다. 이 줄을 주석 처리 한 경우에만 코드가 이전의 일부 로컬 노드에서 작동합니다. index.ReIndex (); 이 줄 var chain = node.GetChain () ;. 또한 GetChain 대신 GetBlocks를 수행하는 코드를 약간 조정했습니다. 작동하기 위해 비슷한 변화가 있습니다. 나는 downvoted하고 싶지 않아서이 의견을 게시하고 있습니다 :). 도움이 되길 바랍니다.
Hey24sheep

19
@ Hey24sheep 코드가 작동합니까? 그런 다음 답변으로 게시하십시오. 나는 아무도 당신을 일하는 해결책으로 당신을 떨쳐 버릴 것이라고 생각하지 않습니다.
Martin Braun

5
사람들이 솔루션을 게시하고 투표를 거부하는 이유는 무엇입니까? 이것이 우리가 생각하는 비트 코인이 아니라는 신호입니까? 비트 코인 투기꾼으로 걱정하지 않아야합니까? @ Hey24sheep와 다른 사람들의 의견을 참조하십시오. 노란 깃발 시간?
Rich Bianco

답변:


1

귀하의 질문에 대한 첫 번째와 두 번째 시도는 비슷하지 않습니다. 첫 번째 방법은 json rpc를 사용하여 데몬에게 균형을 요청합니다 (그리고 나는 그것이 올바른 방법이라고 감히 말합니다-당신은 자동차 엔진에서 윗부분을 차지하지 않고 피스톤을 앞뒤로 밀어서 앞으로 움직입니다.) 두 번째는 데몬의 데이터베이스 자체를 열고 균형을 직접 계산합니다.

로컬 호스트를 쿼리하기 위해 "네트워크가 필요하지"않고 TCP / IP를 지원하는 머신 만 있으면됩니다. 따라서 관련 json-rpc 데이터를 작성하는 라이브러리를 사용하여 어떤 방법 으로든 첫 번째 방법 만 사용하십시오. http 요청으로 또는 관련 http 요청을 직접 작성하여 ..

BitcoinLib은 유지 관리되거나 유지 관리되지 않을 수도 있지만 (모름) 로컬 데몬을 쿼리하는 기능을 무효화하지는 않습니다. 내가 아는 한 GetBalance는 제거되거나 리팩토링되지 않았으며 GetBalance를 포함한 다양한 작업에 최신 비트 코인과 함께 BitcoinLib를 사용합니다


나는이 질문에 대해 완전히 잊었다. @ Hey24sheep는 문제를 해결했지만 지금은 전체 로컬 노드를 사용할 수 없습니다. 그때 LOCAL 및 OFFLINE 데이터를 쿼리하려고했습니다. API를 타사 소스에 사용하여 달성 할 수있는 것보다 훨씬 빠르게 쿼리해야했습니다.
rvnlord
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.