Created
October 19, 2017 16:57
-
-
Save ealmansi/333f1a34f1ac8188dc5910d0b7952d0a to your computer and use it in GitHub Desktop.
Solidity - Visibility.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.17; | |
contract Base { | |
event Called(string name); | |
function public_fn() public { Called("Base.public_fn"); } | |
function private_fn() private { Called("Base.private_fn"); } | |
function external_fn() external { Called("Base.external_fn"); } | |
function internal_fn() internal { Called("Base.internal_fn"); } | |
function () public payable { Called("Base.fallback"); } | |
function fn() public { | |
// Function called internally. | |
public_fn(); // Calls: Base.public_fn | |
private_fn(); // Calls: Base.private_fn | |
//external_fn(); // Error: Undeclared identifier. | |
internal_fn(); // Calls: Base.internal_fn | |
// Function called externally. | |
this.public_fn(); // Calls: Base.public_fn | |
//this.private_fn(); // Error: Member "private_fn" not found or not visible after argument-dependent lookup in contract Base | |
this.external_fn(); // Calls: Base.external_fn | |
//this.internal_fn(); // Error: Member "internal_fn" not found or not visible after argument-dependent lookup in contract Base | |
// Function called on contract type. | |
Base.public_fn(); // Calls: Base.public_fn | |
//Base.private_fn(); // Error: Member "private_fn" not found or not visible after argument-dependent lookup in type(contract Base) | |
//Base.external_fn(); // Error: Member "external_fn" not found or not visible after argument-dependent lookup in type(contract Base) | |
Base.internal_fn(); // Calls: Base.internal_fn | |
// Function called dynamically on raw address. | |
address(this).call(bytes4(keccak256("public_fn()"))); // Calls: Base.public_fn | |
address(this).call(bytes4(keccak256("private_fn()"))); // Calls: Base.fallback | |
address(this).call(bytes4(keccak256("external_fn()"))); // Calls: Base.external_fn | |
address(this).call(bytes4(keccak256("internal_fn()"))); // Calls: Base.fallback | |
} | |
} | |
contract Derived is Base { | |
event Called(string name); | |
function public_fn() public { Called("Derived.public_fn"); } | |
function private_fn() private { Called("Derived.private_fn"); } | |
function external_fn() external { Called("Derived.external_fn"); } | |
function internal_fn() internal { Called("Derived.internal_fn"); } | |
function () public payable { Called("Derived.fallback"); } | |
function fn() public { | |
// Function called internally. | |
public_fn(); // Calls: Derived.public_fn | |
private_fn(); // Calls: Derived.private_fn | |
//external_fn(); // Error: Undeclared identifier. | |
internal_fn(); // Calls: Derived.internal_fn | |
// Function called externally. | |
this.public_fn(); // Calls: Derived.public_fn | |
//this.private_fn(); // Error: Member "private_fn" not found or not visible after argument-dependent lookup in contract Derived | |
this.external_fn(); // Calls: Derived.external_fn | |
//this.internal_fn(); // Error: Member "internal_fn" not found or not visible after argument-dependent lookup in contract Derived | |
// Function called on contract type. | |
Derived.public_fn(); // Calls: Derived.public_fn | |
//Derived.private_fn(); // Error: Member "private_fn" not found or not visible after argument-dependent lookup in type(contract Derived) | |
//Derived.external_fn(); // Error: Member "external_fn" not found or not visible after argument-dependent lookup in type(contract Derived) | |
Derived.internal_fn(); // Calls: Derived.internal_fn | |
// Function called on parent contract type. | |
Base.public_fn(); // Calls: Base.public_fn | |
//Base.private_fn(); // Error: Member "private_fn" not found or not visible after argument-dependent lookup in type(contract Base) | |
//Base.external_fn(); // Error: Member "external_fn" not found or not visible after argument-dependent lookup in type(contract Base) | |
Base.internal_fn(); // Calls: Base.internal_fn | |
// Function called dynamically on raw address. | |
address(this).call(bytes4(keccak256("public_fn()"))); // Calls: Derived.public_fn | |
address(this).call(bytes4(keccak256("private_fn()"))); // Calls: Derived.fallback | |
address(this).call(bytes4(keccak256("external_fn()"))); // Calls: Derived.external_fn | |
address(this).call(bytes4(keccak256("internal_fn()"))); // Calls: Derived.fallback | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment