Singularity HIVE 勉強会
Hyperledger Hands-on
ブロックを作って、チェーンでつないで、理解しよ
う!
木村 桂
趣味: マンホール
マンホールマップ : http://manholemap.juge.me/
本日お話しするもの - Hyperledger
Projecthttps://www.hyperledger.org/
オープンソースによるブロックチェーン実装プロジェクト
特に本日扱うのは以下の2プロジェクト:
-Hyperledger Fabric : ブロックチェーン基盤
-Hyperledger Composer : 開発ツール
今日お伝えしたいこと
• ブロックチェーンを使った上でただしく理解してほしい
• ブロックチェーンはどんな用途に向くのか/向かないのか、そ
れは何故か、を考えるために必要な知識を付けて欲しい
• 仮想通貨以外のブロックチェーン利用用途
• (エンジニアとして)自分だったらブロックチェーンでどんな
ものを作ってみたいか、を考えるための基礎を身に付けてほし
い
アジェンダ
• 「ブロックチェーン」とは?
• 「ブロック」と「チェーン」
• 改ざんが難しい理由
• ブロックチェーンを体験する
• ブロックが次々に繋がる様子を実際に体験する
• パブリック/プライベート/コンソーシアム
• Hyperledger Composer Playground で開発体験
「ブロックチェーン」?
セキュリティ
分散台帳
非中央集権
コンセンサス・アルゴリズム
ビットコイン
改ざん困難
仮想通貨
ブロックチェーンネットワーク
台帳 A
台帳 B
台帳 C
台帳
D
台帳 E
台帳 F
台帳
台帳
台帳 台帳
台帳
台帳
管理台帳
YES
YES
YES
YES
YES
NO
(従来の台帳管理)
分散台帳ネットワーク
コンセンサス
ブロックチェーンによる台帳管理
YES
非中央集権
ハッシュ関数/ハッシュ値
• 文字列や画像などのデータを「一定の法則で」短く作り直したもの
• 作り直す過程を処理する部分を「ハッシュ関数」と呼ぶ
• 作り直した結果の文字列を「ハッシュ値」と呼ぶ
• 入力情報が大きくても小さくても、同じ長さの文字列が実行結果として得ら
れる
• 同じ入力情報に対しては、再度実行しても同じ結果になる(乱数ではない)
• 実行結果から入力情報を逆計算することは(ほぼ)不可能あいうえお
かきくけこ
さしす・・
16A2BED0 ・・・・・・・ EE5  (
ハッシュ値)
22EA289C ・・・・・・・ CES  (ハ
ッシュ値)
3D3D0CC9 ・・・・・・・ 56C  (
ハッシュ値)
ハ
ッ
シ
ュ
関
数
(文字列)
(テキストファイル)
(画像ファイル)
ブロックチェーンにおける「ハッシュ値
」
• ブロックチェーンに格納するデータのフォーマットを決めて、
そのフォーマットに対するハッシュ値を計算する
格納したいデータ
整数
1つ前のブロックのハッシュ値
上記3データから生成したハッシ
ュ値
ブロック内のデータは必ずこの形にする
必ず1つ前のブロックのハッシュ値を
持つ
nonce と呼ばれる整数値
1 つ前のブロックのハッシュ値と、格納
データと、 nonce 値3つから生成した
ハッシュ値
「ブロック」と「チェーン」によるデー
タ格納
ブロック0
0JEEICIS1…
ブロック1
17YFFO327…
0JEEICIS1…
ブロック2
2FJHN7WC8…
17YFFO327…
ブロック3
3TVUNIERC…
2FJHN7WC8…
1つ前のブロックのハッ
シュ値
1つ前のブロックのハッシュ値と、
自分が持っている値と、
nonce から生成したハッシュ値
(ハッシュ
値)
ブロックチェーンにおける「マイニング
」
• ブロックチェーンに格納するデータのハッシュ値に条件を付与
することがある
格納したいデータ
整数
1つ前のブロックのハッシュ値
上記3データから生成したハッシ
ュ値
ハッシュ値は必ず "000" で始まる、という条件を付与する = この条件を求める nonce をしらみつぶしに調べる
nonce が 1 の場合のハッシュ値を計算
する
計算結果のハッシュ値が(例えば)
"000" で始まっていれば採用する。
"000" 以外で始まっていたら nonce を
1つ増やして再びハッシュ値を求める
。
これを繰り返す。
マイニング(発掘)
ブロックチェーンを改ざん(不正に書き換え)す
るには
0JEEICIS1…
0JEEICIS1…
17YFFO327…
17YFFO327…
2FJHN7WC8…
2FJHN7WC8…
矛盾
18YFFO327…
矛盾
18YFFO327…
矛盾
20JHN7WC8…
矛盾
20JHN7WC8…
多数決で矛盾
過半数ノード内の各ブロックの値を同時に書き換える必要があり、
これは事実上不可能
ブロックチェーン内に格納されたデータは
第三者に改ざんされていない真実のデータである
という保証がある
ブロックチェーンはデータベースの代わりになる
か?
当面は無理
ブロックチェーンだけではデータの検索が困難
ユーザー A を追加
ユーザー B を追加
ユーザー B を更新
ユーザー C を追加
・ユーザー A の最新情報を取り出す
・ユーザーの一覧を取得する
・ ・・・
ユーザー C を削除
ブロックチェーンを最初から
最後までたどらないとわからない
ステート DB の併用
• ブロックチェーンを格納するサーバーノード(ピア)とは別に
データベースを併用する。
• このデータベースは既存のものを使ってもよいが、ステート DB
と呼ばれるデータベースを使うとセキュアにデータを格納でき
る。
ステート
DB
ステート DB 自体は一般的なデータベースと同様に使える。
ステート DB にはブロックチェーンを経由しないとアクセスできない。
データ自体はステート DB で管理し、そのトランザクション記録を
ブロックチェーンに残すことで、ステート DB の改竄が困難になる。
ステート DB ブロックチェーン
ユーザー A を追加する ユーザー A の情報を追加 「ユーザー A を追加した」という記録を追加
ユーザー A がログイン ユーザー A のログイン記録を更
新
「ユーザー A がログインした」という記録を
追加
ユーザー A を削除する ユーザー A の情報を削除 「ユーザー A を削除した」という記録を追加
ブロックチェーンプラットフォームの向き&
不向き
• 一社独占による弊害脱却
• 共通の仕組みをコミュニティで運用
• 仲介者の省略
• 仲介手数料
• 孫請け、曾孫受け、・・
• 改ざんできないものが記録
• 寄付/贈与/持ち主変更
• 正しく相手に渡っているか?
• 転売防止
• 大量トランザクション
• コンセンサスによる書込みパフォーマンス
• ブロックは消えない(増え続ける、要スト
レージ)
• 既存 DB の代替
• 検索機能はまだ不充分/ロールバック不可
• 「データベースの代替」ではない
• 人手によるオペレーション
• その人は信用できるのか?
• 自動化できないか?
使い分けは「何を重視するか」
非中央集権
実用性
スケーラビリテ
ィ
安全性プライベート型
パ
ブ
リ
ッ
ク
型
コンソーシアム型
コンセンサスによるブロック生成
取引データは世界中に分散
ブロック生成に時間がかかる
コンセンサスアルゴリズム不要(高速)
ブロックチェーンの対改竄性
一組織による管理
高速なコンセンサスアルゴリズム
ブロックチェーンの対改竄性
複数組織による管理
(ハンズオン準備)
Hyperledger Composer Playground
モデル ACLスクリプト メタデータクエリー
アプリケーション
Business Network Archive
(.bna ファイル )
デプロイ
アーカイブ作成
Hyperledger Composer Playground
ブロックチェーンネットワーク (Hyperledger Fabric)
どんなユーザーが
どんな商品を
どんなトランザクションを
どんな権限で
どういう条件で選択して
Hyperledger Composer Playground 体験
(0)
献血
A
A
×
以下の処理をブロックチェーンで管理
- 血液を登録し、持ち主を変更する
- 参加者 : 人
- 取り扱う商品 : 血液
- 同じ血液型のユーザー同士で交換可能
H - アッシュ - 仮想通貨 BLOOD と AI になった歌姫
(参考文献)
Hyperledger Composer Playground 体験
(1)
https://composer-playground.mybluemix.net/
シークレットモード
Windows: Ctrl+Shift+N(Chrome)
Ctrl+Shift+P(FireFox)
MacOS: Command+Shift+N(Chrome)
Hyperledger Composer Playground 体験
(2)
"empty-business-network" を選択
my-first-network
(説明)
admin@my-first-network
Hyperledger Composer Playground 体験
(3)
Hyperledger Composer Playground 体験
(4)
Hyperledger Composer Playground 体験
(5)
# My First Network
はじめての Hyperledger Composer Playground
## Copyright
2019 K.Kimura all rights reserved.
コピペ用参照 https://bit.ly/2Aj4pK0
Hyperledger Composer Playground 体験
(6)
Hyperledger Composer Playground 体験
(7)
Hyperledger Composer Playground 体験
(8)
namespace org.bmxgg
// 人
participant User identified by id{
o String id
o String name
o String type
}
// モノ
asset Blood identified by id{
o String id
o String user_id
o String type
o Integer amount
}
// トランザクション
transaction ChangeOwner{
o String blood_id
o String user_id
}
コピペ用参照 https://bit.ly/2M11XZZ
Hyperledger Composer Playground 体験
(9)
Hyperledger Composer Playground 体験
(10)
Hyperledger Composer Playground 体験
(11)
Hyperledger Composer Playground 体験
(12)const NS = 'org.bmxgg';
/**
* Transfer Processer
* @param {org.bmxgg.ChangeOwner} tx- transaction parameters.
* @transaction
*/
async function transfer(tx){
const blood_id = tx.blood_id;
const user_id = tx.user_id;
try{
if( user_id != '' ){
const pr = await getParticipantRegistry( NS + '.User' );
const exists = await pr.exists( user_id );
if( !exists ){
throw new Error( 'User does NOT exist! ID: ' + user_id );
}
const user = await pr.get( user_id );
const ar = await getAssetRegistry( NS + '.Blood' );
const blood = await ar.get( blood_id );
if( blood.type != user.type ){
throw new Error( 'Blood types NOT matched.' );
}else{
blood.user_id = user_id;
await ar.update( blood );
}
}else{
throw new Error( 'user_id NOT specified.' );
}
}catch( err ){
throw new Error( err );
}
}
コピペ用参照 https://bit.ly/2K7IhSj
Hyperledger Composer Playground 体験
(13)
Hyperledger Composer Playground 体験
(14)
Hyperledger Composer Playground 体験
(15)
{
"$class": "org.bmxgg.User",
"id": "1001",
"name": " きむら ",
"type": "A"
}
$class は既定値。
id と name と type を指定する。
Hyperledger Composer Playground 体験
(16)
同じ作業を繰り返して、 User を3名以上登録する。
ただし、うち2名は同じ Type 、1名は異なる Type で。
Hyperledger Composer Playground 体験
(17)
ユーザー ID と Type をメモしておく
A 型
 きむら (1001)
 すずき (1002)
