pragma solidity ^0.4.19; // 0.4.19 버전을 사용한다는 의미
pragma solidity >= 0.7.0 < 0.9.0; // 0.7.0~0.9.0 사이의 버전을 사용한다는 의미
pragma solidity >= 0.7.0 < 0.9.0;
contract Test{
}
pragma solidity >- 0.7.0 < 0.9.0;
contract Test{
uint256 public a = 16;
uint256 private b = 10;
struct test{
string public name;
uint256 public age;
}
}
pragma solidity >- 0.7.0 < 0.9.0;
contract Test{
string[] name public;
string[3] name2 public;
string[] name3 public = ["마루치","아라치","아구몬"];
}
정적 배열 : uint[4] fixedArray
처럼 미리 사용할 배열의 크기를 지정함.
동적 배열 : uint[] dynamicArray
처럼 고정된 크기가 없어 계속 커질 수 있음.
new 키워드를 활용한 배열 : new uint[](5)
처럼 길이 인자를 반드시 명시해줘야 함.)
contract lec6{
uint256 public a = 1;
function viewExample() public view returns(uint256){
return a+2;
}
function readAndChangeA() public returns(uint256){
a = 3;
return a+2;
}
function pureExample() pure public returns(uint256){
uint256 a2 = 3;
return a2+2;
}
}
contract lec24{
event CountryIndexName(uint256 indexed _index, string _name);
string[] private countryList = ["South Korea","North Korea","USA","China","Japan"];
//Taiwan
function linearSearch(string memory _search) public view returns(uint256,string memory){
for(uint256 i=0; i<countryList.length; i++){
if(keccak256(bytes(countryList[i])) == keccak256(bytes(_search))){
return (i,countryList[i]);
}
}
return(0,"Nothing");
}
}
//3000000 gas
function assertNow() public pure{
assert(false); // test
}
//21322 gas
function revertNow() public pure{
revert("error!!"); // if or require = if + revert;
}
//21338 gas
function requireNow()public pure{
require(false,"occurred");
}
function playTryCatch(uint256 _num1, uint256 _num2) public returns(uint256,bool){
try mathInstance.division(_num1, _num2) returns(uint256 value){
return(value,true);
} catch Error(string memory _err) {
emit catchErr("revert/require",_err);
return(0,false);
} catch Panic(uint256 _errorCode) {
emit catchPanic("assertError/Panic",_errorCode);
return(0,false);
} catch (bytes memory _errorCode) {
emit catchLowLevelErr("LowlevelError",_errorCode);
return(0,false);
}
}
bool chk = "이더를 보낼주소".send(msg,value); // send를 통한 이더 송금
"이더를 보낼주소".transfer(msg.value); // transfer 를 통한 이더 송금
(bool chk ,"반환받을 인자") = "이더를 보낼주소".call.value(msg.value).gas("가스크기 지정 안해두됨")("함수를 호출할 이름"); // 0.6 버전 아래의 call 함수방법
(bool chk ,"반환받을 인자") = "이더를 보낼주소".call{value:msg.value,gas:100}('함수를 호출할 이름'); // 0.6 버전 이상 call 함수방법
modifier checkError{
require(msg.sender == owner);
_; // "_;" 이 함수가 동작할 부분을 명시해 주는 것이다.
}
// 이 함수는 스마트 컨트랙을 배포시킨 사용자만 함수를 실행 시킬 수 있으며 다른 사용자가
// 이 함수를 호출시 require의 걸려 에러를 발생시키는 구문이다.
함수제어란 : 함수가 실행되기전에 요구조건을 만족시키는지 확인하는 작업을 해준다. 요구조건을 확인하기 위해서 function함수에도 modifier 이름을 명시를 해줘야한다.
fallback이란 : fallback은 함수 이름 그대로 대비책 함수 입니다.
0.6 이후
receive : 순수하게 이더를 받을때만 작동하는 곳
fallback : 함수를 실행하면서 이더를 보낼때, 불려진 함수가 없을 때 작동하는 곳
contract Bank{
event JustFallBackWithFunds(address _from, uint256 _value, string messge);
event RecevieFallback(address _from, uint256 _value, string messge);
event JustFallbackWithFunds(address _from,string messge);
receive() external payable{ // receive 는 이더를 받을 때 호출 되는 곳 이기 때문에 상호작용을 위해서 payable이 붙는다.
// receive 는 이더를 받을 때만 수행하는 곳 이다.
emit RecevieFallback(msg.sender, msg.value, "Bank Give Ether!!!");
}
fallback() external payable{
// fallback 은 함수를 호출했을때 또는 함수를 호출 했지만 함수가 없을 경우에 수행하는 곳 이다.
emit JustFallbackWithFunds(msg.sender, "Sender Give me Ether");
}
}
0.6 이전
fallback 은 하나로 통합이 되어 움직입니다.
contract Bank{
event JustFallBackWithFunds(address _from, uint256 _value, string messge);
event RecevieFallback(address _from, uint256 _value, string messge);
event JustFallbackWithFunds(address _from,string messge);
// ~0.6 버전 이전일때
function() external payable{ // 이더와의 상호작용을 위해서 payable 이더를 받고나서 일을 해야하기때문에 external 을 명시하였다.(외부에서 이 함수를 부르기 때문에 external을 사용한 것 이다.)
emit JustFallBackWithFunds(msg.sender,msg.value,"JustFallbackFunds is called");
}
// 0.6 ~ 버전일때 두가지로 나눠진다 fallback 과 receve로
fallback() external{
emit JustFallbackWithFunds(msg.sender, "Sender Give me Ether");
}
}
// call 함수로 외부 스마트 컨트랙의 함수를 호출 하는 법
contract caller{
event calledFunction(bool _success, bytes _output);
// 외부 스마트 컨트랙 함수 부르기
function callMethod(address _contractAddr,uint256 _num1, uint256 _num2) public{
(bool success, bytes memory outputFromCalledFunction) = _contractAddr.call(
abi.encodeWithSignature("addNumber(uint256,uint256)",_num1,_num2)
);
require(success,"failed to transfer ether");
emit calledFunction(success,outputFromCalledFunction);
}
}
call 기능을 이용해 외부 스마트 컨트랙 함수를 호출을 할려면 함수를 부를 곳에
abi.encodeWithSignature("호출할 함수이름",'인자') 를 명시하면 호출이 가능하다!!
contract add{ // call 로 호출시 add의 num의 값이 증가하지만
// delegatecall로 호출시 caller의 num의 값이 증가하는 것을 알 수 있다.
uint256 public num = 0;
event Info(address _addr,uint256 _num);
function plusOne() public {
num = num + 1;
emit Info(msg.sender,num);
}
}
contract caller{
uint256 public num = 0;
function callNow(address _contractAddr) public payable{
(bool success,) = _contractAddr.call(abi.encodeWithSignature("plusOne()"));
require(success,"failed to transfer ether");
}
function delcateCallNow(address _contractAddr) public payable{
(bool success,) = _contractAddr.delegatecall(abi.encodeWithSignature("plusOne()"));
require(success,"failed to transfer ether");
}
}