ラベル Bitcoin の投稿を表示しています。 すべての投稿を表示
ラベル Bitcoin の投稿を表示しています。 すべての投稿を表示

2017年6月11日日曜日

IOTA whitepaperの概要

ペーパーを第3章まで読んでざっくりと内容をまとめてみる。
ここには個人的な意見も含むことを注意してほしい。
http://iotatoken.com/IOTA_Whitepaper.pdf

目的

IOT向けマイクロペイメントの実現

現状の課題(述べられていること)

ビットコインでは手数料が高く少額の支払いに向いていない

現状の課題(個人的)

取引承認にかかる時間、スケーラビリティ

何をするのか

  • Blockchainless
  • DAGでTxチェーンを作成
    • これをtangleと呼んでいるらしい

どう動くのか

  • Txの発行・承認・伝搬の役割が参加者で別れておりTxがTxを承認する
    • 理想的な状態では承認が重複せずスケールアウトする?
  • Txを発行するには、ユーザーは他のTxを承認する必要がある
  • 新しいTxはランダムに選ばれる前の2つのTxを承認する必要がある
  • 全てのTxは台帳に入りうる
    • Orphanのような存在も救われるようにしている
  • 各ノードはTxを伝搬させる役割を持つ 
    • そのインセンティブはネットワークに参加できること
    • あまりにも怠惰であるとドロップされる
  • 自らのTxを参照する空Txションを作成することでtipからの承認を受ける確率をあげることが望まれる
    • 不要なTxの増加を誘発させないか?
  • Spam対策
    • 大きなweightがあるものほどノードが承認しやすいならば、spamは承認されづらくなる 
      • しかしそれでは新たなtipsが承認されなくなってしまうのでは?
      • spamに承認されてるTxはなるべく承認されないようになっているのでは?

言葉の定義

tips:未承認のTx
site:tangleグラフ上に表されるTx
node:ネットワーを構成しているもの、Txを発行するエンティティ
height:genesisまで最長指向経路の長さ
depth:いくつかの先端までの最長の逆向き経路の長さ
score:全てのTxのweightの合計
cumulative weight:全ての取引のweightの合計
weights:Txスコアの元になる
cutset:ある時点におけるtipsの集合

2017年6月3日土曜日

MacOSXでbitcoindを設定する時に出るエラーとその対処法

ある端末でセットアップしようとした時にいくつかつまずいた点をまとめておく。

<事象>
configure: error: No working boost sleep implementation found.

<対応>
$ brew install autoconf automake libtool berkeley-db4 boost miniupnpc openssl pkg-config protobuf qt

<結果>
$ make
....
net.cpp:1066:15: error: no matching function for call to 'upnpDiscover'
    devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, &error);
              ^~~~~~~~~~~~
/usr/local/include/miniupnpc/miniupnpc.h:62:1: note: candidate function not
      viable: requires 7 arguments, but 6 were provided