B 型
 たなか (1003)
Hyperledger Composer Playground 体験
(18)
Hyperledger Composer Playground 体験
(19)
{
"$class": "org.bmxgg.Blood",
"id": "2001",
"user_id": "1001",
"type": "A",
"amount": 400
}
作成した user_id と、
そのユーザーの type を指定する。
amount は適当な数字
↓
きむら (1001) の血液 400 ml
Hyperledger Composer Playground 体験
(20)
Type A の Blood が 400 登録された
Hyperledger Composer Playground 体験
(21)
User と Blood が登録された内容がトランザクションとして
ブロックチェーンに登録されている
Hyperledger Composer Playground 体験
(22)
作成した blood_id と、
新しいユーザーの user_id を指定する
{
"$class": "org.bmxgg.ChangeOwner",
"blood_id": "2001",
"user_id": "1002"
}
↓
2001 の(ユーザー 1001 の)
400 ml の血液を
ユーザー 1002 のものに変更する
Hyperledger Composer Playground 体験
(23)
ChangeOwner が実行された記録がトランザクションとして
ブロックチェーンに登録されている
Hyperledger Composer Playground 体験
(24)
既存 Blood の user_id が 1002 に書き換わった = 持ち主が変わった!
Hyperledger Composer Playground 体験
(25)
試しに Type が異なるユーザーの
user_id を指定して実行してみる
{
"$class": "org.bmxgg.ChangeOwner",
"blood_id": "2001",
"user_id": "1003"
}
「血液型が不一致」エラー
↓
2001 の(ユーザー 1002 の)
400 ml の血液を
ユーザー 1003 のもの変更できない
Hyperledger Composer Playground 体験
(26)
ここまでに作成したビジネスネットワーク定義ファイルをダウンロードして保存
今日お伝えしたかったこと
ブロックチェーンを使った上でただしく理解してほしい
×  セキュアなデータベース
○  改ざんが困難なデータベース
ブロックチェーンはどんな用途に向くのか/向かないのか、そ
れは何故か、を考えるために必要な知識を付けて欲しい
「改ざんが困難」 → 管理者でも改ざんできないデータ → 本物の
保証
(エンジニアとして)自分だったらブロックチェーンでどんな
ものを作ってみたいか、を考えるための基礎を身に付けてほし
い

