NEOブロックチェーン(4) - スマートコントラクト実行

NEOはブロックチェーンプロジェクトの1つです。

今回はスマートコントラクトを実行してみます。

スマートコントラクト実行フロー

スマートコントラクトを実行するフローは次のようになります。

  1. pythonでコードを書く。
  2. buildコマンドでpyファイルをコンパイルし、avmファイルを作成する。
  3. sc deployコマンドでコントラクト(avmファイル)をネットワークにデプロイする。
  4. sc invokeコマンドでコントラクトのメソッドをコールする。

1. コーディング

所定のディレクトリに移動し、pythonファイルを作成します。

[コマンド]

1
2
cd ./neo-local/smart-contracts
vi test1.py

[ソース]

test1.py
1
2
def Main():
print("Hello World")

“Hello World”と表示するだけの簡単な処理となります。

2. コンパイル

neo-localを起動し、neo-pythonプロンプト起動します。

[コマンド]

1
2
cd ..
sudo make start

スマートコントラクトのログを表示する設定を行います。

[コマンド]

1
config sc-events on

[結果]

1
Smart contract event logging is now enabled

pyファイルをコンパイルします。

[コマンド]

1
sc build /smart-contracts/test1.py

[結果]

1
Saved output to /smart-contracts/test1.avm

正常にコンパイルできるとsmart-contractsディレクトリ配下にtest1.avmが作成されます。

3. デプロイ

デプロイを行うためにはウォレットが必要となりますので、ウォレットを開いておきます。

パスワードはcozです。

[コマンド]

1
wallet open neo-privnet.wallet

[結果]

1
2
[password]> ***
Opened wallet at neo-privnet.wallet

deployコマンドを使ってavmファイルをデプロイします。

いくつか入力を求められますが、[contract name]にはtest1を指定し、そのほかは何も入力しないでエンターを押します。

パスワードはcozです。

[コマンド]

1
sc deploy /smart-contracts/test1.avm True False False 07 05

引数の意味は、順番に次の通りです。

  • True コントラクトがストレージを使うかどうか(needs_storage)
  • False 他のコントラクトを参照するかどうか(needs_dynamic_invoke)
  • False コントラクト内でNEOやNEOGas、他のトークンとの換金が行われるか(is_payable)
  • 07 inputがstring型である
  • 05 outputがbyte型がである

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Please fill out the following contract details:
[Contract Name] > test1
[Contract Version] >
[Contract Author] >
[Contract Email] >
[Contract Description] >
Creating smart contract....
Name: test1
Version:
Author:
Email:
Description:
Needs Storage: True
Needs Dynamic Invoke: False
Is Payable: False
{
"hash": "0x5f21886e9c5674ef65f3ba787c45c7a4957621cd",
"script": "53c56b0b48656c6c6f20576f726c64680f4e656f2e52756e74696d652e4c6f67006c7566",
"parameters": [
"String"
],
"returntype": "ByteArray"
}
[I 210620 01:22:44 EventHub:58] [test_mode][SmartContract.Contract.Create] [5f21886e9c5674ef65f3ba787c45c7a4957621cd] {'type': 'InteropInterface', 'value': {'version': 0, 'hash': '0x5f21886e9c5674ef65f3ba787c45c7a4957621cd', 'script': '53c56b0b48656c6c6f20576f726c64680f4e656f2e52756e74696d652e4c6f67006c7566', 'parameters': ['String'], 'returntype': 'ByteArray', 'name': 'test1', 'code_version': '', 'author': '', 'email': '', 'description': '', 'properties': {'storage': True, 'dynamic_invoke': False, 'payable': False}}}
[I 210620 01:22:44 EventHub:58] [test_mode][SmartContract.Execution.Success] [d3e19bd3d6b90ea7af5c8fa0681aed5c8ac9bb71] {'type': 'Array', 'value': [{'type': 'InteropInterface', 'value': {'version': 0, 'hash': '0x5f21886e9c5674ef65f3ba787c45c7a4957621cd', 'script': '53c56b0b48656c6c6f20576f726c64680f4e656f2e52756e74696d652e4c6f67006c7566', 'parameters': ['String'], 'returntype': 'ByteArray', 'name': 'test1', 'code_version': '', 'author': '', 'email': '', 'description': '', 'properties': {'storage': True, 'dynamic_invoke': False, 'payable': False}}}]}
Used 500.0 Gas

-------------------------------------------------------------------------------------------------------------------------------------
Test deploy invoke successful
Total operations executed: 11
Results:
[<neo.Core.State.ContractState.ContractState object at 0x7f5da0a520b8>]
Deploy Invoke TX GAS cost: 490.0
Deploy Invoke TX Fee: 0.0
-------------------------------------------------------------------------------------------------------------------------------------

Enter your password to continue and deploy this contract
[password]> ***
[I 210620 01:23:56 Transaction:619] Verifying transaction: b'8d4eb06e2f3344c961b20e87fb89c879449ee4e58961f15e27042d9ff8a3d85b'
[I 210620 01:23:57 EventHub:62] [SmartContract.Verification.Success][2843] [9b0ab1768245bae9dd09ff3231acf1667a6aae3d] [tx 8d4eb06e2f3344c961b20e87fb89c879449ee4e58961f15e27042d9ff8a3d85b] {'type': 'Array', 'value': [{'type': 'Boolean', 'value': True}]}
Relayed Tx: 8d4eb06e2f3344c961b20e87fb89c879449ee4e58961f15e27042d9ff8a3d85b

ネットワークにコンストラクトが反映されるまで少し時間が必要となりますので、少々待ちます。

デプロイしたコントラクトを確認します。

引数にはデプロイ時に指定した[contract name] test1を指定します。

[コマンド]

1
search contract test1

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Found 1 results for test1
{
"version": 0,
"hash": "0x5f21886e9c5674ef65f3ba787c45c7a4957621cd",
"script": "53c56b0b48656c6c6f20576f726c64680f4e656f2e52756e74696d652e4c6f67006c7566",
"parameters": [
"String"
],
"returntype": "ByteArray",
"name": "test1",
"code_version": "",
"author": "",
"email": "",
"description": "",
"properties": {
"storage": true,
"dynamic_invoke": false,
"payable": false
}
}

4行目の”hash”は、コンストラクトを実行するときに必要となります。

4. 実行

デプロイしたコントラクトを実行します。

引数にはsearchコマンドで表示したhashを指定します。

パスワードはcozです。

[コマンド]

1
sc invoke 0x5f21886e9c5674ef65f3ba787c45c7a4957621cd

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
neo> sc invoke 0x5f21886e9c5674ef65f3ba787c45c7a4957621cd                                                               
[I 210620 01:29:21 EventHub:58] [test_mode][SmartContract.Runtime.Log] [5f21886e9c5674ef65f3ba787c45c7a4957621cd] {'type': 'String', 'value': 'Hello World'}
[I 210620 01:29:21 EventHub:58] [test_mode][SmartContract.Execution.Success] [5f21886e9c5674ef65f3ba787c45c7a4957621cd] {'type': 'Array', 'value': [{'type': 'ByteArray', 'value': bytearray(b'')}]}
Used 0.016 Gas

-------------------------------------------------------------------------------------------------------------------------------------
Test invoke successful
Total operations: 11
Results [{'type': 'ByteArray', 'value': ''}]
Invoke TX GAS cost: 0.0
Invoke TX fee: 0.0001
-------------------------------------------------------------------------------------------------------------------------------------

Enter your password to continue and deploy this contract
[password]> ***
[I 210620 01:29:25 Transaction:619] Verifying transaction: b'db800ab02631ae8fd05b1676eb14b8fe688acbae8191145459a8677ec6694750'
[I 210620 01:29:25 EventHub:62] [SmartContract.Verification.Success][3166] [b2348581314004c5ab7183174a6d021c84c881fa] [tx db800ab02631ae8fd05b1676eb14b8fe688acbae8191145459a8677ec6694750] {'type': 'Array', 'value': [{'type': 'Boolean', 'value': True}]}
Relayed Tx: db800ab02631ae8fd05b1676eb14b8fe688acbae8191145459a8677ec6694750

