¿Es posible bifurcar Ethereum para que solo las cuentas especificadas puedan implementar un nuevo contrato?

Las cadenas de bloques que admiten contratos inteligentes a veces se comparan con los teléfonos inteligentes en el sentido de que es una infraestructura abierta para alojar una cantidad indefinida de aplicaciones, que cualquier participante puede crear e implementar para que esté disponible para toda la red.

En el caso de una cadena de bloques privada, es posible que la parte administradora no desee permitir que los participantes implementen un nuevo contrato, sino solo llamar a los métodos del contrato inteligente que ha implementado.

¿Hay alguna manera de bifurcar el código Etherum para permitir eso? Si es así, ¿las cuentas permitidas para la implementación del contrato pueden estar en el bloque de génesis en lugar de codificadas?

Respuestas (2)

Esto es muy fácil de hacer modificando las fuentes.

En el archivo core/state_transition.gomodifica estas lineas:

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(sender.Address(), st.state.GetNonce(sender.Address())+1)
    ret, st.gas, vmerr = evm.Call(sender, st.to().Address(), st.data, st.gas, st.value)
}

por algo como esto:

if contractCreation {
    if sender.Bytes().Cmp(your_allowed_address_here.Bytes())==0 {
        ret, _, st.gas, vmerr = evm.Create(sender, st.data, st.gas, st.value)
    }
} else {
    // Increment the nonce for the next transaction
    st.state.SetNonce(sender.Address(), st.state.GetNonce(sender.Address())+1)
    ret, st.gas, vmerr = evm.Call(sender, st.to().Address(), st.data, st.gas, st.value)
}

donde senderestá la dirección que ejecuta la transacción, y your_allowed_address_herees la dirección que es la única que puede crear contratos

No probé el código anterior, pero tienes una idea.

Sí. Si está listo para bifurcarse y cambiar el código, puede hacer lo que quiera. En este caso, "solo" necesitaría limitar las direcciones de remitente permitidas para enviar una transacción a la dirección 0x0 (creación de contrato). Puede hacer que esto sea configurable a través del archivo de génesis, o si está utilizando PoA, puede permitir esta función solo para las autoridades de la red. También es posible implementar una cantidad fija de contratos en el momento de la génesis y deshabilitar la creación de nuevos contratos.