ブロックチェーンって何に活用されてる?

yu-memorandum.hatenablog.com

こちらでブロックチェーンがどう言ったものか簡単に説明しました。


では、このデータを管理する技術は何に使われているのでしょうか?

おそらく皆さんが知っているのは仮想通貨。仮想通貨のおかげでブロックチェーンが有名になったくらいなので、電子上の通貨を管理するのに使われています。

仮想通貨のための技術と思われがちですが、ブロックチェーンはデータを管理する技術なので、お金の管理だけに使われているわけではありません。
近年のブロックチェーンの進化は凄まじく、金融以外にも様々な所で活用されてきています。

ブロックチェーン活用の例をいくつか以下に挙げてみます。

➀仮想通貨の流通、管理

ブロックチェーンの歴史は仮想通貨から始まったようなものです。
ネットワーク上で、銀行のような特定の機関を信用せずとも通貨をやり取りするもに使われています。


➁スマートコントラクト(契約の自動実行)

スマートコントラクトは、ブロックチェーン上に取引内容をプログラミングしておくことで、仲介者なしに自動で契約を成立させることができる事です。
これはかなり画期的で、土地の売買、保険などにも活用される動きがあり、それだけでなくゲームにも使われています。(dappsというやつ)
これは、かなり重要なので、別で解説します。


➂権利や資産の管理

通貨だけではなく、他の資産や権利までも管理できます。
これまで、ものや権利を所有していることの証明は、実際に持っているという事実か、政府や自治体、業界団体による承認によってなされていました。
これらの管理が十分ではなかった業界も多かったですが、ブロックチェーンにより、権利や資産などの管理を迅速かつ透明性を担保して行えるようになりました。

例えば、アート作品。正直素人にはゴッホの絵がゴッホが描いた本物だと見分けらません。
超有名美術館のものなら信用できますが、ネットオークションなどで知らない人から買えますか?普通偽物か心配になりますよね。
ブロックチェーンを使えば、持ち主の履歴をブロックチェーン上に残せるので、本物かどうかの信用ができるようになります。(過去に美術館にあった物なら信用できますよね)


➃本人確認、身分証明

国が管理するマイナンバーや戸籍から、Webサービスの会員情報までさまざまなID認証(身分証明)があります。
ブロックチェーン上で管理することで、特定のID管理者は不用となり、個人情報漏えいのリスクも避けることができ、逆に公開してもよい情報を選択し、それらをネットワークで共有することで、1つのIDでさまざまな認証を行うことも可能になります。


色々とみてきたように、ブロックチェーンの素晴らしさは、「信頼」の担保にあります。
分散台帳技術により、不正や改竄ができなくなったことで、従来のビジネスに不可欠だった信頼を担保するための管理者が必要なくなりました。
これによって、今ブロックチェーンは様々な変革を起こしていて、これからも発展する事でしょう。

ブロックチェーンって何?

AI、IoTなどと共にここ数年聞く事が多くなったブロックチェーンのことはご存知ですか?

AIやIoTなどと比べると知名度も低く、何となくでもブロックチェーンを説明できる人は少ないと思います。

まずブロックチェーンを説明する前に二つ確認しておきたい事があります。

ブロックチェーン ≠ 仮想通貨であること

ブロックチェーンは仮想通貨の登場で有名になったと思いますが、ブロックチェーン というのは技術の名前で、仮想通貨はその技術のもとで成り立っている電子上の通貨です。

➁中央集権と非中央集権の意味

中央集権とは、その名の通り一つの所で集中的に管理している事です。例えば銀行であれば、その銀行が集中的に利用者のお金を管理し、送金などを行なっています。我々は銀行を信用しているので、普段何も意識せず大手の銀行を利用していますが、銀行側がやろうと思えばいくらでも自由に使えます。(犯罪ですが,,,,,)
非中央集権はその逆ですね。一つではなく、不特定多数によって管理する事です。


まずは、wikiから見てみましょう。


ブロックチェーンとは、分散型台帳技術または、分散型ネットワークである。

ブロックチェーンが何か分からない状態で、これをみて分かったらもうそれは天才。正直よく分からなくないですか??

僕の中でのブロックチェーンを簡単に説明すると、


非中央集権的に(不特定多数によって)、理論上改竄不可能な暗号技術を使ってデータを管理する技術です。


まぁ、要するにデータを管理する技術の最先端といった所でしょうか。