結果に’Hello World’(2行目)が表示されていることが確認できます。

また4行目の「Used 0.016 Gas 」よりGasが0.016消費されたことが分かります。

NEOブロックチェーン(3) - walletの操作

NEOはブロックチェーンプロジェクトの1つです。

今回はwalletの操作を試してみます。

walletの準備

まずはチュートリアル用に十分なGASが入ったwalletをローカル環境にインストールします。

[コマンド]

1
2
cd ./neo-local/wallets
curl -O https://s3.amazonaws.com/neo-experiments/neo-privnet.wallet

上記コマンドで、neo-privnet.walletというファイルがダウンロードされます。

walletの操作

neo-pythonのプロンプトを起動します。

[コマンド]

1
2
cd ..
sudo make start

neo-pythonのプロンプトが起動されると「neo>」が表示されます。

ダウンロードしたwalletを開けます。

パスワードは「coz」です。

[コマンド]

1
wallet open neo-privnet.wallet

[結果]

1
2
[password]> ***                                                                                                         
Opened wallet at neo-privnet.wallet

次に、walletの中身を確認します。

[コマンド]

1
wallet

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[I 210619 00:24:52 UserWallet:480] Script hash b'#\xba\'\x03\xc52c\xe8\xd6\xe5"\xdc2 39\xdc\xd8\xee\xe9' <class 'bytes'>
Wallet {
"path": "neo-privnet.wallet",
"addresses": [
{
"version": 0,
"address": "AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
"script_hash": "e9eed8dc39332032dc22e5d6e86332c50327ba23",
"frozen": false,
"votes": [],
"balances": [
{
"asset": "0xc56f33fc6ecfcd0c225c4ab356fee59390af8560be0e930faebe74a6daff7c9b",
"value": "100000000.0"
},
{
"asset": "0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7",
"value": "1808.0"
}
],
"is_watch_only": false
}
],
"height": 1401,
"percent_synced": 100,
"synced_balances": [
"[NEO]: 100000000.0 ",
"[NEOGas]: 1808.0 "
],
"public_keys": [
{
"Address": "AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y",
"Public Key": "031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a"
}
],
"tokens": [],
"claims": {
"available": "0.0",
"unavailable": "4696.0"
}
}

NEOとGasが入ったWalletであることが確認できます。(27-28行目)

次回は、簡単なスマートコントラクトを実行してみます。

NEOブロックチェーン(2) - neo-localインストール

NEOはブロックチェーンプロジェクトの1つです。

neo-localは、自身のPCやサーバ上にすぐにNEOブロックチェーンを展開できるツールです。

neo-localのサービス

neo-localは、次のサービスで構成されます。

サービス内容
neo-local-faucet開発用フォーセット
neo-privatenetローカル実行用のプライベートネット
neo-python開発用CLI
neo-scan-apiブロック参照ツールのAPI
neo-scan-syncブロック参照ツールのブロックチェーンとの同期
postgresneoscan用のデータベース

neo-localを使うと、複数のDockerイメージが展開されます。

neo-localインストールと起動

以下のコマンドを実行し、neo-localのインストールと起動を行います。

初回起動時にDockerイメージをダウンロードしますので、時間がかかります。

[コマンド]

1
2
3
git clone https://github.com/CityOfZion/neo-local.git
cd neo-local.git
sudo make start

正常に起動できると下記のようなログが表示され、neo-pythonのプロンプトが表示されます。

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Pulling neo-cli-privatenet-1 ... done
Pulling postgres ... done
Pulling neo-scan ... done
Pulling neo-python ... done
Pulling neo-faucet ... done
Pulling autoheal ... done
[neo-local] Starting Docker containers...
Creating network "neo-local_inside" with the default driver
Creating network "neo-local_host-exposed" with driver "bridge"
Creating neo-cli-privatenet-1 ... done
Creating postgres ... done
Creating neo-scan ... done
Creating neo-faucet ... done
Creating neo-python ... done
Creating neo-local_autoheal ... done
[neo-local] Waiting for network.....................
[neo-local] Network running! 🎉
[neo-local] Attaching terminal to neo-python client

