Müssen Benutzer von ERC20-Münzen Ether halten?

Angenommen, es gibt Fancycoin, einen ERC20-Altcoin, der einige Funktionen hat, die vom EVM implementiert wurden. Es macht einige nicht triviale Dinge, die Gas verbrauchen.

Nach meinem Verständnis kann ich Fancycoin in meiner Wallet erhalten, wenn sie mir jemand schickt, ohne selbst Ether zu haben.

Meine Frage ist: Wenn ich Fancycoin habe und es verwenden möchte, um etwas zu tun (vielleicht überprüft es ein Orakel oder führt Berechnungen mit einigen internen Daten eines Blocks durch usw.), aber ich habe keinen Ether in meiner Brieftasche, werde ich eine der Funktionen von Fancycoin nicht nutzen können? Wie in der Antwort auf die im ersten Kommentar unten verlinkte Frage erwähnt, werde ich wahrscheinlich nicht in der Lage sein, Fancycoin an jemand anderen zu senden.) Können jedoch Funktionen in Fancycoin, die Gas erfordern, irgendwie in Fancycoin bezahlt werden und nicht in Ether?

Die Beantwortung des Obigen gilt als Antwort auf meine Frage, aber falls Sie erweitern möchten: Ich denke, am allgemeinsten interessiert mich, wie Münzen, die auf Ethereum aufgebaut sind, mit Ether interagieren. Ich verstehe das nicht.

Ich stimme zu, dass die verknüpfte Frage nah ist, aber es ist nicht dasselbe. Transaktionen habe ich in meiner Frage nur am Rande erwähnt.
Verstanden - ich ziehe mich zurück, da Sie etwas Allgemeineres fragen.

Antworten (3)

Die Standardantwort wäre: Nein, Sie können ein Konto ohne Ether nicht für irgendetwas im Zusammenhang mit Fancycoin verwenden, da jede Interaktion mit einem Standard-Token eine Transaktion erfordert, die Sie signieren und an das Netzwerk senden und umgekehrt die Transaktionskosten bezahlen müssen Ether (zumindest vorerst können Sie Gebühren nur in Ether bezahlen).

Die interessantere Antwort ist: Ja, indem man die Anforderungen etwas verändert. Sie unterzeichnen eine Transaktion außerhalb der Kette, senden sie an jemand anderen (z. B. durch eine Taube, Schneckenpost oder Rauchzeichen). Dass jemand anderes diese Transaktion dann senden kann und möglicherweise eine kleine Belohnung dafür erhält.

Die obige Idee ist nicht ganz ausgebügelt (angezeigte Sicherheitsprobleme bleiben bestehen), aber die folgende Skizze funktioniert, ich habe sie gerade in Remix mit ein wenig Hilfe der Geth-Web3-Konsole getestet:

pragma solidity ^0.4.13;

/*
Author: Dr. Sebastian C. Buergel for Validity Labs AG
License: MIT

aim:
allow account without ETH but in possession of tokens to transfer tokens

approach:
sign message off-chain, send to other user, incentivize that user to broadcast message and get token as reward

remaining issues and solutions:
- replay protection (use nonce),
- frontrunning by other nodes (commit-reveal),
- timeout (expiry time)

step 0: choose amount, recipient (to), and reward (in tokens) for broadcaster
step 1: obtain hash from `calcHash` (off-chain, offline)
step 2: sign hash (off-chain, offline), e.g. using geth web3 console:
var signature = web3.eth.sign(web3.eth.accounts[0], hash);
var r = signature.substring(0,66);
var s = '0x' + signature.substring(66,130);
var v = '0x' + signature.substring(130,132); // make sure it is 27 or 28, else add 27

step 3: send transaction to someone else
step 4: that other account broadcasts the message by sending it to `broadcast`, funds get transferred and broadcaster gets reward
*/

contract Fancycoin {

    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    mapping(address => uint) public balanceOf;

    uint public totalSupply;

    constructor(uint supply) {
        totalSupply = supply;
        balanceOf[msg.sender] = supply;
    }

    function transfer(address _to, uint256 _value) returns (bool success) {
        return transferFromTo(msg.sender, _to, _value);
    }

    function transferFromTo(address _from, address _to, uint _value) internal returns (bool success) {
        if (balanceOf[_from] >= _value && _value > 0) {
            balanceOf[_from] -= _value;
            balanceOf[_to] += _value;
            Transfer(_from, _to, _value);
            return true;
        } else { return false; }
    }

    // helper function since web3.sha3 is not (yet) able to concatenate arguments in the same way that solidity does it
    function calcHash(uint amount, address to, uint reward) constant returns (bytes32) {
        return sha3(amount, to, reward);
    }

    function verify(uint amount, address to, uint reward, uint8 v, bytes32 r, bytes32 s) constant returns(address) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHash = sha3(prefix, sha3(amount, to, reward));
        return ecrecover(prefixedHash, v, r, s);
    }

    function broadcast(uint amount, address to, uint reward, uint8 v, bytes32 r, bytes32 s) {
        address sender = verify(amount, to, reward, v, r, s);
        assert(transferFromTo(sender, msg.sender, reward));
        assert(transferFromTo(sender, to, amount));
    }

}
Sieht gut aus, nur ein Vorschlag, den Signaturkommentar [27,28] von rWert zu vWert zu verschieben.
Um dies jetzt noch einmal zu überdenken, ein paar Dinge. weniger kritisch, web3.utils.soliditySha3(param1 [, param2, ...])wird verkettet und calcHash ist im Allgemeinen unnötig. Es gibt Versorgungsverträge, die in der Kette bestehen oder nur lokal implementiert werden. Noch wichtiger ist, dass das broadcastDesign aufgrund der Assertionsschritte Gelder für den Sender entziehen kann, so dass dies sicherer wäre, wenn vor dem Senden an das Netzwerk ein Nur-Lese-Aufruf zum Testen durchgeführt würde.

Habe gerade geantwortet und einen Link zur universellen Bibliothek bereitgestellt, wodurch diese Funktionalität einfach in jeden Smart Contract integriert werden kann: https://ethereum.stackexchange.com/a/46546/3032

Jeder wird in der Lage sein, Transaktionen für jeden vertrauenslos und sicher durchzuführen. Beispielsweise kann der Dienst Transaktionen für seine Benutzer durchführen (mit ihren digitalen Signaturen pro Transaktion) und ETH-Gebühren mit eigenen Token-Gebühren kompensieren.

Ich habe tatsächlich ein Beispiel für einen Rahmenvertrag (der Ether speichern muss), der untergeordnete Brieftaschen erstellen kann, die nicht einzeln Ether selbst halten müssen!

Bitte markieren Sie es, wenn es Ihnen gefällt: https://github.com/Meshugah/ERC20-CommonGasWallet