何で不特定多数がいじっていいのに改竄されないの?と言った疑問があるとは思いますが、ブロックチェーンの仕組みは細かく、ある程度難しいものなので、別で一つずつ説明していこうと思います。

オブジェクトのリストを別のオブジェクトのリストに変換する方法

Java で開発していると、データベースから取得した Entity のリストから画面表示用の DTO のリストへ変換するようなシチュエーションがあると思われる。 他にも、オブジェクトのリストから別のオブジェクトのリストに変換する機会はあると思う。
java8 から追加された java.util.stream.Stream クラスの map() メソッドを使用すると簡単に変換できる。


変換元となるクラス
@Data
@Entity
public class CountDO {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private Long count;

    @Column
    private Long size;

    @Column
    private Long recordTime;

}


変換先となるクラス
@Data
public class CountDTO {
    
    private Long value;

    private Long timestamp;


    /**
     * countDOからCountDTOを作成。(CountとRecordTimeを取り出す)
     * @param countDO
     * @return
     */
    public static CountDTO valueOf(CountDO countDO) {
        CountDTO countDTO =  new CountDTO();
        countDTO.setValue(countDO.getCount());
        countDTO.setTimestamp(countDO.getRecordTime());

        return countDTO;
    }

CountDTOは、CountDOからcountとrecordTimeの二つのカラムだけを取り出したクラスである。

ここではただ取り出しただけであるが、valueOfメソッドの中身を変えれば好きなように変換できる。


変換作業
//firstTimeからlastTimeまでのcountDOを全て取得
List<CountDO> countDOList = countDAO.getAll(firstTime, lastTime);
       
//countDOのリストをcountDTOのリストに変換
List<CountDTO> CountDTOList = countDOList.stream().map(CountDTO::valueOf).collect(Collectors.toList());

ここではstreamの詳しい説明は省略する。

mapメソッドは、streamクラスの一つ一つを引数に取り、何らかの処理を行うメソッドである。ここではラムダ表記のため引数等は省略されている。

mapメソッドでvalueOfの変換が行われ(何らかの処理がここではvalueOfの変換)、最後にcollect(Collectors.toList())で再びリストにしている。

これで変換作業は終わり!

staticなメソッドを含むクラスをMockする方法(powerMock)

javaのテストでmockする際に一般的に用いられるmockitoでは、staticメソッドがあるとMock化できないようだ。staticなメソッドが含まれるクラスをmockしようとした際に、予期せぬエラーが出たらmockitoを使っていることが原因である可能性を疑ってみよう。


staticメソッドを含むクラスをmockするためには、主に

  • PowerMock(staticメソッド、privateメソッド、コンストラクタなどにも対応したmockitoの強化版)

  • Jmockito

の二つの方法があるようだ。PowerMockの記事が多かったので、ここではPowermockを試してみた。

今のところ、junit5には完全に対応していないようなのでjunit4を使った。(2020年夏現在)


Mavenの設定

powermock-api-mockito2と、powermock-module-junit4のversionを合わせないと予期せぬエラーが出るので注意。また、mockito”2”である必要があった。

<!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito -->
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito2</artifactId>
            <version>2.0.7</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4 -->
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>2.0.7</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <scope>test</scope>
        </dependency>


使い方

@RunWith(PowerMockRunner.class) //(1)
@PrepareForTest({ Example.class }) //(2)
public class ExampleLogicTest {

    ExampleLogic logic = new ExampleLogic();

    @Before
    public void setUp() throws Exception {
        PowerMockito.mockStatic(Example.class); //(3)
    }

    @Test
    public void countExamples() {
        List<ExampleDTO> result = Arrays.asList(new ExampleDTO());
        when(Example.findAll()).thenReturn(result); //(4)
        assertThat(logic.countExamples(), equalTo(1));
    }
}


(1) PowerMockを使う場合に必要な宣言

(2) モック化するstaticメソッドを持つクラスを指定。複数のクラスを書くことも出来る。この記述は必須で、ないとエラーが発生する。

(3) mockする前に、どのクラスをmockするか指定。

(4)使い方はmockitoと同じ  


一部のメソッドをMock化することも可能なようだ。   


詳しい仕様はgithubに書いてあるので見て欲しい。

github.com

 

自己紹介とブログの目的

 

2020年8月11日現在、大学三年生のものです。エンジニアのインターンをしていて、プログラミング関係の知識のアウトプットとしてブログを始めました!

他にも、投資(仮想通貨やfx)もやっているのでそれについても。投資というより投機ですね。

また、他の趣味などのことも発信していこうと思います!!