Open wallet (password: 'coz'): wallet open neo-privnet.wallet
Test smart contract: sc build_run /smart-contracts/wake_up_neo.py True False False 07 05 main

Privatenet useragent '/Neo:2.10.2/', nonce: 1923845013
[I 210618 22:55:07 Settings:331] Created 'Chains' directory at /root/.neopython/Chains
[I 210618 22:55:07 LevelDBBlockchain:112] Created Blockchain DB at /root/.neopython/Chains/privnet
[I 210618 22:55:07 NotificationDB:73] Created Notification DB At /root/.neopython/Chains/privnet_notif
NEO cli. Type 'help' to get started


neo>

neo-local停止

neo-localを終了するためには、一旦neo-pythonのプロンプトを終了してから、neo-local停止コマンドを実行します。

[コマンド]

1
2
quit
sudo make stop

正常に停止できると下記のようなログが表示されます。

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[neo-local] Stopping Docker containers...
Stopping neo-local_autoheal ... done
Stopping neo-faucet ... done
Stopping neo-python ... done
Stopping neo-scan ... done
Stopping postgres ... done
Stopping neo-cli-privatenet-1 ... done
Removing neo-local_autoheal ... done
Removing neo-faucet ... done
Removing neo-python ... done
Removing neo-scan ... done
Removing postgres ... done
Removing neo-cli-privatenet-1 ... done
Removing network neo-local_inside
Removing network neo-local_host-exposed
[neo-local] Done 🎉

以上で、NEOブロックチェーンを試せる環境が整いました。

次回は、neo-pythonのプロンプトでいろいろとコマンドを実行してみます。

NEOブロックチェーン(1) - 事前準備

NEOはブロックチェーンプロジェクトの1つです。

今回からNEO上での分散型アプリケーション(dApps)を構築するための環境構築と、簡単なスマートコントラクトをPythonで作成する記事を書いていきます。

環境としてUbuntu20.04を想定しています。

事前準備

NEOブロックチェーンを構築するために次の3つが必要となります。

  • Git
  • Docker
  • Docker Compose

Gitインストール

次のコマンドを実行しgitをインストールします。

[コマンド]

1
sudo apt-get install git

インストールが正常に終了したら、以下のコマンドでgitバージョンを確認します。

[コマンド]

1
git --version

[結果]

1
git version 2.25.1

Dockerインストール

Dockerをインストールします。

[コマンド]

1
2
3
4
5
6
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io

インストールが正常に終了したら、以下のコマンドでdockerバージョンを確認します。

[コマンド]

1
sudo docker version

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Client: Docker Engine - Community
Version: 20.10.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:56:38 2021
OS/Arch: linux/amd64
Context: default
Experimental: true

Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:54:50 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: de40ad0

Docker Composeインストール

Docker Composeをインストールします。

[コマンド]

1
2
3
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

インストールが正常に終了したら、以下のコマンドでDocker Composeバージョンを確認します。

[コマンド]

1
docker-compose --version

[結果]

1
docker-compose version 1.29.2, build 5becea4c

以上で事前準備は完了です。

次回は、NEOブロックチェーンを展開できるツールneo-localをインストールします。

ブロックチェーン - ブルーム・フィルタ

ブルーム・フィルタの役割はプライバシー保護

ビットコインは不特定多数の参加者によって利用されているネットワークなので、参加者のプライバシー保護のため、個人を特定されないように工夫されています。

ブルーム・フィルタを使えば、ビットコイン・アドレスがネットワーク上に送信されないため、個人のウォレット・アドレスにも結びつかず、ビットコインを盗み取ろうとする人にアドレスが漏えいしません

ただし検索パターンで取引の検証を行うため、確率的な検証しかできませんし、問い合わせたフルノードのブロックチェーンか改ざんされているかもしれません。

