いつもお世話になっております。検索エンジンチームの秀野です。
試験的な取り組みとして、社内通貨LIFULL COINをSlack上で送り合うピアボーナスの仕組みを作ったので、その紹介をします。 検索エンジンの話は1つもでてきません。
LIFULL COINとは
LIFULL COINはトップダウンな評価でなく、お互いをフラットに評価できるプラットフォームとして作られました。
参考にした評価システムとして、日本古来のお天道様や、欧米だとアダム・スミスの公平な観察者、あとアニメのPSYCHO-PASSに出てくるシビュラ・システムなどがあります。 こういった仕組みを通して、会社の社是である「利他主義」ですとか、ガイドラインの可視化・推進を目標としていました。
また、交換する/価値を測る/貯めるといった通貨と同じ特徴を持っています。 そのため、LIFULL COIN Wallet というWebアプリケーションを使って、銀行口座のようにコインを管理できます。
基本機能として、下記のような機能があります。
- 残高の確認
- 送金と取引履歴
- ベーシックインカム(週1)
- 投げ銭
Slackを使ったピアボーナス
始めの課題感
2020年、コロナ禍によってエンジニアにとっては待望の在宅勤務が始まったわけですけれども、コミュニケーション上の課題というものがご多分に漏れず弊社でもでてきました。
特に新規事業部のような小さいチームが複数集まっている部署で課題感があるようでした。 周りが何をやっているか分からないですとか、人事部のアンケートでも気持ちが不安定になっている人がちらほらいるようで、社会適合者の人たちは大変だなーと思っていました。
そんなこともあり、ピアボーナスとしてLIFULL COINを送り合い、状況の共有やいいね👍ができる仕組みを用意することになりました。
ピアボーナスの仕組み
Slack のリアクションに連動してコインが付与される、というよくある仕組みです。
リアクションされた人、ここではペンギンにコインが付与され、リアクションした人、というかロボットにも少額が付与されます。 リアクションした人からリアクションされた人にコインが送られるのではなく、お天道様(LIFULL COIN Bot)から2人にコインが降ってくるイメージです。 「お天道様は見ている」のです。
将来的には、何かしら社員のアクティビティに反応して自動的にコインを付与したりしたかったです。 例えば、リファクタリングやPRに応じて開発者に付与されたり、本番環境のAPIのリクエスト数に応じて担当部署に付与されたり。
ブロックチェーンの送金処理
LIFULL COINは、内部でブロックチェーンを利用しています。
ブロックチェーンでは、通貨を扱う仕様が標準化されており、秘密鍵と公開鍵を使った送金フローの検証機能が元々備わっています。 (LIFULL COINではEthereumを元に開発されたQuorumを使っています)
ここで簡単にその送金の仕組みを説明します。
トランザクション
これは、お天道様からペンギンに対してコインが送られている図です。
ブロックチェーンにはアカウントアドレスというものがあり、これが銀行の口座番号のような役割りを果たしています。 このアカウントアドレスは、公開鍵のハッシュから生成されます。 公開鍵は秘密鍵から生成されるものなので、アドレスは秘密鍵からユニークに生成される値ということになります(ECDSAを前提にしています)。
実際に送金する際は、どのアドレスから、どのアドレスに、いくら送る、というトランザクションと呼ばれるデータを作成してブロックチェーンに送信します。 お天道様の秘密鍵でトランザクションに署名することで、初めて送金が可能になります。
ブロックチェーンはトランザクションの署名を検証し、問題なければブロックに追加します。 これでペンギンに対しての送金が完了したことになります。
スマートコントラクト
ブロックチェーンには、スマートコントラクトと呼ばれるプログラムをデプロイできる仕組みがあります。 スマートコントラクトは自身のアドレスを持っていて、トランザクションをトリガーになんらかの処理を行えるイミュータブルなプログラムです。
LIFULL COIN Botのコアになるプログラムは、このスマートコントラクトとして実装されていて、
- コインの発行
- 口座の管理
- コイン付与の実行
などの機能を担っています。
この2つのプログラムは実際に使っているコードで、LifullCoinコントラクトとOtentoコントラクトです。 更新系の関数は秘密鍵で署名しないと呼び出せないようにしたり出来るので、セキュアな実装が可能です。
ただ、不変ゆえ基本的にはバグがあっても直せないので恐ろしすぎます。
出来上がり
ピアボーナスの処理の流れ
ブロックチェーンの仕組みを踏まえて、こちらがピアボーナスの全体の構成と流れになります。 全体といいつつ実際は色々作ったのですが、それはまた別のお話…
- コインの流れを可視化するAthenaでの集計の仕組み
- 社員ADとCognitoのOpen ID Connect連携
- 社内のあらゆるID同士を相互変換するID Masquerade
- ブロックチェーン上のデータのバックアップ/リストア
余談ですが、draw.ioで図を書くとみんな同じ感じになるので手書き風にしてみました。
右側のブロックチェーンの青い四角がさきほど説明したスマートコントラクトです。
事前準備
事前にLifullCoinコントラクトからOtentoコントラクトに対して、お天道様の口座のコインを自由に送金する許可を与えておく必要があります(手順0)。 許可を与える処理には、お天道様の口座を扱う秘密鍵で署名する必要があります。
口座には1億コインあり、Otentoコントラクトには1億コイン全てを送金できる許可を与えてあります。
リアクション〜コイン付与と通知
- リアクションがあった時は、左上のSlackアプリからフローが開始されます
- Slackサーバーからリアクション追加イベントがLIFULL COIN Bot(Slack bot)に送られてきます
- LIFULL COIN BotはID変換テーブルを参照して、SlackのチームIDとユーザーIDをブロックチェーンのアドレスに変換します
- コイン付与額と付与先のアドレスを含めたトランザクションを作成し、お天道様用の秘密鍵で署名します
- ブロックチェーン上のOtentoコントラクトに署名済みトランザクションを送信します
- Otentoコントラクトは公開鍵でトランザクションの検証を行い、対象者のアドレスにコインを送金します
- OtentoコントラクトからLIFULL COIN Botに送金結果を返します(PoWでなくRaftのためほぼリアルタイムで送金が完了します)
- LIFULL COIN Botはリアクションした人/された人に着金通知を送信します
- リアクションした人/された人のSlackアプリのメッセージタブに着金通知が表示されます
UIなど
アプリのホームタブ&メッセージタブ
↓Slackアプリのホームタブでは簡易的に残高が確認できます。
前述の着金通知メッセージです。付与額はある程度ランダムです。↑
未登録者勧誘メッセージ&プロフィール登録モーダル
↓アドレス未登録でリアクションされた場合、登録を促すメッセージが届きます。
登録用のモーダルです。Slack上で登録できるようになっています。↑
衝撃的な幕切れ
開発前、ピアボーナスを試す予定の部署ではSlackを利用していませんでした。 そこで開発中にSlackを導入し、普段使いしている状態でピアボーナスを導入するという流れでした。
開発が終わり導入できるようになった頃、Slackのワークスペースを作ったという話を聞かされました。 そう、誰も…Slackを導入していなかったのです。
これを「傍観者効果」といいます。
役割分担をしたからといって、必ずしも実行されるわけではないということを学びました。 どんな些細なことでも、必ず進捗確認をしていきましょう。