upnpDiscover(int delay, const char * multicastif,
^
1 error generated.
make[2]: *** [net.o] Error 1
make[1]: *** [check-recursive] Error 1
make: *** [check-recursive] Error 1

<判定>
どうやら選択しているバージョンが古いらしい。今までは
v0.9.5
を選択していた。リストの最下部に出てくるので最新かと思いきや。
$ git tag
で選択可能なバージョンを見直してみると
$ git tag
v0.1.5
v0.1.6test1
v0.10.0
v0.10.0rc1
v0.10.0rc2
v0.10.0rc3
v0.10.0rc4
v0.10.1
v0.10.1rc1
v0.10.1rc2
v0.10.1rc3
v0.10.2
v0.10.2rc1
v0.10.3
v0.10.3rc1
v0.10.3rc2
v0.10.4
v0.10.4rc1
v0.10.5
v0.11.0
v0.11.0rc1
v0.11.0rc2
v0.11.0rc3
v0.11.1
v0.11.1rc1
v0.11.1rc2
v0.11.2
v0.11.2rc1
v0.11.3
v0.12.0
v0.12.0rc1
v0.12.0rc2
v0.12.0rc3
v0.12.0rc4
v0.12.0rc5
v0.12.1
v0.12.1rc1
v0.12.1rc2
v0.13.0
v0.13.0rc1
v0.13.0rc2
v0.13.0rc3
v0.13.1
v0.13.1rc1
v0.13.1rc2
v0.13.1rc3
v0.13.2
v0.13.2rc1
v0.14.0
v0.14.0rc1
v0.14.0rc2
v0.14.0rc3
v0.14.1
v0.14.1rc1
v0.14.1rc2
v0.2.0
v0.2.10
v0.2.11
v0.2.12
v0.2.13
v0.2.2
v0.2.4
v0.2.5
v0.2.6
v0.2.7
v0.2.8
v0.2.9
v0.2rc2
v0.3.0
v0.3.1
v0.3.10
v0.3.11_notexact
v0.3.12
v0.3.13
v0.3.14
v0.3.15
v0.3.17
v0.3.18
v0.3.19
v0.3.1rc1
v0.3.2
v0.3.20
v0.3.20.01_closest
v0.3.20.2
v0.3.20.2_closest
v0.3.21
v0.3.21rc
v0.3.22
v0.3.22rc1
v0.3.22rc2
v0.3.22rc3
v0.3.22rc4
v0.3.22rc5
v0.3.22rc6
v0.3.23
v0.3.23rc1
v0.3.24
v0.3.24rc1
v0.3.24rc2
v0.3.24rc3
v0.3.3
v0.3.6
v0.3.7
v0.3.8
v0.3rc1
v0.3rc2
v0.3rc4
v0.4.0
v0.4.00rc1
v0.4.00rc2
v0.5.0
v0.5.0rc1
v0.5.0rc2
v0.5.0rc3
v0.5.0rc4
v0.5.0rc5
v0.5.0rc6
v0.5.0rc7
v0.5.1
v0.5.1rc1
v0.5.1rc2
v0.5.2
v0.5.3
v0.5.3rc4
v0.6.0
v0.6.0rc1
v0.6.0rc2
v0.6.0rc3
v0.6.0rc4
v0.6.0rc5
v0.6.0rc6
v0.6.1
v0.6.1rc1
v0.6.1rc2
v0.6.2
v0.6.2.1
v0.6.2.2
v0.6.3
v0.6.3rc1
v0.7.0
v0.7.0rc1
v0.7.0rc2
v0.7.0rc3
v0.7.1
v0.7.1rc1
v0.7.2
v0.7.2rc2
v0.8.0
v0.8.0rc1
v0.8.1
v0.8.2
v0.8.2rc1
v0.8.2rc2
v0.8.2rc3
v0.8.3
v0.8.4
v0.8.4rc2
v0.8.5
v0.8.6
v0.8.6rc1
v0.9.0
v0.9.0rc1
v0.9.0rc2
v0.9.0rc3
v0.9.1
v0.9.2
v0.9.2.1
v0.9.2rc1
v0.9.2rc2
v0.9.3
v0.9.3rc1
v0.9.3rc2
v0.9.4
v0.9.5
v0.9.5rc1
v0.9.5rc2

<対応> バージョンを最新にした。
$ git checkout v0.14.1

<結果>
$ ./configure
configure: error: libevent not found.

<対応>
依存関係のあるパッケージがまたひとつ抜けているらしいので。
$ brew install libevent
$ make

<結果>
Making all in doc/man
make[1]: Nothing to be done for `all'.
make[1]: Nothing to be done for `all-am'.
$ sudo make install
Making install in doc/man
make[2]: Nothing to be done for `install-exec-am'.
 ../../build-aux/install-sh -c -d '/usr/local/share/man/man1'
 /usr/bin/install -c -m 644 bitcoind.1 bitcoin-qt.1 bitcoin-cli.1 bitcoin-tx.1 '/usr/local/share/man/man1'
make[2]: Nothing to be done for `install-exec-am'.
 build-aux/install-sh -c -d '/usr/local/lib/pkgconfig'
 /usr/bin/install -c -m 644 libbitcoinconsensus.pc '/usr/local/lib/pkgconfig'

<確認>
$ which bitcoind
/usr/local/bin/bitcoind


2017年4月9日日曜日

"Programming The Blockchain in C# 日本語"のマルチシグでコードを動かしてみた

前回と同様にこちらでの学習内容を記す。

ビットコインを使うためn個の異なる公開鍵に対してm個の秘密鍵で署名する必要があるscriptPubKeyを作る

署名に関わる人たちの鍵を作る

Key bob = new Key();
Key alice = new Key();
Key satoshi = new Key();

var scriptPubKey = PayToMultiSigTemplate.Instance.GenerateScriptPubKey(2, new[]{bob.PubKey,alice.PubKey,satoshi.PubKey});
Console.WriteLine(scriptPubKey);

  • 今回はn=3、m=2を想定するようで人数分の鍵を新たに生成する
  • 生成したそれぞれの秘密鍵から公開鍵を生成する
  • 生成された公開鍵からscriptPubKey(LockingScript)を生成する
  •  "2"というのは2つの署名で解除できるということだろうか?


出力結果
  • このscriptPubKey内容を順に解釈すると以下になるか?
    •  解除には2つの署名が必要
    •  署名できるアカウントの公開鍵ハッシュ(今回のケースでは3つ)
    •  3つのアカウントに対するマルチシグチェックをする


receivedというトランザクションでビットコインを受け取ったと想定したときこのアウトプットに先ほど作成したscriptPubKeyを含める

var received = new Transaction();
received.Outputs.Add(new TxOut(Money.Coins(1.0m), scriptPubKey));

先ほど定義したトランザクションから受け取ったコインを取得する
Coin coin = received.Outputs.AsCoins().First();

まだ署名されていないトランザクションを生成する
BitcoinAddress nico = new Key().PubKey.GetAddress(Network.Main);
TransactionBuilder builder = new TransactionBuilder();
Transaction unsigned = builder.AddCoins(coin)
           .Send(nico, Money.Coins(1.0m)).BuildTransaction(sign: false);


  • トランザクションを生成するためのnicoのアドレスを生成する
  • トランザクションビルダーを生成する
  • 生成したトランザクションビルダーに必要な情報を付与する
    •  先ほど取得したコイン
    •  送り先と送るコインの量
    •  署名の有無


生成した署名されてないトランザクションにaliceがどのように署名するかを示す

Transaction aliceSigned = builder.AddCoins(coin)
.AddKeys(alice).SignTransaction(unsigned);

  • aliceがトランザクションに署名するために必要な情報を付与する
    •  先ほど取得したコイン
    •  aliceの鍵
    •  先ほど定義した署名されてないトランザクション


このaliceSignedの中身は以下となる

bobの分も同様に行う

Transaction bobSigned = builder.AddCoins(coin)
             .AddKeys(bob).SignTransaction(aliceSigned);

  • bobがトランザクションに署名するために必要な情報を付与する
    •  先ほど取得したコイン
    •  bobの鍵
    •  先ほど定義したaliceの署名がされたトランザクション



先ほどのscriptSigにaliceのものに加えてbobのものが追加されている

しかしこれでは署名が結合されていないらしいので両者の署名を一つにする

Transaction fullySigned = builder.AddCoins(coin)
                   .CombineSignatures(aliceSigned,bobSigned);

その結果の署名が以下になる

  • 何も変わってない・・・。
  • 一度サイトの方を読み返してみると色々とおかしな点に気づく
  • bobの署名に関する図解がコードと異なっている
    •  coinとsatoshiの秘密鍵と署名されてないトランザクションが必要となっている
    •   正確にはcoinとbobの秘密鍵とaliceが署名したトランザクションが必要ではないか?
    •  しかしそれだと今回の結果通り署名の結合が意味をなさない
  • bobの署名には正しくは以下が必要なのではないかと考える
    •  aliceのトランザクションではなくunsignedなトランザクション
    •  satoshiの鍵ではなくbobの鍵

まとめ

上記の疑問通りコードを書き直したがbobSignedとfullySignedに変化はなかった
この署名の結合の意味はなんなのか、わからずじまいだった。新しいことがわかり次第追記していきたい。

2017年4月2日日曜日

[和訳]Segregated Witness Benefits_BitcoinCore

こちらを勉強するに当たって知っておいた方が良さそうだったのと、後で調べたいと思った人が英語で挫折しないようにと思い翻訳しながら理解を深めていく。

対象サイトはこちら


segwitのメリット

The Segregated Witness soft-fork (segwit) includes a wide range of features, many of which are highly technical. This page summarises some of the benefits of those features.
 segwitは高度に技術的なものも含めて多くの広範囲に及ぶ特徴を含んでいる。このページではそれらの特徴が持つメリットのうちのいくつかを要約する。

Malleability(展性)修正

Bitcoin transactions are identified by a 64-digit hexadecimal hash called a transaction identifier (txid) which is based on both the coins being spent and on who will be able to spend the results of the transaction.
 ビットコイントランザクションはコインが使われたことや誰がそのコインを使うことができるのかといった情報に基づく64bitの16進数ハッシュからなるトランザクション識別子(txid)と呼ばれている。
Unfortunately, the way the txid is calculated allows anyone to make small modifications to the transaction that will not change its meaning, but will change the txid. This is called third-party malleability. BIP 62 (“dealing with malleability”) attempted to address these issues in a piecemeal manner, but was too complicated to implement as consensus checks and has been withdrawn.
残念なことにtxidが計算される方法はトランザクション自体が持つ意味は変えずにtxidを変えるということを誰かにできるようにさせてしまう。これをサードパーティMalleabilityという。BIP62ではこれらの問題に断片的に働きかけようとしていたがこれはコンセンサスチェックのように実装するのがとても複雑だったので撤回されてしまった。

For example, you could submit a transaction with txid ef74…c309 to the network, but instead find that a third-party, such as a node on the network relaying your transaction, or the miner who includes your transaction in a block, modifies the transaction slightly, resulting in your transaction still spending the same coins and paying the same addresses, but being confirmed under the completely different txid 683f…8bfa instead.
例えばあなたが"ef74...c309"というtxidを持ったトランザクションをネットワークに伝搬できたとしてもあなたのトランザクションに依存するネットワーク上のノードやあなたのトランザクションをブロックに含んでいるようなマイナーといった第三者がトランザクションをわずかに、あなたのトランザクションが未だに同じコインを同じアドレスに向けて消費してるように、変更するが完全に異なるtxid"683f...8bfa" の元で確認されることとなる。

私見)トランザクションに依存するネットワーク上のノーどとはSPVクライアントのことか?
More generally, if one or more of the signers of the transaction revise their signatures then the transaction remains valid and pays the same amounts to the same addresses, but the txid changes completely because it incorporates the signatures. The general case of changes to signature data (but not the outputs or choice of inputs) modifying the transaction is called scriptSig malleability.
より一般的にいうと、もしトランザクションの署名者の一人もしくは複数が彼らの署名を修正するとトランザクションは有効で同量を同じアドレスに支払うことができるがこの行為は署名を組み込んでしまうためtxidは完全に変更されてしまう 。この一般的な署名データがトランザクションを修正することに対する変更事例(アウトプットやインプットを選ぶことではない)はscriptSig malleabilityと呼ばれている。

