यह अनुबंध घोटाला कैसे काम करता है?
इस अजीब अनुबंध को ध्यान में रखते हुए कोई व्यक्ति निर्माण करता है, किसी प्रकार के घोटाले की तरह दिखता है, यह कैसे काम करता है?
https://etherscan.io/address/0x4fa738cf30036505d106b22f60e64bf52e64aa77/advanced#code:
/**
*Submitted for verification at Etherscan.io on 2020-08-16
*/
contract a1_quiz
{
function Try(string _response) external payable
{
require(msg.sender == tx.origin);
if(responseHash == keccak256(_response) && msg.value > 1 ether)
{
msg.sender.transfer(this.balance);
}
}
string public question;
bytes32 responseHash;
mapping (bytes32=>bool) admin;
function Start(string _question, string _response) public payable isAdmin{
if(responseHash==0x0){
responseHash = keccak256(_response);
question = _question;
}
}
function Stop() public payable isAdmin {
msg.sender.transfer(this.balance);
}
function New(string _question, bytes32 _responseHash) public payable isAdmin {
question = _question;
responseHash = _responseHash;
}
constructor(bytes32[] admins) public{
for(uint256 i=0; i< admins.length; i++){
admin[admins[i]] = true;
}
}
modifier isAdmin(){
require(admin[keccak256(msg.sender)]);
_;
}
function() public payable{}
}
जवाब
यदि आप केवल अनुबंध नियमित लेन-देन इतिहास पढ़ते हैं, तो आप मानेंगे कि निर्माण के बाद इसे Start(string _question, string _response)
लेन-देन 0xc96ddea6...ब्लॉक 10668934 पर कॉल करके आरंभ किया गया था
- _question = "वकील किस तरह के कपड़े पहनते हैं?"
- _response = "LawsuiT"
लेकिन अगर आप आंतरिक लेन-देन देखने वहाँ करने के लिए पिछले एक फोन था function New(string _question, bytes32 _responseHash)
लेनदेन में 0xbed05f75 ... ब्लॉक 10,668,933 पर।
कॉल करने के लिए Start
बदल दिया नहीं responseHash
के रूप में शिकार अपेक्षा की होगी, इसलिए करने के लिए कॉल Try
विफल हो जाएगा।
नोट: इन "शहद के बर्तनों" के साथ मत खेलो, यह हारना बहुत आसान है और संभावना नहीं कि आप जीत जाएंगे।