Web3サービスでdeployerを調べる簡単な方法がないか実験してみました。deployerは、スマートコントラクトをデプロイした人のアドレスです。本記事では、Etherscan のAPIを使用して、コントラクトアドレスからdeployerを調べる方法を紹介します。
以下のコードは、Etherscanを使用して、指定されたコントラクトアドレスからdeployerを調べる方法を示しています。
const axios = require("axios");
// コントラクトアドレス
const contractAddress = "CONTRACT_ADDERESS";
const apiKey = ""; //実験利用であればこのまま
async function getDeployer(contractAddress, apiKey) {
try {
const etherscanApiUrl = `https://api.etherscan.io/api`;
const response = await axios.get(etherscanApiUrl, {
params: {
module: "account",
action: "txlist",
address: contractAddress,
startblock: 0,
endblock: "latest",
sort: "asc",
apikey: apiKey,
},
});
const transactions = response.data.result;
const deployTransaction = transactions.find(
(tx) =>
tx.to === "" ||
tx.to === "0x" ||
tx.to === "0x0000000000000000000000000000000000000000"
);
if (!deployTransaction) {
throw new Error(`Deploy transaction of ${contractAddress} Not Found.`);
}
const deployer = deployTransaction.from;
return deployer;
} catch (error) {
console.error("Error:", error.message);
}
}
(async () => {
const deployer = await getDeployer(contractAddress, apiKey);
console.log("Deployer:", deployer);
})();
このコードでは、Etherscan APIを使用して、指定されたコントラクトアドレスのトランザクションリストを取得し、deployerを調べています。deployerは、トランザクションの送信元アドレス(tx.from
)です。deployerを取得するために、トランザクションリストの各トランザクションに対して、以下の条件を満たすものを探しています。
- トランザクションの宛先アドレス(
tx.to
)が空文字列(""
)である。 - トランザクションの宛先アドレス(
tx.to
)が “0x” である。 - トランザクションの宛先アドレス(
tx.to
)が全ての桁がゼロのアドレス(“0x0000000000000000000000000000000000000000”)である。
これらの条件のいずれかを満たすトランザクションは、コントラクトのデプロイトランザクションである可能性が高いです。Ethereumでは、コントラクトデプロイ時のトランザクションは、通常、宛先アドレスが空文字列、0x、または全ての桁がゼロのアドレスになります。
最初contractAddress
に対する最初のトランザクション持ってればいいかと考えたのですが、例えば、コントラクトが他のコントラクトによってデプロイされた場合、最初のトランザクションはデプロイヤーのものではなく、デプロイしたコントラクトのものになります。
まとめ
EtherscanのAPIを使用して、Ethereumのコントラクトアドレスからdeployerを調べる方法を紹介しました。プログラムからDeployerを調べる機会はあまりなさそうですがメモとして置いておきます。