Analise smart-contract
03.04.2024

Kontrak pintar dengan fungsi Jeda

Kami melanjutkan seri artikel yang didedikasikan untuk deskripsi skema penipuan dalam kontrak pintar. Hari ini kami akan menganalisis kontrak pintar dengan fungsi Pause.

Kontrak pintar dengan fitur Pause menyediakan kemampuan untuk menghentikan sementara atau secara permanen operasi atau fungsi tertentu dalam kontrak. Meskipun fitur Pause dapat berguna untuk keamanan dan pemeliharaan, fitur ini juga menimbulkan risiko potensial jika digunakan oleh penipu. Untuk melindungi diri Anda dan mengidentifikasi potensi ancaman, Anda perlu memahami risikonya, skema penipuan umum, dan cara mengenalinya dalam kontrak pintar.

Bahaya kontrak pintar dengan fitur Pause:

  • Pause yang tidak sah: Penipu dapat menguasai fitur Pause dan menghentikan kontrak tanpa otorisasi yang tepat, yang dapat mengakibatkan gangguan bisnis atau kerugian finansial.

  • Penundaan menipu: Kontrak jahat dapat menangguhkan transaksi penting, seperti penarikan atau transfer, dengan dalih pemeliharaan sementara atau langkah-langkah keamanan, dengan tujuan untuk menolak akses pengguna ke aset mereka.

  • Klaim palsu tentang keadaan darurat: Penipu mungkin mengklaim keadaan darurat atau kerentanan secara palsu untuk membenarkan penangguhan kontrak dan kemudian menggunakan dana pengguna selama jeda.

  • Dalih keamanan: Kontrak jahat dapat mengklaim bahwa telah ditemukan kerentanan keamanan, yang mengakibatkan aktivasi fungsi penangguhan. Pada kenyataannya, penipu mungkin berniat memanfaatkan situasi tersebut.

  • Skema darurat: Penipu dapat menggunakan bahasa atau skenario yang menimbulkan ketakutan, seperti mengklaim "percobaan perampokan" atau "situasi darurat" untuk membenarkan jeda di mana mereka dapat melakukan tindakan ilegal.

Bagaimana Anda dapat menentukan sendiri apakah ancaman tersebut ada dalam kontrak pintar?

Jika Anda ingin menentukan keberadaan fungsi Pause dalam kontrak pintar sendiri, tips berikut akan membantu dalam melakukannya.

  1. Periksa kode sumber kontrak untuk melihat apakah ada fitur Pause. Pastikan bahwa mekanisme jeda terdokumentasi dengan baik dan memiliki kontrol akses yang sesuai.

  2. Cari tahu siapa yang mengendalikan fungsi Pause. Kepemilikan fitur Pause yang tidak sah atau tidak terpantau adalah potensi masalah.

  3. Baca dokumentasi dan spesifikasi proyek untuk memastikan bahwa mereka memberikan informasi yang jelas dan akurat tentang fungsi Pause, tujuannya, dan keadaan di mana fitur tersebut dapat digunakan.

  4. Periksa Transparansi penggunaan fitur Pause. Pastikan ada prosedur yang jelas untuk mengelola dan memutuskan apakah akan mengaktifkan atau menonaktifkan Pause.

  5. Perhatikan audit eksternal terhadap keamanan kontrak pintar, terutama mekanisme Pause. Auditor harus mengevaluasi keamanan dan transparansi fitur Pause.

  6. Amati perilaku kontrak dan pastikan bahwa fungsi Pause hanya diaktifkan dalam keadaan yang sah, seperti untuk pemeliharaan atau alasan keamanan.

  7. Berinteraksi dengan komunitas proyek dan pengguna lain untuk memahami pengalaman dan kekhawatiran mereka tentang penggunaan fitur Pause.

  8. Selalu ikuti perkembangan terbaru di komunitas kami (saluran Telegram) dan praktik terbaik untuk deteksi penipuan (Blog dan saluran YouTube kami).

Untuk mendeteksi fungsionalitas yang berpotensi jahat dalam kontrak pintar Pause, Anda harus melakukan uji tuntas, dengan meneliti kode dan dokumentasi proyek. Hindari kontrak dengan perilaku mencurigakan atau kurangnya transparansi terkait penggunaan fitur Pause.

Pemindai keamanan Lotus Market menemukan semua fitur Pause umum (termasuk yang tersembunyi) 99,9% dari waktu. Gunakan langganan premium kami dan lindungi dana Anda dari ancaman.

Selanjutnya, kami akan melihat beberapa contoh fitur Pause yang paling umum yang berhasil ditemukan oleh Platform Lotus Market.

independently determine