私見)txidは署名を含めたトランザクション全体のハッシュ値であるということ


Segwit prevents third-party and scriptSig malleability by allowing Bitcoin users to move the malleable parts of the transaction into the transaction witness, and segregating that witness so that changes to the witness does not affect calculation of the txid.
 segwitはビットコインユーザーによるサードパーティもしくはscriptSigのmalleabilityを対してトランザクションにおける展性的な部分をトランザクションwitnessに移動させることで妨げることができるしwitnessの分離によってtxidの計算とwitnessを無関係にさせる変更である。

私見)訳がヘンテコであるが、witnessをtxidの計算に含めないことによってtxidの変更による混乱を避けることができるということだろう。

誰の利益になる?

  • Wallet authors tracking spent bitcoins: it’s easiest to monitor the status of your own outgoing transactions by simply looking them up by txid. But in a system with third-party malleability, wallets must implement extra code to be able to deal with changed txids.
使われたビットコインを追跡するウォレット作成者:単にtxidで探されるあなたの伝搬されようとしているトランザクションの状態を観察することが容易になる。しかしサードパーティmalleabilityの存在するシステムだとウォレットは変更されたtxidを扱うための余分なコードを実装しなければならない。
  • Anyone spending unconfirmed transactions: if Alice pays Bob in transaction 1, Bob uses that payment to pay Charlie in transaction 2, and then Alice’s payment gets malleated and confirmed with a different txid, then transaction 2 is now invalid and Charlie has not been paid. If Bob is trustworthy, he will reissue the payment to Charlie; but if he isn’t, he can simply keep those bitcoins for himself.
