根据社区小伙伴需求,需要合约内查看某账户是否部署了合约,
我们根据setabi action,看下系统合约代码
https://github.com/EOSIO/eosio.contracts/blob/636406b45a4e1d4c3d7b308f6064dfe61b962814/contracts/eosio.system/src/eosio.system.cpp#L361

  void native::setabi( const name& acnt, const std::vector<char>& abi ) {
      eosio::multi_index< "abihash"_n, abi_hash >  table(get_self(), get_self().value);
      auto itr = table.find( acnt.value );
      if( itr == table.end() ) {
         table.emplace( acnt, [&]( auto& row ) {
            row.owner = acnt;
            row.hash = eosio::sha256(const_cast<char*>(abi.data()), abi.size());
         });
      } else {
         table.modify( itr, same_payer, [&]( auto& row ) {
            row.hash = eosio::sha256(const_cast<char*>(abi.data()), abi.size());
         });
      }
   }

当账户部署合约时,会将合约的hash更新到abihash表,所以我们根据这个表,来判断是否部署了合约就好了

cleos -u https://api.eoslaomao.com get table eosio eosio abihash -L eosio.token -l 1

返回数据

{
  "rows": [{
      "owner": "eosio.token",
      "hash": "85fd4e647e88e595223e69d09a3368a14a45d29320ed1515f54fdfac6ca999df"
    }
  ],
  "more": true
}

当合约账户删除部署合约时,

cleos -u https://api.eoslaomao.com set abi -c

这个hash值为

0000000000000000000000000000000000000000000000000000000000000000
结论

判断下对应账户在该abihash表有记录,且hash值不为0000000000000000000000000000000000000000000000000000000000000000,即为已部署合约。

备注

cleos get code 拿到的是 wasm 和 abi 原数据,然后本地计算的hash(查看源代码),这个一般主要是判断 合约 有没有更新变化用。如果只是判断是否部署合约,还是本文更直接