Contoh 1: Fungsi Pause Dasar


    contract BasicPauseToken {
      address public owner;
      bool public paused;
  
      constructor() {
          owner = msg.sender;
          paused = false;
      }
  
      modifier whenNotPaused() {
          require(!paused, "Contract is paused");
          _;
      }
  
      function pause() public {
          require(msg.sender == owner, "Only the owner can pause");
          paused = true;
      }
  
      function unpause() public {
          require(msg.sender == owner, "Only the owner can unpause");
          paused = false;
      }
  
      function transfer(address to, uint256 amount) public whenNotPaused {
          // Transfer logic when the contract is not paused
      }
  }
    

Tips untuk mengidentifikasi: Cari kontrak dengan fungsi seperti pause dan unpause atau fungsi serupa yang dapat mengubah status jeda.

Periksa apakah ada modifier tipe whenNotPaused yang diterapkan pada fungsi tertentu untuk memastikan bahwa mereka hanya dapat dieksekusi saat kontrak tidak dijeda.

Periksa mekanisme kontrol akses, yang seharusnya memungkinkan hanya pemilik atau orang yang berwenang untuk menangguhkan dan mencabut penangguhan kontrak.

Contoh 2: Jeda yang Diaktifkan Waktu


    contract TimeActivatedPauseToken {
      address public owner;
      bool public paused;
      uint256 public pauseStartTime;
      uint256 public pauseDuration;
  
      constructor(uint256 _duration) {
          owner = msg.sender;
          paused = false;
          pauseStartTime = 0;
          pauseDuration = _duration;
      }
  
      modifier whenNotPaused() {
          require(!paused, "Contract is paused");
          _;
      }
  
      function pause() public {
          require(msg.sender == owner, "Only the owner can pause");
          paused = true;
          pauseStartTime = block.timestamp;
      }
  
      function unpause() public {
          require(msg.sender == owner, "Only the owner can unpause");
          require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
          paused = false;
      }
  
      function transfer(address to, uint256 amount) public whenNotPaused {
          // Transfer logic when the contract is not paused
      }
  }
  

Tips untuk mengidentifikasi: Cari kontrak dengan mekanisme jeda yang diaktifkan waktu di mana jeda dan pembatalan jeda memiliki durasi tertentu.

Periksa apakah ada modifier tipe whenNotPaused yang diterapkan pada fungsi tertentu. Pastikan bahwa kontrak menegakkan durasi jeda dan memungkinkan pembatalan hanya setelah periode waktu yang ditentukan telah berlalu.

Saat mengidentifikasi fitur Pause dalam kontrak pintar, penting untuk memeriksa kode, kontrol akses, dan tujuan dari mekanisme jeda. Tinjau dengan cermat dokumentasi dan model manajemen kontrak, dan berinteraksi dengan komunitas proyek untuk menilai legitimasi kontrak dan apakah kontrak tersebut sesuai dengan tujuan. Selalu berhati-hati dan lakukan uji tuntas sebelum terlibat dalam transaksi atau investasi yang melibatkan kontrak yang dapat dijeda.

time-activated pause

Contoh 3: Fungsi Pause Bersyarat


    contract ConditionalPauseToken {
      address public owner;
      bool public paused;
  
      constructor() {
          owner = msg.sender;
          paused = false;
      }
  
      modifier whenNotPaused() {
          require(!paused || msg.sender == owner, "Contract is paused");
          _;
      }
  
      function pause() public {
          require(msg.sender == owner, "Only the owner can pause");
          paused = true;
      }
  
      function unpause() public {
          require(msg.sender == owner, "Only the owner can unpause");
          paused = false;
      }
  
      function transfer(address to, uint256 amount) public whenNotPaused {
          // Transfer logic when the contract is not paused, except for the owner
      }
  }
    

Tips untuk mengidentifikasi: Cari kontrak dengan mekanisme jeda bersyarat yang memungkinkan pemilik untuk melakukan transaksi tertentu meskipun kontrak dalam keadaan dijeda.

Periksa apakah modifier whenNotPaused diterapkan pada fungsi-fungsi yang memerlukan kontrak dalam keadaan tidak dijeda.

Contoh 4: Fungsi Jeda Darurat


    contract EmergencyPauseToken {
      address public owner;
      bool public paused;
  
      constructor() {
          owner = msg.sender;
          paused = false;
      }
  
      modifier whenNotPaused() {
          require(!paused || msg.sender == owner, "Contract is paused");
          _;
      }
  
      function pause() public {
          require(msg.sender == owner, "Only the owner can pause");
          paused = true;
      }
  
      function emergencyPause() public {
          require(msg.sender == owner, "Only the owner can initiate emergency pause");
          paused = true;
      }
  
      function unpause() public {
          require(msg.sender == owner, "Only the owner can unpause");
          paused = false;
      }
  
      function transfer(address to, uint256 amount) public whenNotPaused {
          // Transfer logic when the contract is not paused, except for the owner
      }
  }
    

Tips untuk mengidentifikasi: Cari kontrak dengan fitur jeda darurat yang memungkinkan pemilik untuk langsung menjeda kontrak tanpa prosedur jeda standar.