未確認のトランザクションを使用しようとしている誰か:もしアリスがトランザクション1でボブに支払う場合、ボブはそれをトランザクション2のチャーリーに対する支払いで使う、そしてその時アリスの支払いは展延され異なるtxidで確認される、その時トランザクション2は無効になってチャーリーは支払いを受けられなくなった。もしボブが信頼できるなら、彼はチャーリーに対する支払いを再発行するだろうがもし彼がそうでなければ彼はそれらのビットコインを彼自身で保持することができてしまう。
  • The Lightning Network: with third-party and scriptSig malleability fixed, the Lightning Network is less complicated to implement and significantly more efficient in its use of space on the blockchain. With scriptSig malleability removed, it also becomes possible to run lightweight Lightning clients that outsource monitoring the blockchain, instead of each Lightning client needing to also be a full Bitcoin node.
ライトニングネットワーク:サードパーティmalleabilityとscriptSig malleabilityが修正されるとライトニングネットワークは実装するのに複雑でなくなるしブロックチェーン上のスペース利用において明らかに効率的になる。scriptSig malleabilityが除去されると、フルビットコインノードになることが必要とされている高速クライアントの代わりにブロックチェーンの監視をアウトソースする軽量かつ高速なクライアントを実行できるようになる。
  • Anyone using the block chain: smart contracts today, such as micropayment channels, and anticipated new smart contracts, become less complicated to design, understand, and monitor.
 ブロックチェーンを使ういずれの人も:マイクロペイメントチャネルのような今日のスマートコントラクトや高度化された新たなスマートコントラクトをデザインし理解し観察することが今より複雑でなくなる。

  • Note: segwit transactions only avoid malleability if all their inputs are segwit spends (either directly, or via a backwards compatible segwit P2SH address).

