- DoubleArray 복습 (추가된 코드 있음.)
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.2 <0.9.0;
contract multiArray {
uint[][] public double_A;
function setNumber(uint _a) public {
double_A.push([_a]);
}
function setNumber_2(uint _a, uint _b) public {
double_A[_a].push(_b);
}
function setNumber2(uint _a, uint _b) public {
double_A.push([_a, _b]);
}
function setNumber3(uint[] memory _a) public {
double_A.push(_a);
}
function setNumber4(uint _a, uint _b, uint _c) public {
double_A[_a][_b] = _c;
}
function getNumber(uint _a) public view returns(uint[] memory) {
return double_A[_a];
}
function getNumber2() public view returns(uint[][] memory) {
return double_A;
}
function getLength() public view returns(uint) {
return double_A.length;
}
function getLength2(uint _a) public view returns(uint) {
return double_A[_a].length;
}
}
contract multiArray2 {
uint[3][] public double_A;
/*
uint length;
uint[][] public double_A = new uint[3][](length);
*/
function setNumberA(uint _a) public {
double_A.push([_a]);
}
function setNumberA2(uint _a, uint _b) public {
double_A.push([_a, _b]);
}
function setNumberA3(uint[3] memory _a) public {
double_A.push(_a);
}
function setNumberA4(uint _a, uint _b, uint _c) public {
double_A[_a][_b] = _c;
}
function getNumber(uint _a) public view returns(uint[3] memory) {
return double_A[_a];
}
function getNumber2() public view returns(uint[3][] memory) {
return double_A;
}
function getLengthA() public view returns(uint) {
return double_A.length;
}
function getLengthA2(uint _a) public view returns(uint) {
return double_A[_a].length;
}
}
contract multiArray3 {
uint[][3] public double_A;
//uint[][] public double_A = new uint[][](3);
function setNumberA(uint _a, uint _b) public {
double_A[_a] = [_b];
}
function setNumberA_2(uint _a, uint _b) public {
double_A[_a].push(_b);
}
function setNumberA2(uint _a, uint _b, uint _c) public {
double_A[_a][_b] = _c;
}
function setNumberA3(uint _a, uint[] memory _b) public {
double_A[_a] = _b;
}
function getNumber(uint _a) public view returns(uint[] memory) {
return double_A[_a];
}
function getNumber2() public view returns(uint[][3] memory) {
return double_A;
}
function getLengthA() public view returns(uint) {
return double_A.length;
}
function getLengthA2(uint _a) public view returns(uint) {
return double_A[_a].length;
}
}
contract multiArray4 {
uint[3][3] public double_A;
function setNumberA(uint _a, uint _b, uint _c) public {
double_A[_a][_b] = _c;
}
function setNumberA2(uint _a, uint[3] memory _b) public {
double_A[_a] = _b;
}
function getLengthA() public view returns(uint) {
return double_A.length;
}
function getLengthA2(uint _a) public view returns(uint) {
return double_A[_a].length;
}
}
contract gasFee {
uint[] a;
uint[][] a_;
uint[3][] _a;
uint[3] b;
uint[][3] b_;
uint[3][3] _b;
function setA(uint _a) public {
a.push(_a); // 44773, 27673
}
function setA2(uint _a) public {
a_.push([_a]); // 67192, 50092
}
function setA3(uint _b) public {
_a.push([_b]); // 49556, 32456
}
function setA3_(uint[3] memory _b) public {
_a.push(_b); // 73333, 73333
}
function setB(uint _n, uint _a) public {
b[_n] = (_a); // 22788, 22788
}
function setB2(uint _n, uint _a) public {
b_[_n] = [_a]; // 45221, 8221
}
function setB3(uint _a, uint _bb, uint _c) public {
_b[_a][_bb] = _c; // 22951, 22951
}
}
- 내일 이론 테스트 준비.
1) 3-way방법(연결 설정을 위한 과정)
2) 4-way방법 (연결 종료를 위한 과정)
B. 1,2,3,4,5,6,7 / 4 검증
C. 1,2,3,4,5,6,7,8,9,10 / 5 검증
D. 1,2,3,4,5,6,7,8,9,10,11,12,13 / 7 검증
누구에게 처음 연락하는가 (누구의 이름과 정의):
피어(peer)라고 불리는 기존의 블록체인 네트워크 참여자에게 연락을 취한다. 이 피어들은 이미 블록체인 네트워크에 참여하고 있고, 신입노드의 참여를 승인하고 신뢰할 수 있는 노드인지 확인하는 역할을 다.
정보는 어떻게 비교하는가 (메시지 명):
블록은 이전 블록과 연결된 데이터 구조로, 트랜잭션(거래) 기록과 이를 검증하는 작업증명(Proof of Work) 등의 정보를 포함하고 있다. 신입노드는 피어로부터 전달받은 블록을 자신이 가지고 있는 블록체인과 비교하여 일치 여부를 확인한다.
정보를 주거나 받는 과정은 어떻게 되는가:
신입노드가 풀노드로 참여하기 위해서는 초기 블록체인 데이터를 다운로드해야 한다. 이를 위해 신입노드는 피어로부터 최신 블록체인 데이터를 요청하고, 피어는 해당 데이터를 신입노드에게 전송한다. 신입노드는 이후에는 피어들과 지속적으로 정보를 주고받으며, 새로운 블록을 받아들이고 검증하는 과정을 거치는데 이를 통해 신입노드는 네트워크의 상태를 업데이트하고 블록체인의 유효성을 유지하며, 풀노드로써의 역할을 수행하게 된다.
이전 블록 해시 :모든 블록은 이전 블록의 해시 값을 가지고 있다. 해시 값은 이전 블록의 데이터를 암호화한 결과로, 이전 블록과의 연결을 형성하는 역할을 한다. 이전 블록의 해시 값을 가지고 있음으로써 블록체인은 연속성을 유지하고, 변경된 블록을 감지할 수 있다
머클 루트 : 머클 루트는 트랜잭션 데이터의 무결성을 확인하기 위한 요소로 사용된다. 블록 내의 모든 트랜잭션은 해시 함수에 의해 암호화되고, 이 암호화된 해시 값들이 계층적으로 연결되어 머클 트리(Merkle Tree)를 형성한다. 머클 루트는 이 머클 트리의 루트 노드에 해당하는 해시 값으로, 모든 트랜잭션 데이터의 일관성과 무결성을 검증하는 역할을 한다
상태 트라이: 이더리움의 전역 상태 정보를 저장한다. 각 계정은 주소와 잔액, 계약 코드, 상태 변수 등의 정보를 포함하고 있다.
계약 코드 트라이: 이더리움에서 배포된 스마트 계약 코드를 저장한다. 각 계약은 고유한 주소를 가지며, 해당 주소에 대한 스마트 계약 코드를 이 트라이에서 찾을 수 있다.
트랜잭션 트라이: 이더리움에서 발생한 모든 트랜잭션을 저장하고 블록에 포함되는 트랜잭션의 유효성 검사와 관련된 정보를 제공한다.
리십 트라이: 이더리움에서 발생한 이벤트 로그를 저장합니다. 이벤트 로그는 스마트 계약에서 발생하는 특정 이벤트에 대한 정보를 담고 있으며, 로그 트라이는 블록에 포함되는 이벤트 로그들을 저장한다.
-블록에 포함되는 3개의 트라이
상태 트라이(휘발성): 계정 정보와 계약 상태
트랜잭션 트라이(영구): 송신자와 수신자, 전송하는 이더의 양, 가스 정보와 같은 트랜잭션의 상세한 정보
리십 트라이(정보): 스마트 컨트랙트에서 발생하는 특정 이벤트에 대한 정보
1.transaction trie
2.receipts trie
3.state trie
4.receipts trie
5.transaction trie
6.state trie
영구적인 정보를 저장하는 곳은 transaction Trie이고,
state Trie는 휘발성 정보를 저장하고 있다.
state trie 이더리움 네트워크에 존재하는 모든 계정에
대한 정보를 키-값 쌍으로 보관하고 있다.
이 거래가 특정 블록에 속해있나요? (transaction trie)
지난 30일동안, 이 주소에서 생성된 특정 형태의 모든 거래를 알려주세요. (receipts trie)
특정 계정의 현재 잔고가 얼마인가요? (state trie)
현재 이 계정이 존재하나요? (state trie)
특정 거래를 특정 계약에서 실행시켜보려고 합니다. 출력값이 무엇인가요? (state trie)
가스 리밋 : 개별 트랜잭션이 사용할 수 있는 최대 가스량. 가스 리밋을 넘어서는 트랜잭션은 실행되지 않으며, 가스 리밋을 낮게 설정하면 블록 내에 포함되는 트랜잭션 수가 제한될 수 있다.
블록 가스리밋 : 1개의 블록에 담길 수 있는 최대 양을 의미한다.
A 만큼의 가스 = 벽돌 갯수
가스 값 = 벽돌 가격
사용되는 가스비 = A 가스값 = 14,000,000 wei ( 70만 20 )
최대 가스비 = A 가스값 = 20,000,000 wei ( 110만 20 )
마이너 : 사용되는 가스비만큼 잔고 증가
센더 : 사용되는 가스비만큼 잔고 감소
1.gasLimit은 사용할 최대 가스양, 가스 상한선으로 gasLimit이 충분하지 않으면 트랜젝션이 리벌트가 됨(실패 할수 있음), 가스의 상한선보다 작게 잡혀 있어 가스가 부족 할수 있음,
2.체굴자 입장에서 gasLimit은 트랜젝션 작업량을 의미하여 낮으면 맨풀에서 오래 대기 해야하는 상황이 생길수 있음.
CA(Contract Account) : 거래를 스스로 일으키지 못하며, 호출이 될 때만 거래를 일으킨다.사람이 smart contract를 이용하는 것은 EOA에 의해서 호출되는 것을 의미한다.
내부에는 코드가 보관되어 있으며 개인키가 없다. 이더는 송수신할 수 있다.
EOA(Externally Owned Account) : 우리가 알고 있는 일반적인 계정이다. 내부에는 키가 보관되어 있다.일반적인 계정의 역할을 수행한다. 거래를 실질적으로 일으키는 거래의 시발점이다.
EOA
CA
private Key를 sha256를 돌려 256비트의 64자리의 랜덤 값 생성
타원 곡선 암호법을 사용하여 private Key로 Public Key생성 (K = k * G (G : 생성포인트))
Public Key를 Keccak256 해시 알고리즘을 사용해 해싱
Keccak256의 결과물의 마지막 20바이트(40개의 문자)에 0x를 붙여 이더리움 지갑 주소를 생성
- 마지막 아기사자.
- Firebase 연동.