こうした問題に対応するため、ランダムに選択した複数のフル・ノードに問い合わせて集めたマークル・パスを比較することで、目的のトランザクションが特定のブロックに記録されていることを検証できます。

正確性とプライバシー保護のレベル

ブルーム・フィルタと同じハッシュ関数を使えば、特定の入力に対して同じハッシュ値が出力されますので、どのノードで計算しても同じ結果がえられます。

正確性とプライバシー保護のレベルは、ブルーム・フィルタの長さハッシュ関数の個数を調整することで変えられます。

正確性が高まりすぎると特定のビットコイン・アドレスがウォレット内にあることが知られてしまい、プライバシー保護を高めると多数のビットコイン・アドレスがにマッチしてしまい特定できなくなります。

また、特定の検証は相手のビットコイン・アドレスを知っている前提で行われます。

このアドレスを知らないと、理論上送金が確定できず取引できません。

そのため第三者の取引について調べようとすると、フル・ノードを構築してブロックに含まれるトランザクションを読み解く必要があります。

ブロック生成時の指標 - ハッシュパワーとハッシュレート

ハッシュパワーとハッシュレート

マイニングには、ハッシュパワーとハッシュレートという指標があります。

  • ハッシュパワー
    1ブロックの生成に要した時間。
  • ハッシュレート
    1秒間にハッシュ関数で算出されたハッシュ値の数。

ビットコインのハッシュパワーは理論上、1ブロックの生成に10分かかるとしたら1時間で6ブロック生成されることになります。

しかし、実際は1時間ちょうどではなくかなり時間が前後します。

ブロック生成性能の比較

ビットコイン以外の仮想通貨や仮想通貨以外の用途で使われるブロックチェーンでも、ブロック生成の指標としてハッシュパワーとハッシュレートが利用できます。

マイニング・マシーンのブロック生成性能を比較する時によく利用されます。

ただし、これらの指標は異なる仮想通貨やブロック生成アルゴリズム間の比較に利用することはできません。

ブロックチェーン - アニメーションでメカニズムを可視化

ブロックが生成されてブロックチェーンになることを理屈では分かっていても、なかなかイメージしにくいかもしれません。

そのような時はブロックチェーンを可視化するサイトが便利です。

ビットコインのマイニング・トランザクション、ブロックなどの情報を確認できるサイトがあります。

基本的にブロックチェーンを参照したり、マイニング中のブロックの中身をアニメーションにして表示したりしているだけです。

誰でもブロックチェーンの中身を参照することができるのも分散管理台帳の特徴です。

ウェブ・アプリケーション開発のスキルがあればこうしたサイトを自作することも可能です。

ブロックがつながる様子が分かるchainFlyer

ビットコインの多数のトランザクションがブロックとしてマイニングされる様子をアニメーションで確認できるのがchainFlyerです。

chainFlyer

ブロックが生成されてブロックチェーンに追加される様子をイメージ画像でみることができます。

実際のトランザクションがどれくらい生成されているのかをイメージしやすいかと思います。

見ていて面白いBITBonkers!

BITBonkers!でもトランザクションを可視化できます。

BITBonkers!

キューブがブロックでボールがトランザクションになり、サイズが送金額になります。

参加ノードをリアルタイムに把握できるBitnodes

Bitnodesはビットコイン・ネットワークに参加しているノードをリアルタイムに確認できます。

Bitnodes

IPアドレス、国名や都市名を見ることができます。

米国や欧州が特に活発にビットコインを利用していることが見て取れます。

ブロックの中を詳しく調べられるBLOCHCHAIN

特定のブロック番号の詳しい情報を調べたいのであればBLOCHCHAINが便利です。

サイトにアクセスして、右上にあるサーチにブロック番号を入力して検索することができます。

BLOCHCHAIN

概要とハッシュ項目の情報がブロック・ヘッダに相当し、下にあるトランザクション番号が個々の取引履歴に相当します。

ブロック・ヘッダ(概要とハッシュの項目)には前後のブロックのハッシュ値、ブロック高、中継所、難易度、ノンス、バージョンなどのたくさんの情報が見れます。

ブロックチェーンのバージョンアップ