注記:segwitトランザクションは全ての入力がsegwitによるものである場合のみmalleabilityを回避できる。(直接、または介護完成のあるsegwit P2SHアドレス経由)


まとめ

 segwitの目的と手段はおおよそ理解できた。しかし現在の展性対策としてのextra codeとは一体どのようなもので、それがネットワークに及ぼす定量的な影響度合いについて理解できなかった。そこは今後要調査である。

"Programming The Blockchain in C# 日本語"のP2PK[H] (Pay to Public Key [Hash])でコードを動かしてみた

前回に引き続きこちらのサイトで練習。
P2PK(Pay to Public Key)とP2PKH(Pay to Public Key Hash)の違いについて学ぶ。

前準備

こちらでScriptPubKeyに関する説明がされている。
ひょっとすると知らないかもしれないが、実は、ビットコインのブロックチェーンの内部には、ビットコインアドレスなどというものはない。内部的に、ビットコインのプロトコルでは、ビットコインを受け取る相手をScriptPubKeyで認識することになっている。
つまりビットコインの所有権を誰が持っているのかをScriptPubKeyで認識するということ。一般的にはビットコインアドレスがその一旦を担ってい流ように思われがちだがそうではないということ。

本編


公開鍵とビットコインアドレスの関係性を復習

            var publicKeyHash = new Key().PubKey.Hash;
                //公開鍵ハッシュ値を生成
            var bitcoinAddress = publicKeyHash.GetAddress(Network.Main);
                //公開鍵ハッシュ値からメインネット用のビットコインアドレスを生成
            Console.WriteLine(publicKeyHash);
            Console.WriteLine(bitcoinAddress);

  • ビットコインアドレスは公開鍵ハッシュから生成される


