はじめに
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
と一致するかを確認する術がないため、セキュリティ的には問題があるようだ。