エンティティの理解(クリプトンゾンビ)

9681 ワード

クリプトンゾンビへ
修飾子のプロパティ
modifier onlyOwner() {
require(msg.sender == owner)
;
}
前述したように、修飾子プロパティを使用して関数を宣言します.
functnion test1() public onlyOwner {
~~~;
}
この修飾子に設定されたrequire構文はtest 1関数にも適用されます.JSでclassを使用して特定の値をプリセットする概念と同様に、関数式と同じ形式であることに注意してください.
引数を持つ関数コントロール
関数コントローラは、引数を受け入れることもできます.例:
// 사용자의 나이를 저장하기 위한 매핑
mapping (uint => uint) public age;

// 사용자가 특정 나이 이상인지 확인하는 제어자
modifier olderThan(uint _age, uint _userId) {
  require (age[_userId] >= _age);
  _;
}

// 차를 운전하기 위햐서는 16살 이상이어야 한다
// `olderThan` 제어자를 인수와 함께 호출하려면 ↓
function driveCar(uint _userId) public olderThan(16, _userId) {
  // (필요한 함수 내용들 입력)
}
こちらです.  olderthan  コントロールを表示すると、関数に似たパラメータが表示されます.まだあります.  driveCar  関数は、受信したパラメータを制御者として渡します.制御者の最後の行
"_ ; "実行可能な関数の残りの内容を使用することに注意してください.
構造体をパラメータに渡す
  private  または  internal  構造体のstorageポインタをパラメータとして関数に渡すことができます.たとえば、関数間  Zombie  名前の構造を交換すると
function _doStuff(Zombie storage _zombie) internal {

}
このようにして、構造体をパラメータとして関数に渡し、構造体要素への参照を渡すことができる.
ソースの弱点
pragma solidity 0.8.4;

contract fishingTest {
    address owner;
  
    constructor()  payable {
        owner = msg.sender;
           }
           
    function chkBalance() public view returns(uint) {
        return address(this).balance;
    }
 
           
    function withdraw(address _to) public {
        require(tx.origin == owner);
        payable(_to).transfer(address(this).balance);
    }
    
    function clear() public {
        require(owner == msg.sender);
        selfdestruct(payable(owner));
    }

    
   
}
上図には、作成者のみがrequire関数のrequire構文を通過できることが示されています.しかし、作成者がdetakeを呼び出さなくても、契約のイーサをキャプチャすることができます.
// Vulnerable contract
function withdraw(address payable _recipient) public {
    require(tx.origin == owner);
    _recipient.transfer(address(this).balance);
}

// Malicious contract
fallback() external payable {
    vulnerableContract.withdraw(attackerAddress);
}
略奪者は生成者に少量のイーサを借り,略奪者本人のEOAを送信するふりをし,略奪としてのfallback関数を含むcontract CAアドレスを送信する.作成者がイーサをアドレスに送信すると、自動的に「奪取承諾」のfallback関数が実行され、イーサは予め「奪取承諾」を入力した「奪取者」のアドレスに奪取される.
上記の方法は,CAアドレスとEOAアドレスの形態類似点とTx.originのセキュリティホールをfallback関数として利用するfishing技術である.したがって,簡単な送金であっても,EtherScan等による送金の前にアドレスがEOAかCAかを確認する必要がある.
+既知のBC攻撃事例を理解する
<エンティティ関数の構文部分はすべてCryptoZombiesの内容を参照しています.>
SandBoxサービス、イーサネットブロックチェーンの原理を理解するために使用