솔리디티
솔라디티 3일차
diary owner
2023. 5. 24. 22:10
Log
- 코인같은 걸 보낼때의 주소나 양 등 정보가 적혀있는 걸 담아있는 곳
Event
- Log를 가져와 저장하여 사용가능하게 만들어줌
- 출력할때는 emit을 통해 출력한다
Indexed
- indexed는 event 객체 내에서 사용할 수 있는 키워드로 event를 검색 또는 필터링하는데 사용할 수 있게 만드는 키워드이다.
public, private, internal
- public은 외부에서 갔다쓰거나 수정할때
- private은 외부에서 갔다쓰거나 수정이 안됨
- 외부에서 참조는 하고 수정이 안됨 internal
상속
- contract 자식 is 부모 { }
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8;
contract Number {
uint internal num = 4;
function changeNumber(uint _num) public virtual{
num = _num;
}
function getNum() public view returns(uint){
return num;
}
}
contract Caller is Number{
function changeNumber(uint _num) public override {
num = _num -1;
}
}
인스턴스화
- 인스턴스(instance)는 주로 하나의 컨트랙에서 다른 컨트랙을 접근할 때 쓴다.
- 예로 A와 B 컨트랙이 있다고 가정하고 B에서 A의 함수나 변수들을 접근하여 사용하고 싶다면 A 인스턴스를 만들어 B컨트랙 안에서 사용하면된다
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
contract A{
uint256 public a = 5;
function change(uint256 _value) public {
a = _value;
}
}
contract B{
}
- 인스턴스 선언법
- 컨트랙이름 인스턴스의 이름 = new 컨트랙이름()
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
contract A{
uint256 public a = 5;
function change(uint256 _value) public {
a = _value;
}
}
contract B{
A instance = new A();
function get_A() public view returns(uint256) {
return instance.a();
}
function change_A(uint256 _value) public {
instance.change(_value);
}
}
현재 스마트 컨트랙B에서 A의 인스턴스는 .을 붙여 접근함을 볼수 있다.
get_A 에서는 컨트랙 A의 변수를 접근해야하니 instance.a()를 써준걸 알 수가 있어요.
그리고 한가지더, **변수를 접근할때는 () 를 붙여 주셔야 리턴이 된답니다.**
다형성과 오버라이딩 차이
다형성(polymorphism)은 같은 프로그래밍 인자가 서로 다른 자료형을 갖는것.
즉 오버로딩 적용시 하나의 함수가 여러 개의 매개변수를 다룰수 있어 함수를 유연하게 사용할수 있다
1.다형성
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8;
contract Number {
function Type(uint _num1, uint _num2) public pure returns (uint){
return _num1 + _num2;
}
function Type(string memory _num1, string memory _num2) public pure returns (string memory, string memory){
return (_num1, _num2);
}
}
contract Caller{
Number internal instance = new Number();
function call_change(uint _num1, uint _num2) public view {
instance.Type(_num1, _num2);
instance.Type(_num1, _num2);
}
}
2. 오버라이드
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
contract Father{
uint256 public fatherMoney = 100;
function getFatherName() public pure returns(string memory){
return "KimJung";
}
function getMoney() public view virtual returns(uint256){
return fatherMoney;
}
}
contract Mother{
uint256 public motherMoney = 500;
function getMotherName() public pure returns(string memory){
return "Leesol";
}
function getMoney() public view virtual returns(uint256){
return motherMoney;
}
}
contract Son is Father, Mother {
function getMoney() public view override(Father,Mother) returns(uint256){
return fatherMoney+motherMoney;
}
}
다중상속
- 상속과 같이 is 뒤에 상속할 컨트랙트의 명들을 적어주면된다.
- 선언방식 : 컨트랙명 is 부모명, 부모명{} 이다.
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
contract Father{
} //부모 컨트랙
contract Mother{
} //부모 컨트랙
contract Son is Father,Mother{
} //상속받은 자식 컨트랙
추상화 컨트랙트
- abstract는 부모개념이며 상속해줄것을 미리 모아놓은거
인터페이스 컨트랙트
- 추상화 개념이며 제약이많다
payable
- payable은 말 그대로 지불이 가능한 함수를 선언할 수 있습니다. payable이 붙은 함수는 이더리움을 전송받을 수 있습니다. 원하는 이더리움의 value가 전송되었는지 require문을 통해 확인할 수 있습니다.
truffle 공부 해야겠지..