Wait a moment...

【NEM技術勉強会】6. トランザクション 6.1 ベーシックトランザクション【Symbol白書】

nem134xem (5)
463
2
2020-02-11 08:34:24
【NEM技術勉強会】6. トランザクション 6.1 ベーシックトランザクション【Symbol白書】

カタパルトから、アグリゲートトランザクションが導入されました。複数のトランザクションをまとめて「アトミック」つまり、それ以上分割できない単位として取り扱うことで、複雑な処理を安全におこなうというコンセプトです。でも、アグリゲートトランザクションを理解する前に、1つのトランザクションを1つの署名で保証するベーシックトランザクションを理解しましょう。


6. トランザクション

「実際、経済活動というものは大抵、フリードリッヒ・ハイエク(ドイツのノーベル賞経済学者)が言ったとおり、高いトランザクションコストを払っていては達成できない、あるいはトランザクションコストを減らすまたは無くすために個々人が自由な交渉をするような行為なのである。」 - ロナルド・コース(アメリカのノーベル経済学者)

 

トランザクションは、グローバルチェーン(ブロックチェーン全体)の状態を変更する命令である。それらはアトミック(分割不能単位)として処理され、それが集積したものがブロックに書き込まれる。トランザクションの一部でも処理に失敗した場合、グローバルチェーンの状態は、トランザクション試行前の状態にリセットされる。


トランザクションには、ベーシックトランザクションとアグリゲートトランザクションの2つの基本的なタイプがある。ベーシックトランザクションは単一の操作を表し、単一の署名が必要になる。アグリゲートトランザクションは、複数の署名を必要とする1つ以上のトランザクションのコンテナである。


アグリゲートトランザクションにより、ベーシックトランザクションを複雑な操作が可能な状態に結合し、アトミックに実行できる。これにより、個々のベーシックトランザクションの分割不能性のみを保証する従来のシステムに比べて、開発者の利便性が向上するが、可能な操作が制限される。しかし、(イーサリアムが目指すような)チューリング完全言語や、それに付随する欠点もまた使用せずに済む。開発者は、特殊な新しい言語を習得することなく、コントラクトの実装を開発する必要もない。トランザクションの構成内容が、エラーを頻発すべきではないし、計算機学的に完璧な実装をするよりも、はるかにバグを生じずに済むべきなのである。

 

6.1 ベーシックトランザクション

 

ベーシックトランザクションは、暗号技術的に検証可能なデータと検証不可能なデータの両方で構成される。検証可能なデータはすべて連続して一塊になっており、トランザクション署名者によって署名される。すべての検証不可能なデータは無視されるか(パディングバイトなど)、検証可能なデータから確定的に計算可能なものである。それぞれのベーシックトランザクションは、最低でも1つの署名での検証が必要になる。


検証不可能なヘッダーフィールドは以下のものを含む。Sizeは、トランザクションのバイト数であり、検証可能なトランザクションデータから取得できる。Singatureは、署名行為からの出力であり、検証に必要なデータである。SignerPublicKey(署名者の公開鍵)は、署名と検証の両方に必要である。トランザクションTが署名を用いた検証に合格するには、SignatureSignerPublicKeyの両方が、Sizeによって規定される長さを持つ、検証可能データを用いた計算結果と一致する必要がある。

検証作業は、3.2 署名と検証で出てきた手順どおり、署名(RとS)と公開鍵を使って、トランザクションの内容(Verifiable Data Buffer)をチェックします。

 

予約(Reserved)バイトは、すべての整数フィールドと暗号関連文字列が自然なアライメントを保つように、トランザクションの整形(8バイトの桁揃え)に使用される。これらのバイトは意味を持たないため、暗号化によるセキュリティーを保ったまま無視できる。

 

すべてのトランザクションタイプのバイナリレイアウトは、Symbolのオープンソーススキーマ言語で指定されている(脚注;スキーマについてはhttps://github.com/nemtech/catbufferで見ることができる)。最新の仕様については、公開されているスキーマを参照。

 

図8:ベーシックトランザクションのバイナリーレイアウト

V, N, Tはそれぞれ(V)ersion, (N)etwork, (T)ypeを表す。スペースの関係で省略。


import "entity.cats"

# binary layout for a transaction
struct Transaction
	inline SizePrefixedEntity
	inline VerifiableEntity
	inline EntityBody

	# transaction fee
	fee = Amount

	# transaction deadline
	deadline = Timestamp

# binary layout for an embedded transaction header
struct EmbeddedTransactionHeader
	inline SizePrefixedEntity

	# reserved padding to align end of EmbeddedTransactionHeader on 8-byte boundary
	embeddedTransactionHeader_Reserved1 = uint32

# binary layout for an embedded transaction
struct EmbeddedTransaction
	inline EmbeddedTransactionHeader
	inline EntityBody

カタパルトオープンスキーマ言語で書かれたトランザクションのバイナリー構造の一部。これだけ見てもよくわからないですが、8の倍数バイトの単位でデータの区切りが出てくるようにReservedが配置されて、図8の構造体が定義されているっぽいことがわかります。

 

複雑に見えるトランザクションも、本体は16進数で書かれた数字の列です。この数字の列から必要な数値や文字列を読み出して検証をおこなうために、形式が厳密に定義されています。この公開されている定義を使えば、カタパルトのサーバーを使わなくても、トランザクションを検証することが可能です。

 

目指せ北海道

Comment
目指せ北海道
目指せ北海道
2020-02-11 18:04:31ID:173112

>>やそ::さん

僕も最初は原子的と訳してましたが、辞書で語源が「分割できない」というギリシャ語だと知り、ようやく腑に落ちました。英語は奥が深い。

やそ
やそ
2020-02-11 14:32:20ID:173095

アトミックって原子のアトムからのそういう意味で使われてたんですね!ようやく腑に落ちました!

この記事を書いた人
趣味はバイクでツーリングしながら、ブログを書いたり、動画配信したりすること。 ラズパイをバイクに積載して、ボタン一つでYoutubeライブ配信できるシステムを作りました。それを発展させて、XEMの価格を常時監視、取引するボットも作って活用してます。子供の頃から技術書を読むのが好きなので、NEMの技術文書を訳したりもしています。 本業は再生医療研究者です。歯の神経の中にいる「歯髄(しずい)細胞」を活用して新しい医療を開拓するために、しずい細胞プロジェクトを推進中。細胞の流通(トレーサビリティー)管理にNEMを使おうと思ってmijin v.2を導入したんですが、コロナで実用化が全然進みません。管理システムの名称は「ShizuiNet」。