ソフトフォーク(Soft Fork)

ブロックチェーンにブロックを追加するルールを変更したり、厳しくしたりすることによって一時的な分岐が発生することがあります。

これをソフトフォーク(Soft Fork)と呼び、古いルールと新しいルールが混在してマイニングされてしまいます。

新旧のルールはブロックやトランザクションに含まれるバージョン情報で決まります。

新ルールへバージョンアップされていない取引アプリやマイニング・ツールを使ったノードがネットワーク上に残ると、旧ルールのまま取引やマイニングをしようとしてしまい問題が発生します。

過半数のマイナー・ノードが新ルールでマイニングを行うようになると、ブロックチェーンは新ルールで生成されたブロックが追加されていくので、分岐後に旧ルールで伸びたブロックは無効にされてしまいます。

ハードフォーク(Hard Fork)

ブロックチェーンは不正な手段で変更することが難しいですが、訂正を行う際にはハードフォーク(Hard Fork:コア・プログラムの分裂)が発生し手間がかかります。

絶対に間違いのないデータや取引を常に行えるとよいのですが、間違う可能性もあります。

アルトコインの中にはブロックチェーンに特定の権限の与えられたユーザだけが、厳格な規定に基づいてブロックチェーンに変更を与える訂正機能が追加されています。

この機能によってデータの修正、コスト管理、ガバナンスの順守が可能になります。

ブロックチェーンはすでに備わっている機能を利用するだけでなく、設計することによってさまざまな機能を追加できます。

ブロックチェーン - 分散ネットワークのプロトコル

PoWアルゴリズム

Proof of Work(Pow)アルゴリズムは、誰が参加しているか分からない分散ネットワークにおいて、取引の合意形成を可能にするアルゴリズムです。

ビットコインではProof of Workプロトコルが使われています。

Proof of Workプロトコルには、ブロック生成時の難易度設定、ノンス値のフィールドがあります。

このプロトコルには、DoS攻撃やネットワーク上のスパムなどの他のサービスの濫用を抑える手段として次の2つがあります。

①チャレンジ・レスポンス・プロトコル

チャレンジ・レスポンス・プロトコルは、リクエスタ(クライアント)とプロバイダ(サーバ)の間で直接対話型のリンクを担っています。

②ソリューション検証プロトコル

ソリューション検証プロトコルは、リクエスタがソリューションを求める前に問題を自ら課さなければならず、プロバイダは問題の選択と見つかったソリューションの両方を確認しなければなりません。

ブロックチェーンで使われる暗号技術 - ハッシュ値

任意長の文字列から一意に決まる固定長の値

ビットコインにおいてブロックチェーンが事実上、改ざんできないことを保証するときに中心的な役割を果たしているのが1方向性ハッシュ関数です。

ハッシュ関数は任意長の入力メッセージに対して固定長のハッシュ値を出力する決定的関数であり、入力が異なればハッシュ値も異なります。

大きな2つのファイルが同一であるかどうかを判定する際に、全てのデータを比較することは非効率的であるため、それぞれのハッシュ値を比較して効率化を図るといった用途に用いられます。

満たすべき3つの性質

1方向性ハッシュ関数は、ブロック作成時に近道がないことを保証します。

つまり与えられたハッシュ値を持つような入力メッセージを求めることは計算量的に困難であるという性質を持つのです。

暗号で利用されるハッシュ関数は、1方向性を含め、次の3つの性質を満たしていなければなりません。

  • 衝突困難性
  • 原像困難性(1方向性)
  • 第2原像困難性

ハッシュ関数SHA-256

ビットコインで利用しているハッシュ関数はSHA-256と呼ばれるもので、その仕様は米国の連保情報処理標準FIPS180-4に定められています。

ハッシュ値計算の流れ

ハッシュ関数は、任意長の入力メッセージに対して、固定長のハッシュ値を出力します。

また、ハッシュ関数は入力が少しでも異なると出力が全く異なるように設計されています。

つまりメッセージの局所的な違いが全体に伝搬されていくような構成となっています。


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×