More Related Content

PDF
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
PDF
メディア芸術基礎 II Canvas + Javascriptで図形を描く
PDF
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
PDF
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
PPTX
背景にCanvasを動かす
PDF
これからのJavaScriptの話
PDF
Qt Creator を拡張する
PDF
情報編集(Web) HTML5 実践1 Canvas + Javascriptで図形を描く
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
メディア芸術基礎 II Canvas + Javascriptで図形を描く
Webデザイン 第10回:HTML5実践 Three.jsで3Dプログラミング
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
背景にCanvasを動かす
これからのJavaScriptの話
Qt Creator を拡張する
情報編集(Web) HTML5 実践1 Canvas + Javascriptで図形を描く

What's hot (20)

PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
PPTX
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
PDF
TypeScript 1.0 オーバービュー
PDF
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
KEY
Cocos2d Shaders
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
PPTX
Javaで簡単にgpgpu aparapi
PDF
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
PDF
Kernel fcache-bug
PDF
BMXUG ブロックチェーンハンズオン 20190622
PPTX
Stream2の基本
PDF
Memory sanitizer
PDF
大(中)規模Java script開発について
PDF
Pythonで画面付きのアプリを作成する
PDF
WebGL and Three.js
PDF
Three.jsで3D気分
PDF
GPUをJavaで使う話(Java Casual Talks #1)
PDF
Objective-C のキャストと Swift の型変換を比べてみる #akibaswift
PDF
大阪Node学園 六時限目 「generator小咄」
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
TypeScript 1.0 オーバービュー
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Cocos2d Shaders
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
Javaで簡単にgpgpu aparapi
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
Kernel fcache-bug
BMXUG ブロックチェーンハンズオン 20190622
Stream2の基本
Memory sanitizer
大(中)規模Java script開発について
Pythonで画面付きのアプリを作成する
WebGL and Three.js
Three.jsで3D気分
GPUをJavaで使う話(Java Casual Talks #1)
Objective-C のキャストと Swift の型変換を比べてみる #akibaswift
大阪Node学園 六時限目 「generator小咄」
Ad

Similar to Hyperledger Hands-on 2019-03-30 @ Singularity HIVE (20)

PDF
マイクロサービス時代の生存戦略 with HashiCorp
PDF
ブロックチェーン体験 「ブロックを作って、チェーンでつないで、理解しよう!」
PDF
Node.jsでブラウザメッセンジャー
PDF
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
PDF
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
PPTX
イベント駆動プログラミングとI/O多重化
PPTX
DApps のユーザ認証に web3.eth.personal.sign を使おう!
PDF
おまえらこのライブラリ使ってないの? m9 (2013-07)
PDF
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
PDF
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
PDF
(きっと)あなたにも出来る!Hyperledger composer でブロックチェーンアプリを動かしてみた
PDF
(きっと)あなたにも出来る!Hyperledger Composer でブロックチェーンアプリを動かしてみた
PDF
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
PDF
PUN2 × OculusQuest でハンドトラッキング同期実装(プロジェクト公開しました)
PDF
UnityとBlenderハンズオン第2章
PDF
SocketStream入門
PPTX
Inside of excel 方眼紙撲滅委員会 #pyfes
PDF
Blockchain EXE #16:Hyperledger fabricの技術動向とファイナンシャルエンジニアリング視点でのトークンエコノミー|平山 毅...
PDF
OCamlでWebアプリケーションを作るn個の方法
PDF
BMXUG 大阪 ブロックチェーン
マイクロサービス時代の生存戦略 with HashiCorp
ブロックチェーン体験 「ブロックを作って、チェーンでつないで、理解しよう!」
Node.jsでブラウザメッセンジャー
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
イベント駆動プログラミングとI/O多重化
DApps のユーザ認証に web3.eth.personal.sign を使おう!
おまえらこのライブラリ使ってないの? m9 (2013-07)
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
恐怖!シェルショッカーの POSIX原理主義シェルスクリプト
(きっと)あなたにも出来る!Hyperledger composer でブロックチェーンアプリを動かしてみた
(きっと)あなたにも出来る!Hyperledger Composer でブロックチェーンアプリを動かしてみた
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
PUN2 × OculusQuest でハンドトラッキング同期実装(プロジェクト公開しました)
UnityとBlenderハンズオン第2章
SocketStream入門
Inside of excel 方眼紙撲滅委員会 #pyfes
Blockchain EXE #16:Hyperledger fabricの技術動向とファイナンシャルエンジニアリング視点でのトークンエコノミー|平山 毅...
OCamlでWebアプリケーションを作るn個の方法
BMXUG 大阪 ブロックチェーン
Ad

More from K Kimura (20)

PPTX
Introducing my personal / original CAPTCHA implement
PPTX
ThinkPad を自慢できると聞いてやってきました
PPTX
IBM FamilyDay 2022 - 帰ってきた LINE 手描きスタンプ
PPTX
「プライベート版 Heroku」の "dokku" は Cloud Foundry 代替としてどこまで使えるか?
PPTX
LINE お絵描きスタンプが NFT 対応するかも
PDF
ICFO2021 コロナ時代のオンラインハンズオン体験
PPTX
IBM Family Day 2020 - LINE で手描きスタンプに挑戦!
PPTX
マンホールマップ10周年 20200725
PPT
MashupAward6 Manholemap(2010)
PPT
スライドパズルハンズオン資料
PPTX
ユーザー投稿型位置情報プロットシステム - マンホールマップ
PPT
Scratch でゲームプログラミング
PPTX
空耳アワーマシーンを作ってみた
PPTX
生まれ変わるマンホールマップ
PPT
地図データでレースゲームを作って遊ぼう!
PPT
AI先生と外国語会話を練習しよう!
PPTX
IBM Watson IoT を用いた遠隔ゲームコントローラーと Node-RED による簡易カスタマイズによる実現
PPT
「テトリスを作ってスマホで振って遊ぼう!」ハンズオン資料
PPT
LINE お絵描きアプリハンズオン 20190519
PPT
LINE お絵描きハンズオン 2019.04.26
Introducing my personal / original CAPTCHA implement
ThinkPad を自慢できると聞いてやってきました
IBM FamilyDay 2022 - 帰ってきた LINE 手描きスタンプ
「プライベート版 Heroku」の "dokku" は Cloud Foundry 代替としてどこまで使えるか?
LINE お絵描きスタンプが NFT 対応するかも
ICFO2021 コロナ時代のオンラインハンズオン体験
IBM Family Day 2020 - LINE で手描きスタンプに挑戦!
マンホールマップ10周年 20200725
MashupAward6 Manholemap(2010)
スライドパズルハンズオン資料
ユーザー投稿型位置情報プロットシステム - マンホールマップ
Scratch でゲームプログラミング
空耳アワーマシーンを作ってみた
生まれ変わるマンホールマップ
地図データでレースゲームを作って遊ぼう!
AI先生と外国語会話を練習しよう!
IBM Watson IoT を用いた遠隔ゲームコントローラーと Node-RED による簡易カスタマイズによる実現
「テトリスを作ってスマホで振って遊ぼう!」ハンズオン資料
LINE お絵描きアプリハンズオン 20190519
LINE お絵描きハンズオン 2019.04.26

Recently uploaded (12)

PDF
aidetailseminor111用語解説を徹底的にしまくります。20250814
PDF
2508slide_townobuse_nagano_chohoobuse.pdf
PDF
sustainability_MSOLサステナビリティレポート_202508_日本語版_完成版.pdf
PDF
【2507】インパクト共創室実績
PDF
RailsエンジニアのためのActive Recordの基礎から学ぶ実践的DB連携
PDF
202508株式会社なぞるマーケティング組織開発・学習支援サービス_概要資料
PDF
【会社紹介資料】株式会社スキルアップ ~エンジニア第一主義!収入・働きやすさ・成長機会でトップクラスを目指す~ 高収入を実現する還元モデル × 自分で選べ...
PDF
東京商工会議所荒川支部で中小企業講演「今日から使える!省力化・効率化に向けた生成AI活用入門」
PDF
AIゲートウェイ、グローバルトップ12企業のランキングと市場シェア2025.pdf
PDF
2508_ インパクトレポート会社概要_雨風太陽
PDF
世界化学品産業の市場動向と将来展望に関する包括的な調査研究 QYResearch
PPTX
だれでもサクッと使える!採用ピッチ資料テンプレート(解説付き)_20230529_ver1.pptx
aidetailseminor111用語解説を徹底的にしまくります。20250814
2508slide_townobuse_nagano_chohoobuse.pdf
sustainability_MSOLサステナビリティレポート_202508_日本語版_完成版.pdf
【2507】インパクト共創室実績
RailsエンジニアのためのActive Recordの基礎から学ぶ実践的DB連携
202508株式会社なぞるマーケティング組織開発・学習支援サービス_概要資料
【会社紹介資料】株式会社スキルアップ ~エンジニア第一主義!収入・働きやすさ・成長機会でトップクラスを目指す~ 高収入を実現する還元モデル × 自分で選べ...
東京商工会議所荒川支部で中小企業講演「今日から使える!省力化・効率化に向けた生成AI活用入門」
AIゲートウェイ、グローバルトップ12企業のランキングと市場シェア2025.pdf
2508_ インパクトレポート会社概要_雨風太陽
世界化学品産業の市場動向と将来展望に関する包括的な調査研究 QYResearch
だれでもサクッと使える!採用ピッチ資料テンプレート(解説付き)_20230529_ver1.pptx

Hyperledger Hands-on 2019-03-30 @ Singularity HIVE

Editor's Notes

  • #19: localStorage.clear() Ctrl + Shift + N Command + Shift + N