はじめに
Truffleのチュートリアルでtx.originに出会った。
tx.originとmsg.senderの違い
addressには、人間のEthereumアカウントアドレスとコントラクトアドレスの2種類があるが、
msg.senderはその両方が入りうる。tx.originは人間のアカウントアドレスしか入り得ない。という違いがあるらしい。
例えば、アカウントAからコントラクトBを呼び出し、コントラクトBから別のコントラクトCを呼び出したとき、
コントラクトC内でmsg.senderはコントラクトBを指し、tx.originはアカウントAを指す。
しかし、こちらで、Serenityではtx.originの使用を避けるべき旨が言及されている。
どうしてもコントラクトCでtx.originに相当するアドレスが必要な場合は、コントラクトBにtx.originに相当するアドレスを伝搬させるような仕組みを実装して対応できるが、簡単にだますことができる上、Cに届いたアドレスが本当にtx.originと一致するかを確認する術がないため、セキュリティ的には問題があるようだ。