ビットコインアドレスとScriptPubKeyの関係性を把握

            var scriptPubKey = bitcoinAddress.ScriptPubKey;
                //ビットコインアドレスからLockingScript(ScriptPubKey)を生成
            Console.WriteLine(scriptPubKey);

            var sameBitcoinAddress = scriptPubKey.GetDestinationAddress(Network.Main);
                //LockingScriptからビットコインアドレスを生成
            Console.WriteLine(sameBitcoinAddress);

  • ScriptPubKeyはビットコインアドレスから生成される
  • その逆もまた然り


しかし必ずしもScriptPubKeyはビットコインアドレスを含んでいる訳ではない。というのがここで主張されていることだ。

GenesisBlockから見るScriptPubKeyの性質

            Block genesisBlock = Network.Main.GetGenesis();
                //GenesisBlockを取得
            Transaction firstTransactionEver = genesisBlock.Transactions.First();
                //GenesisBlockのトランザクション情報
            var firstOutputEver = firstTransactionEver.Outputs.First();
                //GenesisBlockのトランザクションのアウトプットを取得
            var firstScriptPubKey = firstOutputEver.ScriptPubKey;
                //GenesisBlockのトランザクションのアウトプットのScriptPubKeyを取得
            var firstBitcoinAddressEver = 
                firstScriptPubKey.GetDestinationAddress(Network.Main);
                //GenesisBlockのトランザクションのアウトプットの
                      //ScriptPubKeyからビットコインアドレスを生成
            
            Console.WriteLine(firstTransactionEver);
                //scriptPubKeyの形式が「公開鍵ハッシュ値+スクリプト」ではなく
                     //「公開鍵+スクリプト」となっている
                //初期の頃は公開鍵が直接scriptPubKeyに使われているということがわかる
      
            var key = new Key();
            Console.WriteLine("pay to public key : " + key.PubKey.ScriptPubKey);
            Console.WriteLine();
            Console.WriteLine("pay to public key hash : " + key.PubKey.Hash.ScriptPubKey);


  • ScriptPubKeyの形式が「公開鍵ハッシュ値+スクリプト」ではなく「公開鍵+スクリプト」となっている
  • 初期の頃は公開鍵が直接ScriptPubKeyに使われていたということがわかる。


まとめ

P2PKtpP2PKHの違いはScriptPubKeyが公開鍵か公開鍵ハッシュを含んでいるかが大きな違いであることがわかった。

しかし以下の文章については疑問が残る。P2PKHの採用が量子コンピュータへの対策に繋がるとのことだがなぜそう言えるのだろうか?現在調査中なのでわかり次第追記したい。

  • 楕円曲線暗号(公開鍵秘密鍵 に使われれている暗号)が、楕円曲線上の離散対数問題を解くために改良されたショアのアルゴリズムによって解かれてしまうから。簡単に言うとそれが意味するのは、理論上、量子コンピューターがそう遠くない未来に 公開鍵から秘密鍵を導出できてしまう ということだ。ビットコインを使うときだけ公開鍵を公開することによって、そういった攻撃を無力化することができる(一度使われたビットコインアドレスを二度と使わない前提だが)。