Blockieren Sie ein Konto in einer zugelassenen Blockchain-Umgebung

Wir entwickeln mit Ethermint eine zugelassene Blockchain-Umgebung. Unternehmen müssen sich bewerben, um der Blockchain-Umgebung beizutreten, wir erstellen und geben ihnen ihr Ethereum-Konto.

Eines der Hauptanliegen ist, wie ein Konto aus der Umgebung entfernt oder gesperrt werden kann, wenn sich herausstellt, dass dieses Unternehmen nicht nett spielt.

Wir dachten daran, den Organisationsvertrag zu markieren oder zu zerstören, aber dann müssten Sie fast jeder Methode einen Modifikator hinzufügen UND sie können immer noch Transaktionen mit ihrem Ethereum-Konto durchführen.

Ich bin mir nicht sicher, ob es überhaupt möglich ist, ein solches Konto aus einer zugelassenen Blockchain-Umgebung zu sperren, denn darum geht es offensichtlich bei der Dezentralisierung :-) Aber vielleicht gibt es hier eine Problemumgehung oder ein "Muster", das hier verwendet werden kann.

Antworten (1)

Eigentlich sehr einfach zu machen.

Diese Funktion ist ein einzelner Eintrag, um Guthaben auf Ethereum zu ändern ( core/state_transition.go):

// TransitionDb will transition the state by applying the current message and
// returning the result including the the used gas. It returns an error if it
// failed. An error indicates a consensus issue.
func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bool, err error) {
    if err = st.preCheck(); err != nil {
        return
    }
    msg := st.msg
    sender := vm.AccountRef(msg.From())
    homestead := st.evm.ChainConfig().IsHomestead(st.evm.BlockNumber)
    contractCreation := msg.To() == nil

    // Pay intrinsic gas
    gas, err := IntrinsicGas(st.data, contractCreation, homestead)
    if err != nil {
        return nil, 0, false, err
    }
    if err = st.useGas(gas); err != nil {
        return nil, 0, false, err
    }

    var (
        evm = st.evm
        // vm errors do not effect consensus and are therefor
        // not assigned to err, except for insufficient balance
        // error.
        vmerr error
    )
    if contractCreation {
        ret, _, st.gas, vmerr = evm.Create(sender, st.data, st.gas, st.value)
    } else {
        // Increment the nonce for the next transaction
        st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1)
        ret, st.gas, vmerr = evm.Call(sender, st.to(), st.data, st.gas, st.value)
    }
    if vmerr != nil {
        log.Debug("VM returned with error", "err", vmerr)
        // The only possible consensus-error would be if there wasn't
        // sufficient balance to make the transfer happen. The first
        // balance transfer may never fail.
        if vmerr == vm.ErrInsufficientBalance {
            return nil, 0, false, vmerr
        }
    }
    st.refundGas()
    st.state.AddBalance(st.evm.Coinbase, new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), st.gasPrice))

    return ret, st.gasUsed(), vmerr != nil, err
}

Sie müssen so etwas tun:

func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bool, err error) {
    if err = st.preCheck(); err != nil {
        return
    }
    msg := st.msg
    sender := vm.AccountRef(msg.From())
    homestead := st.evm.ChainConfig().IsHomestead(st.evm.BlockNumber)
    contractCreation := msg.To() == nil

    // here is where your custom code goes:

    errAccessDenied:=errors.New("Company isn't playing nice")
    blacklisted_address,exists:=blacklists[sender]
    if exists {
        return ret,0,false, errAccessDenied
    }
    blacklisted_address,exists=blaclists[st.to()]
    if exists {
        return ret,0,false,errAccessDenied
    }
    // here is where your custom code ends   

    // Pay intrinsic gas
    gas, err := IntrinsicGas(st.data, contractCreation, homestead)
    if err != nil {
        return nil, 0, false, err
    }
    if err = st.useGas(gas); err != nil {
        return nil, 0, false, err
    }

    var (
        evm = st.evm
        // vm errors do not effect consensus and are therefor
        // not assigned to err, except for insufficient balance
        // error.
        vmerr error
    )

    if contractCreation {
        ret, _, st.gas, vmerr = evm.Create(sender, st.data, st.gas, st.value)
    } else {
        // Increment the nonce for the next transaction
        st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1)
        ret, st.gas, vmerr = evm.Call(sender, st.to(), st.data, st.gas, st.value)
    }
    if vmerr != nil {
        log.Debug("VM returned with error", "err", vmerr)
        // The only possible consensus-error would be if there wasn't
        // sufficient balance to make the transfer happen. The first
        // balance transfer may never fail.
        if vmerr == vm.ErrInsufficientBalance {
            return nil, 0, false, vmerr
        }
    }
    st.refundGas()
    st.state.AddBalance(st.evm.Coinbase, new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), st.gasPrice))

    return ret, st.gasUsed(), vmerr != nil, err
}

Natürlich ist es kein getesteter Code, aber Sie bekommen eine Vorstellung. Außerdem müssen Sie die Funktionalität einschließen, um die Liste der Unternehmen, die nicht gut funktionieren, unter den Knoten zu verteilen. Der Hash der schwarzen Liste muss in den Block-Header (types.Header) aufgenommen werden.