em Blog, Notícias

Disponibilizado código de Dapp Ethereum para Controle de Acesso

Disponibilizamos em nosso GitHub um dapp para gerenciamento de acesso baseado em níveis.

Este exemplo possui 3 níveis de acesso:

  • SuperUser
  • Manager
  • User

É um dapp (smart-contract) para a plataforma Ethereum onde serão registrados os endereços de usuários e contratos que acessarão a plataforma, de acordo com cada nível de acesso.

Junto há um outro aplicativo para testar o acesso, que mostra como funciona a implementação.

OriginalMyAccessControl.sol

contract OriginalMyAccessControl {
    address public owner;
    mapping(address => bool)  superUser;
    mapping(address => bool)  manager;
    mapping(address => bool)  user;
    
    
    event SuperUser(address userAddress, bool enabled);
    event Manager(address userAddress, bool enabled);
    event User(address userAddress, bool enabled);
    
    
    
    function OriginalMyAccessControl() {
        owner = msg.sender;
        superUser[msg.sender] = true;
    }
    
    modifier Owner {
        if (msg.sender != owner) throw;
    }

    
    function transferOwnership(address newOwner) Owner{
        owner = newOwner;
    }
    
    
    /* Enable superuser mapping */
    function enableSuperUser(address target, bool enable) {
        if (!superUser[msg.sender] && msg.sender != owner) throw;
        superUser[target] = enable;
        SuperUser(target, enable);
    }

    
    /* Enable manager mapping */
    function enableManager(address target, bool enable) {
        if (!superUser[msg.sender] && !manager[msg.sender] && msg.sender != owner) throw;
        manager[target] = enable;
        Manager(target, enable);
    }

    /* Enable user mapping */
    function enableUser(address target, bool enable) {
        if (!superUser[msg.sender] && !manager[msg.sender] && msg.sender != owner) throw;
        user[target] = enable;
        User(target, enable);
    }

    
    /* Check Super User Access */
    function isSuperUser(address target) {
        if (!superUser[target] && target != owner) throw;
    }
    
    /* Check Manager Access */
    function isManager(address target) {
        if (!superUser[target] && !manager[target] && target != owner) throw;
    }
    
    /* Check User Access */    
    function isUser(address target) {
        if (!superUser[target] && !manager[target] && !user[target] && target != owner) throw;
    }
    
    function(){
        throw;
    }

}

testAccess.sol

contract testAccess {
	address public AccessControlAddress;
	
	modifier onlySuperUser{
		address nameReg = AccessControlAddress;
		if (nameReg == 0) throw;
		if (!nameReg.call(bytes4(sha3("isSuperUser(address)")), msg.sender)) throw;
	}
	
	modifier onlyManager{
		address nameReg = AccessControlAddress;
		if (nameReg == 0) throw;
		if (!nameReg.call(bytes4(sha3("isManager(address)")), msg.sender)) throw;
		
	}
	
	modifier onlyUser{
		address nameReg = AccessControlAddress;
		if (nameReg == 0) throw;
		if (!nameReg.call(bytes4(sha3("isUser(address)")), msg.sender)) throw;
		
	}
	
	function testAccess(address acAddress){
		AccessControlAddress = acAddress;
	}
	
	
	function testSuperUser(address superUserAddress) onlySuperUser returns (bool) {
		return true;
	}

	function testManager(address superUserAddress) onlyManager returns (bool){
		return true;
	}

	function testUser(address superUserAddress) onlyUser returns (bool){
		return true;
	}
	
	function changeACAddress(address acAddress){
		AccessControlAddress = acAddress;
	}

	
}

O repositório original pode ser encontrado diretamente no endereço: https://github.com/OriginalMy/OriginalMyAccessControl