Periksa modifier whenNotPaused untuk menentukan operasi mana yang dibatasi ketika kontrak dalam keadaan dijeda.

Perhatikan fitur jeda darurat kontrak dan pastikan penggunaannya terkendali dengan baik dan didokumentasikan dengan baik.

Sesuaikan fungsi jeda kontrak dengan model tata kelola dan proses pengambilan keputusan untuk mengaktifkan dan menonaktifkan fungsi jeda.

Contoh 5: Jeda yang Dikontrol Pemilik dengan Batas Waktu


    contract TimedPauseToken {
      address public owner;
      bool public paused;
      uint256 public pauseStartTime;
      uint256 public pauseDuration;
  
      constructor(uint256 _duration) {
          owner = msg.sender;
          paused = false;
          pauseStartTime = 0;
          pauseDuration = _duration;
      }
  
      modifier whenNotPaused() {
          require(!paused, "Contract is paused");
          _;
      }
  
      function pause() public {
          require(msg.sender == owner, "Only the owner can pause");
          paused = true;
          pauseStartTime = block.timestamp;
      }
  
      function unpause() public {
          require(msg.sender == owner, "Only the owner can unpause");
          require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
          paused = false;
      }
  
      function transfer(address to, uint256 amount) public whenNotPaused {
          // Transfer logic when the contract is not paused
      }
  }
    

Tips untuk mengidentifikasi: Cari kontrak dengan jeda yang dikendalikan pemilik yang mencakup durasi jeda yang spesifik dan pembatalan jeda.

Periksa modifier whenNotPaused yang diterapkan pada fungsi-fungsi yang sesuai untuk membatasi operasi ketika kontrak dalam keadaan dijeda.

owner-controlled pause with time limit

Contoh 6: Fungsi Jeda oleh Pihak Ketiga dengan Batas Waktu


    contract ThirdPartyTimedPauseToken {
      address public owner;
      address public thirdParty;
      bool public paused;
      uint256 public pauseStartTime;
      uint256 public pauseDuration;
  
      constructor(address _thirdParty, uint256 _duration) {
          owner = msg.sender;
          thirdParty = _thirdParty;
          paused = false;
          pauseStartTime = 0;
          pauseDuration = _duration;
      }
  
      modifier whenNotPaused() {
          require(!paused || msg.sender == owner || msg.sender == thirdParty, "Contract is paused");
          _;
      }
  
      function pause() public {
          require(msg.sender == thirdParty, "Only the third party can pause");
          paused = true;
          pauseStartTime = block.timestamp;
      }
  
      function unpause() public {
          require(msg.sender == thirdParty, "Only the third party can unpause");
          require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
          paused = false;
      }
  
      function transfer(address to, uint256 amount) public whenNotPaused {
          // Transfer logic when the contract is not paused, except for the owner and the third party
      }
  }
    

Tips untuk mengidentifikasi: Cari kontrak dengan mekanisme suspensi yang dikelola oleh pihak ketiga di mana pihak ketiga dapat menjeda dan memutuskan kontrak dengan durasi yang ditentukan.

Periksa modifier whenNotPaused untuk menentukan operasi mana yang dibatasi ketika kontrak dalam keadaan dijeda.

Pastikan mekanisme kontrol akses untuk fitur Jeda dalam kontrak, baik dimiliki oleh pemilik, dikelola oleh komunitas, atau pihak ketiga, transparan dan didesain dengan baik.

Ketika fungsi Jeda diidentifikasi dalam sebuah kontrak pintar, analisis kode yang cermat harus dilakukan, kontrol akses harus diuji, dan tujuan serta model kontrol dari mekanisme jeda harus dipahami. Sangat penting untuk melakukan penelitian yang matang dan berinteraksi dengan komunitas proyek untuk menilai keabsahan kontrak dan apakah cocok untuk tujuan tertentu. Selalu berhati-hati dan lakukan penelitian yang tepat sebelum terlibat dalam transaksi atau investasi yang melibatkan kontrak yang dapat dijeda untuk mengurangi potensi risiko.

 

Kami harap contoh-contoh ini telah membantu Anda memahami lebih baik tentang fungsi Jeda dalam kontrak pintar.

 

Karena semua informasi di blockchain terbuka (tentu saja, asalkan kode sumber kontrak diverifikasi), dengan pengetahuan ini Anda dapat secara mandiri mempelajari kontrak pintar dan mengidentifikasi berbagai skema penipuan.

Namun, kami sudah melakukan semuanya untuk Anda! Daftar untuk langganan premium dan dapatkan akses ke filter eksklusif tentang fitur kontrak pintar dan analisis terbaru. Tingkatkan peluang Anda untuk berhasil berinvestasi dalam token yang menguntungkan.

Salam, Tim Lotus Market.

All posts

Connect to a wallet

Metamask