<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Sweet But Psycho</title>
    <link>https://jemerald.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 16 Aug 2026 06:55:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>슈팅스타제제</managingEditor>
    <image>
      <title>Sweet But Psycho</title>
      <url>https://tistory1.daumcdn.net/tistory/4435511/attach/75cf7f8e9a0846a7a94245db93b54085</url>
      <link>https://jemerald.tistory.com</link>
    </image>
    <item>
      <title>23.06.30 회고</title>
      <link>https://jemerald.tistory.com/268</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;왜 원점에 돌아온 것 같은 기분일까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이 티스토리를 과연 기술 블로그라 할 수 있는가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 지금까지 작성한 글의 상태 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 어떤 부분을 개선해야 할지 리스트업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 계속 운영하는 것이 맞을지 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 앞으로 어떤 커리어를 이어갈 것인가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 지금까지 진행한 업무 포지션의 비중에 대한 분석 필요 (투자 시간, 실력 도달 범위)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 어떤 포지션에 진지하고 꾸준한 관심이 생기는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 해당 포지션의 KPI 분석, 목표 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머리가 참 아프다이&lt;/p&gt;</description>
      <category>회고 및 기타</category>
      <author>슈팅스타제제</author>
      <guid isPermaLink="true">https://jemerald.tistory.com/268</guid>
      <comments>https://jemerald.tistory.com/268#entry268comment</comments>
      <pubDate>Fri, 30 Jun 2023 19:59:13 +0900</pubDate>
    </item>
    <item>
      <title>23.06.12 Breadth First Search</title>
      <link>https://jemerald.tistory.com/267</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Breadth First Search (BFS)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;넓이 우선 탐색&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래프 또는 트리 데이터 구조를 순회하거나 검색하는 알고리즘&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BFS 의 단계&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. initialization&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 첫번째 노드를 방문하고 해당 노드의 인접 노드 모두 탐색&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 모든 노드를 방문할 때까지 해당 작업 반복&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BFS 를 구현하기 위해서는 큐 자료 구조를 이용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;BFS vs DFS&amp;nbsp;&lt;/h4&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;왜 BFS 를 구현할 때는 스택을 사용하지 않고 큐를 사용할까?&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 노드에 대한 인접 노드 정보를 저장할 때 push 하는데&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;자료 구조의 특성 상,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스택은&lt;span&gt;&amp;nbsp;가장 마지막에 넣은 노드를 꺼내게 되고&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt;큐는 가장 처음에 넣은 노드를 꺼내게 된다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt;이때, 넓이 우선 탐색을 하려면 같은 레벨의 노드를 우선적으로 탐색해야 하므로&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음 레벨의 인접 노드보다 먼저 들어간 노드를 꺼내기 위해서 큐를 사용하는 것이 바람직하다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드를 살펴보면&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686511934676&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;queue&amp;gt;
using namespace std;

bool visited[9];
vector&amp;lt;int&amp;gt; graph[9];&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;queue 에 시작 노드 입력해주고 큐를 비울 때까지 큐의 헤드 요소를 꺼내서 방문 처리를 해준다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686511949309&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void bfs(int x) {
    queue&amp;lt;int&amp;gt; nodes;
    nodes.push(x);
    visited[x] = true;

    while(!nodes.empty()) {
        int head = nodes.front();
        nodes.pop();
        cout &amp;lt;&amp;lt; head &amp;lt;&amp;lt; ' ';
        for(int i = 0; i &amp;lt; graph[head].size(); i++) {
            int y = graph[head][i];
            if(!visited[y]) {
                nodes.push(y);
                visited[y] = true;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main 함수에서 DFS 와 마찬가지로 인접 노드 설정과 bfs 함수를 실행해준다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686512254859&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main() {
    // 노드 1에 연결된 노드 정보 저장 
    graph[1].push_back(2);
    graph[1].push_back(3);
    graph[1].push_back(8);
    
    // 노드 2에 연결된 노드 정보 저장 
    graph[2].push_back(1);
    graph[2].push_back(7);
    
    // 노드 3에 연결된 노드 정보 저장 
    graph[3].push_back(1);
    graph[3].push_back(4);
    graph[3].push_back(5);
    
    // 노드 4에 연결된 노드 정보 저장 
    graph[4].push_back(3);
    graph[4].push_back(5);
    
    // 노드 5에 연결된 노드 정보 저장 
    graph[5].push_back(3);
    graph[5].push_back(4);
    
    // 노드 6에 연결된 노드 정보 저장 
    graph[6].push_back(7);
    
    // 노드 7에 연결된 노드 정보 저장 
    graph[7].push_back(2);
    graph[7].push_back(6);
    graph[7].push_back(8);
    
    // 노드 8에 연결된 노드 정보 저장 
    graph[8].push_back(1);
    graph[8].push_back(7);
    
    bfs(1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실행 결과는 다음과 같다.&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1686511987963&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## BFS
1 2 3 8 7 4 5 6

## DFS
1 2 7 6 8 3 4 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DFS 결과와 비교하면 같은 레벨의 노드부터 모두 탐색한 후에&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다음 레벨의 노드를 탐색하는 것을 확인할 수 있었다~!~!&lt;/span&gt;&lt;/p&gt;</description>
      <category>알고리즘 공부</category>
      <category>BFS</category>
      <author>슈팅스타제제</author>
      <guid isPermaLink="true">https://jemerald.tistory.com/267</guid>
      <comments>https://jemerald.tistory.com/267#entry267comment</comments>
      <pubDate>Mon, 12 Jun 2023 04:53:54 +0900</pubDate>
    </item>
    <item>
      <title>23.06.12 Depth First Search</title>
      <link>https://jemerald.tistory.com/266</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Depth First Search (DFS)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;깊이 우선 탐색&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프 또는 트리 데이터 구조를 순회하거나 검색하는 알고리즘&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;그래프에서의 DFS vs 트리에서의 DFS&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프에서는 노드를 두번 처리해버릴 수 있으므로 방문 여부를 boolean 타입으로 저장하는 배열을 사용하면 좋다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DFS vs BFS&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS 와 비교했을 때 DFS 가 어떻게 깊이 우선이 될 수 있는지 생각해보면 &lt;i&gt;(너무 당연하긴 하지만 짚어보자면)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS 는 첫번째 노드에서 다음 노드를 탐색하는 기준이 인접 노드를 탐색 후 다음 인접 노드를 탐색하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS 는 인접 노드를 모두 탐색하고 다음 노드로 넘어가기 때문에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS 는 깊이 우선, BFS 는 넓이 우선이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DFS 의 단계&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. initialization&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 첫번째 노드를 방문하고 아직 방문하지 않은 인접 노드를 탐색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 탐색한 노드 중 하나를 탐색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 해당 노드를 방문 처리 후 인접 노드를 탐색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 모든 노드를 방문할 때까지 해당 작업 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS 를 구현하기 위해서는 재귀 또는 스택 자료 구조를 이용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀를 통해 반복하냐 스택으로 탐색할 노드를 관리하냐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방식만 나뉘지 깊이 우선 이라는 점은 바뀌지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;먼저 재귀를 이용한 코드를 살펴보면&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방문 여부를 저장하는 배열과 노드 정보를 벡터로 정의해준다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686501009637&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

bool visited[9];
vector&amp;lt;int&amp;gt; graph[9]; // 아직 인접 노드를 정의하기 전이므로 1차원&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;먼저 dfs 를 실행하는 함수는 다음과 같이 정의한다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;this is 핵심~!~!&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686501120200&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dfs (int x) {
    visited[x] = true; // 방문 처리
    cout &amp;lt;&amp;lt; x &amp;lt;&amp;lt; ' ' &amp;lt;&amp;lt; endl;
    
    for(int i = 0; i &amp;lt; graph[x].size(); i++){
        int y = graph[x][i]; // 해당 노드 (x) 에 대한 모든 인접 노드 (i) 조사
        if (!visited[y]) dfs(y); // 방문 안했으면 하고
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;다음으로 스택 구조를 이용하면&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1686508295186&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;stack&amp;gt;
using namespace std;

vector&amp;lt;int&amp;gt; graph[9];
stack&amp;lt;int&amp;gt; unvisited; // 스택 구조가 추가됨. 
vector&amp;lt;bool&amp;gt; visited(9, false);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 위 노드를 스택에서 꺼내오고 방문 처리 및 스택 제거한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 현재 탐색 노드에 대한 인접 노드 배열에서 방문 처리가 되지 않았다면 스택 추가한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686508235499&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dfs(int x) {
    int current = x;
    unvisited.push(current);
    visited[current] = true;

    while(!unvisited.empty()) {
        current = unvisited.top();
        cout &amp;lt;&amp;lt; current &amp;lt;&amp;lt; endl;
        visited[current] = true;
        unvisited.pop();
        for(int i: graph[current]){
            if(!visited[i]) {
                unvisited.push(i);
                visited[i] = true;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main 함수에서 인접 노드를 설정하고 노드 1번부터 DFS 단계를 실행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1686508249977&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main() {
    // 노드 1에 연결된 노드 정보 저장 
    graph[1].push_back(2);
    graph[1].push_back(3);
    graph[1].push_back(8);
    
    // 노드 2에 연결된 노드 정보 저장 
    graph[2].push_back(1);
    graph[2].push_back(7);
    
    // 노드 3에 연결된 노드 정보 저장 
    graph[3].push_back(1);
    graph[3].push_back(4);
    graph[3].push_back(5);
    
    // 노드 4에 연결된 노드 정보 저장 
    graph[4].push_back(3);
    graph[4].push_back(5);
    
    // 노드 5에 연결된 노드 정보 저장 
    graph[5].push_back(3);
    graph[5].push_back(4);
    
    // 노드 6에 연결된 노드 정보 저장 
    graph[6].push_back(7);
    
    // 노드 7에 연결된 노드 정보 저장 
    graph[7].push_back(2);
    graph[7].push_back(6);
    graph[7].push_back(8);
    
    // 노드 8에 연결된 노드 정보 저장 
    graph[8].push_back(1);
    graph[8].push_back(7);
    
    dfs(1); // 첫번째 노드 가쥬아
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TODO: 연결되어 있지 않은 노드를 탐색하는 경우를 처리하는 코드 추가 필요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;실행 결과&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 구현 방식으로 실행했을 때, 같은 레벨의 노드에서는 랜덤으로 방문하지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공통적으로 깊이 우선으로 실행된 것을 확인할 수 있었다~!&lt;/p&gt;
&lt;pre id=&quot;code_1686509145629&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## 재귀
1 2 7 6 8 3 4 5

## 스택
1 8 7 6 3 5 4 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘 공부</category>
      <category>DFS</category>
      <author>슈팅스타제제</author>
      <guid isPermaLink="true">https://jemerald.tistory.com/266</guid>
      <comments>https://jemerald.tistory.com/266#entry266comment</comments>
      <pubDate>Mon, 12 Jun 2023 03:49:19 +0900</pubDate>
    </item>
    <item>
      <title>23.05.31 회고</title>
      <link>https://jemerald.tistory.com/265</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;연말, 월말이라는 것에 딱히 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;특별함을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;못 느끼는 사람이었지만&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이상하게 5월 마지막 날을 지나는 이 순간에 갑자기 스쳐가는 생각이 많아졌다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;뭐 원래도 고민이나 잡생각은 많았지만 저녁 기차를 타고 창밖을 보다 보니&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;파노라마처럼 오늘, 이번 주, 이번 달, 상반기의 기억들이 지나갔다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벌써 5월이 끝났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5월에 블로그 글 하나는 쓰고 싶었는데 남아있는 임시저장에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끄적거린 글들을 완성시키고 싶은 마음은 아직 안 생기기도 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 적은 일기도 짧고 중구난방으로 적어버린 낙서 수준이어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 떠오르는 생각들을 모아 오랜만에&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;한 호흡의 유의미한 글로 적어놓고 싶었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 우리는 기대하는 수준까지 올라가는 게 아니라, 훈련한 수준까지 떨어진다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 주말&amp;nbsp;해커톤을 나가게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작 당일에 환경 세팅부터 빌드한 진정한 해커톤이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt; 첫날에는 야심차게 클린 코드로 짜다가 나중에는 마음이 급해져서&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컨벤션도 잘 못 지키고 commitment 가 해시값이라 16진수로만 이루어져야 하는데&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;f 를 넘겨버리는 기본적인 실수도 하게 되었다...하&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;객관적으로 1인분을 못했다고 생각이 들어서 팀원들에게는 너무 미안하고 나 스스로 속상하기도 했지만&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;한편으로 다행이라는 생각이 들었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;계속 모르는 상태로 넘어갔을 수도 있었던 건데 내가 어떤 부분이 부족한지 제대로 느껴서 뭔가 건강검진 받은 기분이었다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Hit the Limit&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부하고 있는 내용이 그냥 커피였다면 T.O.P 수준의 프로덕트를 빌드하게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아이데이션 단계에서 나오는 대화도 처음 듣는 것이 많았고 이해하기까지 시간도 걸리고 힘들긴 했지만&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그만큼 짧은 시간에 많은 정보들을 습득하게 되었고 이제는 용어도 몰라서 벅찬 수준은 벗어나게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 해커톤의 슬로건이 Hit the Limit 이었는데 제대로 hit 했다. (동시에 hit-hit-&quot;hit&quot; 이기도 했다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 왜? 라는 물음에 파고드는 힘이 결국 이해력을 결정하는 것을 깨달았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커톤에 같이 나갔던 기획자분이 굉장히 논리적이셨는데 pain point 를 명확히 정리하는 능력이 대단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 프로덕트의 단위를 굉장히 잘게 분해해서 하나 하나 왜? 라는 질문으로 논리를 부여하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝에 큰 그림을 완성해내셨는데 나도 그 질문에 같이 흐름을 따라가다가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;덕분에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;전체적인 프로세스를 이해할 수 있게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 가짜 지식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼마전 AI 관련 유튜브 영상을 보다가 뇌의 학습 원리와&amp;nbsp;가짜 지식이라는 것에 대해 생각해보게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가짜 지식...그냥 난데..? 너무 찔렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 착각을 할 때가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;남에게 깔끔한 설명을 들었다고 내가 아는 것이 되는 게 아닌데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 술술 이해했다고 하더라도 내 머리로 꼭꼭 씹어먹는 과정이 없으면 (있더라도 다시 복기하지 않는다면)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그냥 휘발된다는 것을 알고 있었지만 머릿속에서 다시 생각하기 귀찮아서 나중에 찾아보자~ 하고 넘긴 적이 굉장히 많다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그게 쌓여서 큰 구멍이 생기는 것 같다...할 때 제대로 하자.&amp;nbsp; 나는 아무것도 모른다.&lt;/p&gt;</description>
      <category>회고 및 기타</category>
      <author>슈팅스타제제</author>
      <guid isPermaLink="true">https://jemerald.tistory.com/265</guid>
      <comments>https://jemerald.tistory.com/265#entry265comment</comments>
      <pubDate>Wed, 31 May 2023 23:58:29 +0900</pubDate>
    </item>
    <item>
      <title>23.04.28 [ZK] R1CS</title>
      <link>https://jemerald.tistory.com/264</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;zkSNARK 에 사용되는 R1CS 에 대해 이해한대로 정리해보았다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- what is zk-SNARK?&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zkSNARK 는 영지식증명 중에서도 비대화형으로 &lt;b&gt;zcash&lt;/b&gt; 프로토콜에서 알고리즘으로 개발되어 사용되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;zk 가 나오게 된 배경, optimistic-rollup vs zk-rollup, zkVM vs zkEVM, zk-SNARK vs zk-STARK 등의 개념은 따로 정리해야겠다.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- what is R1CS?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영지식증명에서는 증명에 사용되는 복잡한 computational statements 를 산술 회로로 모델링하여 계산하는 과정이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 연산 과정을 최대한 단순화하여 모델링하기에 용이한 시스템으로 이해했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤에서 설명할 예시는 간단하지만 복잡한 시스템을 R1CS 로 모델링하기 위해서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 circuit 으로 회로를 디자인하고 연산, 증명 및 결과 zkey 를 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iden3 에서 제공하는 SNARKjs 라이브러리가 있는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 사용하면 키 생성 및 연산 결과가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;진짜 너무 간단하게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;도출되어 생각보다 허무했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Rank 1 Constraint System&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용어에 대해 살펴보자면, rank 1 행렬은 선형 독립 연산으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬을 소거했을 때 만들어지는 피봇 행렬이 최대 1 인 행렬이며,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;constraint 는 회로 연산을 표현한 방정식이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R1CS 에서는 3가지 연산 (덧셈, 곱셈, 뺄셈) 만 다루는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나눗셈, 모듈러 연산 같은 경우에는 덧셈, 곱셈으로 다시 나타낼 수 있기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- example of R1CS&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 임의의 해시 함수가 있다고 할 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;증명자는 검증자에게 해당 해시 함수를 알고 있다는 사실을 증명하기 위해 4를 대입한 값인 72 를 output 으로 제출할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-30 오후 8.24.04.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/te53G/btsdtGNXQL6/l7n7BVtL5W39jiPNgbGu6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/te53G/btsdtGNXQL6/l7n7BVtL5W39jiPNgbGu6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/te53G/btsdtGNXQL6/l7n7BVtL5W39jiPNgbGu6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fte53G%2FbtsdtGNXQL6%2Fl7n7BVtL5W39jiPNgbGu6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;447&quot; height=&quot;62&quot; data-filename=&quot;스크린샷 2023-04-30 오후 8.24.04.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 검증자는 증명자가 4 라는 값을 사용하여 연산했다는 사실을 모르며,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;72 라는 output 과 연산에 사용된 중간값만 가지고도 증명자가 h(x) 에 대한 연산을 했다는 사실을 검증할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계산 과정을 말로 풀어보자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;h(x) 함수의 변수 x 에 대한 차수를 2차로 내리기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 곱셈 연산으로 이루어진 식 x * x 를 변수 sym1 으로 치환한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 2차로 내려진 식을 다시 1차로 내리기 위해 x * sym1 을  y 로 치환한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 치환한 y - x 를 sym2 로 치환하면 output 에 대한 연산은 치환한 변수를 사용하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;output = sym2 + 7 로 나타낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 식을 곱셈 연산 (c=a*b) 의 형태로 나타낼 수 있는데 (1, x, output, sym1, y, sym2 순으로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, sym1 = x * x 같은 경우에는&amp;nbsp;&amp;nbsp;a = [0, 1, 0, 0, 0, 0] b = [0, 1, 0, 0, 0, 0] c=[0, 0, 0, 1, 0 , 0]&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;y = x * sym1 은 a = [0, 1, 0, 0, 0, 0] b = [0, 0, 0, 1, 0 , 0] c = [0, 0, 0, 0, 1, 0]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sym2 = y - x 는 (y-x)*1 로 나타낼 수 있기 때문에 a = [0, -1, 0, 0, 1, 0] b =[1, 0, 0, 0, 0, 0] c = [0, 0, 0, 0, 0, 1]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;output = sym2 + 7 도 (sym2 + 7)* 1로 나타낼 수 있기 때문에 a = [7, 0, 0, 0, 0, 1] b = [1, 0, 0, 0, 0, 0] c = [0, 0, 1, 0, 0, 0]&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그르면 이제 1차로 내린 행렬 a 들에 대한 행렬 A, b 들에 대한 행렬 B, c 들에 대한 행렬 C 를 만들 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 c = a*b 즉, a*b-c = 0 이며 이를  A, B, C 행렬에 대한 스칼라곱 연산으로 변환할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 수식에서 S 는 곱셈 연산으로 나타내기 위해 지정한 1, x, output, sym1, y, sym2 에 대한 basis 행렬이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 S 의 output 가 7 일 경우, 아래 식을 만족하는 행렬 S 를 계산함으로써 증명이 맞는지 검증할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-30 오후 9.21.32.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTSepY/btsdjotSela/adryGS9rGjxoOd82VQWI01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTSepY/btsdjotSela/adryGS9rGjxoOd82VQWI01/img.png&quot; data-alt=&quot;행렬 C 를 이항하는 이유는 R1CS 는 영벡터를 포함해야 하기 때문인가?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTSepY/btsdjotSela/adryGS9rGjxoOd82VQWI01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTSepY%2FbtsdjotSela%2FadryGS9rGjxoOd82VQWI01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;91&quot; data-filename=&quot;스크린샷 2023-04-30 오후 9.21.32.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;행렬 C 를 이항하는 이유는 R1CS 는 영벡터를 포함해야 하기 때문인가?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- circuit of zk-SNARK&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 연산을 Circom 의 circuit 으로 회로 게이트 연산을 작성 및 모듈화할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1682857825181&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// circuit.circom 

template BadHash() {
	signal private input x;
	signal x_squared;
	siganl x_cubed; 
	signal output out; 

	x_squared &amp;lt;== x * x; 
	x_cubed &amp;lt;== x_squared * xl 
	out &amp;lt;== x_cubed - x * 7;
}

component main = BadHash();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;증명자가 계산하는데 사용한 중간 값에 대한 변수는 회로 연산에서 신호 signal 로 나타낼 수 있다. (circom 에서 다루는 변수 타입인 듯)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;증명자가 사용한 값 x 인풋값은 검증자에게 알리면 안되므로 private 으로 정의한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;circom 에서 다루는 연산 기호에 대해 간단히 살펴보자면,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;+ 는 signal 변수에 대한 &lt;b&gt;초기값을 할당&lt;/b&gt;하는 역할을 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;js 의 = 대입 연산자랑 비슷한 역할을 하나? 생각했었는데 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;값 할당 외에도 추가적인 constraints 를 설정할 수 있는 역할이 있다고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그때 이 연산자가 어떻게 작동하는지는 잘 모르겠다. 그리고 초기값으로 설정된 해당 신호의 R1CS 는 a = 3 이 아니라 a - 3 = 0 이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682858088876&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a &amp;lt;+ 3;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &amp;lt;== 연산 같은 경우는  할당은 할당인데 &lt;b&gt;조건부 할당&lt;/b&gt;이 가능한 연산자이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1682858481238&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x_squared &amp;lt;== x * x;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT 에 따르면, &lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;, &lt;/span&gt;a &amp;lt;== (b &amp;lt; c ? 1 : 0)&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;은 &lt;/span&gt;b &amp;lt; c&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;라는 조건이 참이면 &lt;/span&gt;a&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;에 &lt;/span&gt;1&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;을, 거짓이면 &lt;/span&gt;a&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;에 &lt;/span&gt;0&lt;span style=&quot;background-color: #f7f7f8; color: #374151; text-align: start;&quot;&gt;을 할당 &lt;/span&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;한다고 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- 적고보니 드는 의문&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 행렬 S 에서 output 값으로 인해 x 값이 도출되는 것은 증명자만 알고 있는 사실인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것이 로컬(레이어2)에서 계산되어 레이어 1으로 올라가는건가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. SNARK js 에서 증명 연산 결과와 함께 생성되는 증명키, 확인키에는 어떤 값으로 계산되는 것인지 궁금&lt;/p&gt;</description>
      <category>암호학</category>
      <author>슈팅스타제제</author>
      <guid isPermaLink="true">https://jemerald.tistory.com/264</guid>
      <comments>https://jemerald.tistory.com/264#entry264comment</comments>
      <pubDate>Sun, 30 Apr 2023 21:44:32 +0900</pubDate>
    </item>
    <item>
      <title>23.03.12 EIP-1559 가스비 메커니즘</title>
      <link>https://jemerald.tistory.com/263</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션 날릴 때, 제일 머리가 아픈게 fee 이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이더리움의 경우, 단순히 gasPrice * gasLimit 계산해서 넣어주는 것으로 생각하고 있었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;런던 하드포크 &lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;12,965,000 블록부터&lt;/span&gt;&amp;nbsp;EIP-1559 가 반영되었다... 그걸 이제야 공부하다니 반성해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;EIP-1559 는 왜 도입되었는가?&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 가스비 변동에 대한 불확실성 감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;estimate 를 통해 평균 가스비를 알 수는 있었지만 시장 원리에 의해 마이너는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 큰 금액의 가스비를 지불하는 트랜잭션을 우선적으로 블록에 포함시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때문에 트랜잭션의 블록 포함 여부는 불확실성이 컸는데 이 문제를 해결하기 위해 기본 fee 개념인 baseFee 를 포함하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 블록 사이즈 (단위 블록에 포함되는 가스 수량) 를 통한 트랜잭션 수요 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록 사이즈는 트랜잭션 수요에 대한 지표가 되는데 이전 블록 사이즈와 비교하여 수요가 증가했는지 감소했는지 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록 사이즈 범위 공식 참조*&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;어떤 점이 달라졌는가?&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 트랜잭션은 논스값, gasPrice, gasLimit, 전송 주소, 전송 금액, 트랜잭션 데이터, 서명값을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RLP 인코딩한 데이터로 이루어져있는 구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이 트랜잭션 타입은 EIP-1559 에서 &lt;b&gt;LegacyTransaction&lt;/b&gt; 타입으로 분류되었다.&amp;nbsp;&lt;span style=&quot;color: #24292f; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1678633208096&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rlp([nonce, gasPrice, gasLimit, to, value, data, v, r, s])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바뀐 &lt;span style=&quot;color: #24292f; text-align: left;&quot;&gt;&lt;b&gt;TransactionType&lt;/b&gt; || &lt;b&gt;TransactionPayload&lt;/b&gt;&lt;/span&gt; 타입은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 트랜잭션과 달라진 점은 체인 아이디, &lt;span style=&quot;color: #384248; text-align: start;&quot;&gt;maxPriorityFeePerGas, &lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;maxFeePerGas, destination, (value -&amp;gt; amount) 이다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(해당 트랜잭션 타입은 트랜잭션 전송의 경우이고 블록에 올라간 트랜잭션 타입은 따로 있고 gasUsed 가 쵸큼 바뀜. )&lt;/p&gt;
&lt;pre id=&quot;code_1678633475483&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0x02 || rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, amount, data, access_list, signature_y_parity, signature_r, signature_s])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가스비 측면에서 개념적으로 바뀐 부분은 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;baseFee&lt;/b&gt;&lt;br /&gt;&lt;b&gt;maxPriorityFeePerGas&lt;/b&gt;: gasPrice - baseFee&lt;br /&gt;&lt;b&gt;maxFeePerGas&lt;/b&gt;: baseFee * 2 + maxPriorityFeePerGas&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #24292f; text-align: start;&quot;&gt;따라서 &lt;span style=&quot;color: #384248; text-align: start;&quot;&gt;&lt;b&gt;maxPriorityFeePerGas&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;&lt;b&gt;maxFeePerGas&lt;/b&gt;&lt;span&gt; 중에 하나만&lt;/span&gt;&amp;nbsp;설정해주면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그로 인한 효과는?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;유저는 사실&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;gasPrice -&amp;gt; {baseFee 와 tip(maxPriorityFeePerGas)} 으로 세분화된 것으로 생각하면 되지만,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;마이너(PoS 에서는 밸리데이터) 의 입장에서는 &lt;/span&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;baseFee 는 burn 되고,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;남은 maxFee 에서 tip 을 제외한 양은 유저에게 돌아가며 &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #37383c; text-align: left;&quot;&gt;유저가 지불한 tip 만 보상으로 받는다..&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR5obu/btr3Bwt1luy/ZPfQYkLZQNcNAZE8sqqdW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR5obu/btr3Bwt1luy/ZPfQYkLZQNcNAZE8sqqdW0/img.png&quot; data-alt=&quot;기존 트랜잭션에 대한 minorFee&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR5obu/btr3Bwt1luy/ZPfQYkLZQNcNAZE8sqqdW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR5obu%2Fbtr3Bwt1luy%2FZPfQYkLZQNcNAZE8sqqdW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;457&quot; height=&quot;260&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기존 트랜잭션에 대한 minorFee&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-13 오전 12.49.37.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/45guY/btr3eALF9b8/F7PPqKm1KKkzD3oheQjVQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/45guY/btr3eALF9b8/F7PPqKm1KKkzD3oheQjVQ1/img.png&quot; data-alt=&quot;EIP-1559 이후 트랜잭션에 대한 validatorFee&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/45guY/btr3eALF9b8/F7PPqKm1KKkzD3oheQjVQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F45guY%2Fbtr3eALF9b8%2FF7PPqKm1KKkzD3oheQjVQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;464&quot; height=&quot;262&quot; data-filename=&quot;스크린샷 2023-03-13 오전 12.49.37.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;EIP-1559 이후 트랜잭션에 대한 validatorFee&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 참고문서에서 가스비가 올라가면서 마이너 fee 가 증가할 수도 있다는 점을 확인할 수 있었다~!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;앞으로는 miner fee / validator fee 로 용어를 구분해야겠다~!&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;메타마스크 고-급 가스 제어 기능&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메타마스크에서는 설정에서 해당 기능 토글 온하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 유저가 tip 값을 설정할 수 있도록 제공하고 있다~!~!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-13 오전 12.34.16.png&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHRWcf/btr3lENgnGZ/QyePPx8BmW6Vqk68KJ1Itk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHRWcf/btr3lENgnGZ/QyePPx8BmW6Vqk68KJ1Itk/img.png&quot; data-alt=&quot;가스비 설정 단계에서 위 [시장] 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHRWcf/btr3lENgnGZ/QyePPx8BmW6Vqk68KJ1Itk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHRWcf%2Fbtr3lENgnGZ%2FQyePPx8BmW6Vqk68KJ1Itk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;403&quot; height=&quot;144&quot; data-filename=&quot;스크린샷 2023-03-13 오전 12.34.16.png&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가스비 설정 단계에서 위 [시장] 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-13 오전 12.35.00.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daa8nu/btr3cJCAnsA/NzvIK7fmrnSDgHzHaKjtrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daa8nu/btr3cJCAnsA/NzvIK7fmrnSDgHzHaKjtrk/img.png&quot; data-alt=&quot;가스 옵션 [고급] 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daa8nu/btr3cJCAnsA/NzvIK7fmrnSDgHzHaKjtrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdaa8nu%2Fbtr3cJCAnsA%2FNzvIK7fmrnSDgHzHaKjtrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;376&quot; height=&quot;265&quot; data-filename=&quot;스크린샷 2023-03-13 오전 12.35.00.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가스 옵션 [고급] 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;1004&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIeYUw/btr3dbFEqys/9qNjOvVOnt6VXzmk7dSlLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIeYUw/btr3dbFEqys/9qNjOvVOnt6VXzmk7dSlLk/img.png&quot; data-alt=&quot;[우선 요금] tip 값 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIeYUw/btr3dbFEqys/9qNjOvVOnt6VXzmk7dSlLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIeYUw%2Fbtr3dbFEqys%2F9qNjOvVOnt6VXzmk7dSlLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;334&quot; height=&quot;529&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;1004&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[우선 요금] tip 값 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고문서링크&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/@mrclo0116/eip-1559%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-29e9da06fff2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/@mrclo0116/eip-1559%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-29e9da06fff2&lt;/a&gt; [정독할 것]&lt;/p&gt;
&lt;figure id=&quot;og_1678635896065&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;EIP-1559란 무엇인가&quot; data-og-description=&quot;EIP-1559는 고정 수수료와 블록 사이즈의 유동성을 도입한 새로운 트랜잭션 수수료 가격 매커니즘으로, 이더리움의 이코노미 구조에 커다란 영향을 준 업데이트이다.&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@mrclo0116/eip-1559%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-29e9da06fff2&quot; data-og-url=&quot;https://medium.com/@mrclo0116/eip-1559%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-29e9da06fff2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b3FYx1/hyRTIUmnoz/oSi2OCcv91nQcn51jFC831/img.png?width=1200&amp;amp;height=251&amp;amp;face=0_0_1200_251&quot;&gt;&lt;a href=&quot;https://medium.com/@mrclo0116/eip-1559%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-29e9da06fff2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@mrclo0116/eip-1559%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-29e9da06fff2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b3FYx1/hyRTIUmnoz/oSi2OCcv91nQcn51jFC831/img.png?width=1200&amp;amp;height=251&amp;amp;face=0_0_1200_251');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;EIP-1559란 무엇인가&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;EIP-1559는 고정 수수료와 블록 사이즈의 유동성을 도입한 새로운 트랜잭션 수수료 가격 매커니즘으로, 이더리움의 이코노미 구조에 커다란 영향을 준 업데이트이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.alchemy.com//blog/eip-1559&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.alchemy.com//blog/eip-1559&lt;/a&gt; [정독할 것 22]&lt;/p&gt;
&lt;figure id=&quot;og_1678634973824&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;The Developer EIP-1559 Prep Kit&quot; data-og-description=&quot; &quot; data-og-host=&quot;www.alchemy.com&quot; data-og-source-url=&quot;https://www.alchemy.com//blog/eip-1559&quot; data-og-url=&quot;https://www.alchemy.com//blog/eip-1559&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UcCKO/hyRTKLmGBt/pDKk7KPyrFJnXbv43sCPk0/img.jpg?width=2540&amp;amp;height=1520&amp;amp;face=0_0_2540_1520,https://scrap.kakaocdn.net/dn/eeOoW9/hyRTS3GnLR/oZG7Tj7gFnwpITSuclJTNk/img.jpg?width=2540&amp;amp;height=1520&amp;amp;face=0_0_2540_1520,https://scrap.kakaocdn.net/dn/xgW22/hyRTVzlT5M/Jef1qVFdrYHMOgv7OlyMDK/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://www.alchemy.com//blog/eip-1559&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.alchemy.com//blog/eip-1559&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UcCKO/hyRTKLmGBt/pDKk7KPyrFJnXbv43sCPk0/img.jpg?width=2540&amp;amp;height=1520&amp;amp;face=0_0_2540_1520,https://scrap.kakaocdn.net/dn/eeOoW9/hyRTS3GnLR/oZG7Tj7gFnwpITSuclJTNk/img.jpg?width=2540&amp;amp;height=1520&amp;amp;face=0_0_2540_1520,https://scrap.kakaocdn.net/dn/xgW22/hyRTVzlT5M/Jef1qVFdrYHMOgv7OlyMDK/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;The Developer EIP-1559 Prep Kit&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.alchemy.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1678633874762&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - ethereum/EIPs: The Ethereum Improvement Proposal repository&quot; data-og-description=&quot;The Ethereum Improvement Proposal repository. Contribute to ethereum/EIPs development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md&quot; data-og-url=&quot;https://github.com/ethereum/EIPs&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1BMei/hyRTWdWqk9/IKsUuwyBjyAuzUSVHIUnAk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1559.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1BMei/hyRTWdWqk9/IKsUuwyBjyAuzUSVHIUnAk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - ethereum/EIPs: The Ethereum Improvement Proposal repository&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Ethereum Improvement Proposal repository. Contribute to ethereum/EIPs development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>이더리움</category>
      <category>baseFee</category>
      <category>EIP1559</category>
      <category>gas</category>
      <category>maxPriorityFee</category>
      <category>TIP</category>
      <author>슈팅스타제제</author>
      <guid isPermaLink="true">https://jemerald.tistory.com/263</guid>
      <comments>https://jemerald.tistory.com/263#entry263comment</comments>
      <pubDate>Mon, 13 Mar 2023 01:18:40 +0900</pubDate>
    </item>
    <item>
      <title>23.03.12 SSZ Simple Serialize</title>
      <link>https://jemerald.tistory.com/262</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSZ 란? &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSZ 는 비콘 체인에서 사용하는 직렬화 방법으로 Merklization 을 하기 위한 데이터 정렬 작업이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 레이어에서 RLP 직렬화 작업이 이루어졌다면, 합의 레이어에서는 SSZ 로 직렬화 작업이 이루어진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 직렬화란 무엇인가?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 구조를 저장 또는 다른 노드와 데이터 통신할 경우, 파싱할 수 있는 형태로 만들기 위해서 변환하는 작업을 말한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 참조형 데이터를 통신하는 경우, 메모리 주소에 있는 값을 참조하게 되는데&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이때, 데이터를 받은 노드의 메모리 주소에는 다른 값이 존재할 수 있기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참조형 데이터의 주소값에 대한 데이터를 값 타입 데이터로 변환하는 작업을 거쳐야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이더리움에서의 직렬화는 &lt;b&gt;unsigned int&lt;/b&gt; 와 &lt;b&gt;boolean&lt;/b&gt; 의 기본 타입 변수로 변환하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSZ 의 offset 과 바이트 스트림 형태&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 타입의 변수는 고정 길이로 little-endian 바이트로 변환하는 작업만 하면 되지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Struct 타입과 같은 가변 길이의&amp;nbsp;&lt;/span&gt;데이터는 offset 이 적용된 값으로 처리된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;아래는 Struct -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;unsigned int 로 offset 을 적용한 직렬화 예시이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1678624784105&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Dummy {
    number1: u64, 
    number2: u64, 
    vector: Vec&amp;lt;u8&amp;gt;, 
    number3: u64
}

dummy = Dummy {
    number1: 37, 
    number2: 55, 
    vector: vec![1, 2, 3, 4], 
    number3: 22,
}

serialized = ssz.serialized(dummy)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;serialized 에 담기는 값은 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1678624904400&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[37, 0, 0, 0, 55, 0, 0, 0, 16, 0, 0, 0, 22, 0, 0, 0, 1, 2, 3, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 벡터 위치에는 offset 값이 들어가고 벡터 값은 number 3 의 값 뒤에 위치한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서, 16의 의미는 벡터에 대한 값이 어느 위치에서 시작하는지 나타내는 값이다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(벡터값 1, 2, 3, 4 가 인덱스 16 에서 시작하므로 해당 값을 넣어준 것이며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가변 길이 타입의 실제 값은 직렬화 데이터 끝에 있는 힙에 저장된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 number 1 변수를 little-endian 바이트로 인코딩한 것은 실제로 32비트의 값을 가지지만,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;예시에서는 u64 변수와 벡터 변수의 위치 관계를 명시하기 위해서[37, 0, 0, 0, ...] 의 4비트 자리로 표현하였다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 인코딩된 바이트 스트림 형태는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1678625197874&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[
  10100101000000000000000000000000  # little-endian encoding of `number1`
  10110111000000000000000000000000  # little-endian encoding of `number2`.
  10010000000000000000000000000000  # The &quot;offset&quot; that indicates where the value of `vector` starts (little-endian 16).
  10010110000000000000000000000000  # little-endian encoding of `number3`.
  10000001100000101000001110000100   # The actual value of the `bytes` field.
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Merklization&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSZ 직렬화 과정을 거치면 머클 루트 계산 가능하다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.47.29.png&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lvR4p/btr3ex9cAUv/kkJIIRxZ3xkm76p8zAx5kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lvR4p/btr3ex9cAUv/kkJIIRxZ3xkm76p8zAx5kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lvR4p/btr3ex9cAUv/kkJIIRxZ3xkm76p8zAx5kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlvR4p%2Fbtr3ex9cAUv%2FkkJIIRxZ3xkm76p8zAx5kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;395&quot; height=&quot;273&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.47.29.png&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 계산한 SSZ 값에 대한 머클 루트를 계산하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 각 leaf 에 대한 일반화 지수에 대한 계산 식은 다음과 같다. (결국에는 노드 인덱스)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2 ** 요소의 depth + 해당 열에서 요소의 index&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.51.25.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YkfjN/btr3lDOkmU4/wqkR8E6Ltd3FlDdNk43mJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YkfjN/btr3lDOkmU4/wqkR8E6Ltd3FlDdNk43mJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YkfjN/btr3lDOkmU4/wqkR8E6Ltd3FlDdNk43mJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYkfjN%2Fbtr3lDOkmU4%2FwqkR8E6Ltd3FlDdNk43mJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;168&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.51.25.png&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;MultiProof&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;Merklization 는  proof (아마 트랜잭션 결과에 대한 proof 말하는 듯?) 루트값에 대한 검증이 가능하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같은 트리 형태인 경우,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9번 값을 검증하기 위해 먼저, 해시&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(8, 9)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;와 해시(4) 가 같은지 확인해야 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 값에 5를 해시하고(=&amp;gt; 해시 2) 또, 해당 값에 3을 해시하여 (=&amp;gt; 해시 루트 1)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 인덱스의 해시 루트 값을 생성하는 식이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 이 과정에서 데이터가 잘못되었을 경우, 루트값이 바뀌므로 다중 증명 검증이 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.58.37.png&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drDljh/btr3ogrPyez/rIlkUhXTkUq9HnTNiVEDKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drDljh/btr3ogrPyez/rIlkUhXTkUq9HnTNiVEDKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drDljh/btr3ogrPyez/rIlkUhXTkUq9HnTNiVEDKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrDljh%2Fbtr3ogrPyez%2FrIlkUhXTkUq9HnTNiVEDKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;194&quot; data-filename=&quot;스크린샷 2023-03-12 오후 10.58.37.png&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 직렬화는 노드의 트랜잭션 처리를 위한 개념이지만, 데이터가 어떻게 직렬화된 것인지 알아보는 것은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;곧 인코딩이 어떻게 처리되었는지 이해하는 것이기 때문에 필요한 개념이라고 생각한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 네트워크의 주소 유효성 검사, 니모닉 유효성 검사를 무지성 처리하기 전에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 인코딩 방식으로 데이터가 처리되었는지 확인해봐야겠다~!~!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고문서링크&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ethereum.org/en/developers/docs/data-structures-and-encoding/ssz/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ethereum.org/en/developers/docs/data-structures-and-encoding/ssz/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1678622456519&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Home | ethereum.org&quot; data-og-description=&quot;Ethereum is a global, decentralized platform for money and new kinds of applications. On Ethereum, you can write code that controls money, and build applications accessible anywhere in the world.&quot; data-og-host=&quot;ethereum.org&quot; data-og-source-url=&quot;https://ethereum.org/en/developers/docs/data-structures-and-encoding/ssz/&quot; data-og-url=&quot;https://ethereum.org&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ethereum.org/en/developers/docs/data-structures-and-encoding/ssz/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ethereum.org/en/developers/docs/data-structures-and-encoding/ssz/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Home | ethereum.org&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ethereum is a global, decentralized platform for money and new kinds of applications. On Ethereum, you can write code that controls money, and build applications accessible anywhere in the world.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ethereum.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>이더리움</category>
      <author>슈팅스타제제</author>
      <guid isPermaLink="true">https://jemerald.tistory.com/262</guid>
      <comments>https://jemerald.tistory.com/262#entry262comment</comments>
      <pubDate>Sun, 12 Mar 2023 23:08:46 +0900</pubDate>
    </item>
    <item>
      <title>23.03.09 [ResourceNotFound]not found nft</title>
      <link>https://jemerald.tistory.com/261</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;caver 로 NFT 컨트랙트 주소를 통해 데이터를 받아오는 중에 다음과 같은 에러 메세지가 나왔다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1678341881509&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{&quot;_code&quot;: 1040400, &quot;_message&quot;: &quot;[ResourceNotFound]not found nft&quot;, &quot;_requestId&quot;: &quot;8f011c9a-f0de-936d-9206-db855f38aa22&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인은 크게 세가지로 보고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 클레이튼 메인넷 호출 여부 (chainId)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. contract address&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. EOA address 인자값을 체크했는데 다 이상없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 이상한 것은 같은 클레이튼 네트워크의 다른 컨트랙트 NFT 는 다 잘 나오는데&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;얘만&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;안나온다했더니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 컨트랙트의 Account Key 값이 &lt;b&gt;AccountKeyFail&lt;/b&gt; 상태였다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-09 오후 4.09.13.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIpRl7/btr2O2ChoYz/VJDX5kQBO8Os4xi7KrF0e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIpRl7/btr2O2ChoYz/VJDX5kQBO8Os4xi7KrF0e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIpRl7/btr2O2ChoYz/VJDX5kQBO8Os4xi7KrF0e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIpRl7%2Fbtr2O2ChoYz%2FVJDX5kQBO8Os4xi7KrF0e1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;212&quot; data-filename=&quot;스크린샷 2023-03-09 오후 4.09.13.png&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키값의 상태는 총 5개로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-key=&quot;d4c6f4c5509f4d9d8ad54112e9efa1b7&quot; data-rnwilink--1t57rxo-=&quot;true&quot; data-rnwilink--jv503u-1ddef8g-hover=&quot;true&quot; data-rnwi-handle=&quot;nearest&quot;&gt;&lt;span data-key=&quot;f5e42be0c8e440c2a80ff70beb01100e&quot;&gt;&lt;span data-offset-key=&quot;f5e42be0c8e440c2a80ff70beb01100e:0&quot;&gt;1. AccountKeyLegacy&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-key=&quot;6f1b66255d384208a6931881b8aed6f5&quot; data-rnwilink--1t57rxo-=&quot;true&quot; data-rnwilink--jv503u-1ddef8g-hover=&quot;true&quot; data-rnwi-handle=&quot;nearest&quot;&gt;&lt;span data-key=&quot;192c9280753d4803a792c0c9d718c1c5&quot;&gt;&lt;span data-offset-key=&quot;192c9280753d4803a792c0c9d718c1c5:0&quot;&gt;2. AccountKeyPublic&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-key=&quot;c16014f8ffab48edbb675ffbcffcf3e6&quot;&gt;&lt;span data-offset-key=&quot;c16014f8ffab48edbb675ffbcffcf3e6:0&quot;&gt;3. &lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;/content/klaytn/design/accounts#accountkeyfail&quot; data-rnwi-5xr8s6-dse9kg-2fw26j-oovg05-focus-visible=&quot;true&quot; data-rnwi-handle=&quot;link&quot;&gt;&lt;span data-key=&quot;21d020564bb54c638c1eb47bda92d5c2&quot; data-rnwilink--1t57rxo-=&quot;true&quot; data-rnwilink--jv503u-1ddef8g-hover=&quot;true&quot; data-rnwi-handle=&quot;nearest&quot;&gt;&lt;span data-key=&quot;36ab61f3d1f5422487ac37aed6453169&quot;&gt;&lt;span data-offset-key=&quot;36ab61f3d1f5422487ac37aed6453169:0&quot;&gt;AccountKeyFail &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-key=&quot;2364f11f117d42b3b5aeea0cf6f8fac2&quot; data-rnwilink--1t57rxo-=&quot;true&quot; data-rnwilink--jv503u-1ddef8g-hover=&quot;true&quot; data-rnwi-handle=&quot;nearest&quot;&gt;&lt;span data-key=&quot;c7bc47df99ca47f58980af99fc849e19&quot;&gt;&lt;span data-offset-key=&quot;c7bc47df99ca47f58980af99fc849e19:0&quot;&gt;4. AccountKeyWeightedMultisig&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-key=&quot;cb978d448e9641f3905ca978a9b48c8b&quot; data-rnwilink--1t57rxo-=&quot;true&quot; data-rnwilink--jv503u-1ddef8g-hover=&quot;true&quot; data-rnwi-handle=&quot;nearest&quot;&gt;&lt;span data-key=&quot;66fff17f827848879a55f2f5eff49d45&quot;&gt;&lt;span data-offset-key=&quot;66fff17f827848879a55f2f5eff49d45:0&quot;&gt;5. AccountKeyRoleBased&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AccountKeyFail 상태는 트랜잭션 유효성 검증 프로세스는 항상 실패한다는 공식문서 내용을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;caver 의 contract method 로 컨트랙트 호출할 때, 조회도 불가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 이상한 것은 세 가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AccountKeyFail 상태일 때, 트랜잭션 유효성 검증이 실패한다는 것은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트랙트 호출을 통한 거래도 할 수 없는 상태라는 것인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opensea 에서는 2 days ago 로 이틀 전에 transferFrom method 가 호출되었다. &lt;i&gt;뭔데..&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-09 오후 4.17.39.png&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba1nzk/btr20xNW7WM/wfwcrNjvN0kvZVjiaWxWi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba1nzk/btr20xNW7WM/wfwcrNjvN0kvZVjiaWxWi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba1nzk/btr20xNW7WM/wfwcrNjvN0kvZVjiaWxWi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba1nzk%2Fbtr20xNW7WM%2FwfwcrNjvN0kvZVjiaWxWi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2136&quot; height=&quot;198&quot; data-filename=&quot;스크린샷 2023-03-09 오후 4.17.39.png&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그리고 이 NFT 는 opensea 에서 hidden 으로 분류되었고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-09 오후 4.21.03.png&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x3Unm/btr2Px3inZq/KzPcb9hK2KGzB9f85jVX01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x3Unm/btr2Px3inZq/KzPcb9hK2KGzB9f85jVX01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x3Unm/btr2Px3inZq/KzPcb9hK2KGzB9f85jVX01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx3Unm%2Fbtr2Px3inZq%2FKzPcb9hK2KGzB9f85jVX01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;55&quot; data-filename=&quot;스크린샷 2023-03-09 오후 4.21.03.png&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- opensea 에서는 어떻게 이 NFT의 메타데이터를 모두 가져올 수 있는지 의문&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-09 오후 4.21.52.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctEpYp/btr2OQIPeEq/jikItfdIyPpw0ecBa8l9Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctEpYp/btr2OQIPeEq/jikItfdIyPpw0ecBa8l9Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctEpYp/btr2OQIPeEq/jikItfdIyPpw0ecBa8l9Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctEpYp%2Fbtr2OQIPeEq%2FjikItfdIyPpw0ecBa8l9Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;343&quot; height=&quot;268&quot; data-filename=&quot;스크린샷 2023-03-09 오후 4.21.52.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;920&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>블록체인</category>
      <category>AccountKeyFail</category>
      <category>hidden</category>
      <author>슈팅스타제제</author>
      <guid isPermaLink="true">https://jemerald.tistory.com/261</guid>
      <comments>https://jemerald.tistory.com/261#entry261comment</comments>
      <pubDate>Thu, 9 Mar 2023 16:24:03 +0900</pubDate>
    </item>
    <item>
      <title>23.02.16 치즈 만들기</title>
      <link>https://jemerald.tistory.com/260</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 기본 사각형에서 edit mode 로 간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tNHIC/btrZxJ0oZiC/arpSXNuWSkGDT2jfgKZDlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tNHIC/btrZxJ0oZiC/arpSXNuWSkGDT2jfgKZDlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tNHIC/btrZxJ0oZiC/arpSXNuWSkGDT2jfgKZDlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtNHIC%2FbtrZxJ0oZiC%2FarpSXNuWSkGDT2jfgKZDlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;281&quot; height=&quot;267&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1902&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 점 두개 shift 선택하고 우클릭 &amp;rArr; Vertex Context Menu &amp;rArr; Merge Vertices &amp;rArr; At Center&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼각형 치즈를 만들기 위해서는 아랫면의 점들도 해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UErX7/btrZy9Sgl6S/NFAdzmJdNB7z5e8e1U8wR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UErX7/btrZy9Sgl6S/NFAdzmJdNB7z5e8e1U8wR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UErX7/btrZy9Sgl6S/NFAdzmJdNB7z5e8e1U8wR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUErX7%2FbtrZy9Sgl6S%2FNFAdzmJdNB7z5e8e1U8wR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;305&quot; height=&quot;378&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2478&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지는 괜찮은데 그 뒤에 softly 하게 만드는게&amp;hellip;쵸큼 빡세다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 ctrl + B 로 면을 잘게 갈아준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 딱 한번만 누르면 한번만 간 효과가 나오는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 마우스 없이 wheel 돌린 효과 내는 법을 내기 위해서 shift 하고 위로 슥슥 밀어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object Mode 간 다음에 Add Modifier &amp;rArr; Subdivision Surface&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhm21o/btrZxJsy4lA/r7XNwUKKRbZ6z7G2E3i52K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhm21o/btrZxJsy4lA/r7XNwUKKRbZ6z7G2E3i52K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhm21o/btrZxJsy4lA/r7XNwUKKRbZ6z7G2E3i52K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhm21o%2FbtrZxJsy4lA%2Fr7XNwUKKRbZ6z7G2E3i52K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;395&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object &amp;rArr; Shade Smooth&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf7PUg/btrZA1MfGGU/tbSqDwJltf8Fno0q5bsIM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf7PUg/btrZA1MfGGU/tbSqDwJltf8Fno0q5bsIM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf7PUg/btrZA1MfGGU/tbSqDwJltf8Fno0q5bsIM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf7PUg%2FbtrZA1MfGGU%2FtbSqDwJltf8Fno0q5bsIM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;668&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shift + A &amp;rArr; 객체 생성 (UV Spear)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edit Mode&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shift + D &amp;rArr; 객체 복붙&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다하고 Object Mode 와서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Viewport 1 &amp;rarr; 2 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Add modifier &amp;rArr; Boolean &amp;rArr; 스포이드 아이콘 눌러서 Sphere 터치!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xG00t/btrZBsCXGPt/XKEEJwcpKDshMWUQuoTQN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xG00t/btrZBsCXGPt/XKEEJwcpKDshMWUQuoTQN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xG00t/btrZBsCXGPt/XKEEJwcpKDshMWUQuoTQN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxG00t%2FbtrZBsCXGPt%2FXKEEJwcpKDshMWUQuoTQN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;606&quot; height=&quot;255&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wEdHF/btrZzLQVUFF/XLtbFYKeE6HX04O9CnjaC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wEdHF/btrZzLQVUFF/XLtbFYKeE6HX04O9CnjaC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wEdHF/btrZzLQVUFF/XLtbFYKeE6HX04O9CnjaC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwEdHF%2FbtrZzLQVUFF%2FXLtbFYKeE6HX04O9CnjaC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;606&quot; height=&quot;303&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 킹받게 이렇게 되고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ulfOx/btrZAfqDkkh/C11KGknoJEN1X8Zm45VOX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ulfOx/btrZAfqDkkh/C11KGknoJEN1X8Zm45VOX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ulfOx/btrZAfqDkkh/C11KGknoJEN1X8Zm45VOX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FulfOx%2FbtrZAfqDkkh%2FC11KGknoJEN1X8Zm45VOX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;328&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Add Modifier &amp;rArr; Edge Split&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1088&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Co4A0/btrZB4ICsfM/PggMyh95iBHrJ5gtD7lVyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Co4A0/btrZB4ICsfM/PggMyh95iBHrJ5gtD7lVyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Co4A0/btrZB4ICsfM/PggMyh95iBHrJ5gtD7lVyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCo4A0%2FbtrZB4ICsfM%2FPggMyh95iBHrJ5gtD7lVyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;347&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1088&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 sphere 추가하고 두둥&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo1eZv/btrZAHmQP7L/srUGKukfbpRqsEsanBFk7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo1eZv/btrZAHmQP7L/srUGKukfbpRqsEsanBFk7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo1eZv/btrZAHmQP7L/srUGKukfbpRqsEsanBFk7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo1eZv%2FbtrZAHmQP7L%2FsrUGKukfbpRqsEsanBFk7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;394&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apply 다 눌러준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;light Area 추가하고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-16 오후 11.03.53.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL79cF/btrZzaDxZNu/y4Bw7JqblfFiwWJImtB9Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL79cF/btrZzaDxZNu/y4Bw7JqblfFiwWJImtB9Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL79cF/btrZzaDxZNu/y4Bw7JqblfFiwWJImtB9Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL79cF%2FbtrZzaDxZNu%2Fy4Bw7JqblfFiwWJImtB9Nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;564&quot; height=&quot;414&quot; data-filename=&quot;스크린샷 2023-02-16 오후 11.03.53.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조명 살짝 주고 렌더링하면 맛있는 치즈 완성~!~!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI543V/btrZAsDnwUP/Ys2bnoQGSc3Ay146n2Dt8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI543V/btrZAsDnwUP/Ys2bnoQGSc3Ay146n2Dt8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI543V/btrZAsDnwUP/Ys2bnoQGSc3Ay146n2Dt8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI543V%2FbtrZAsDnwUP%2FYs2bnoQGSc3Ay146n2Dt8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Graphic/Blender</category>
      <category>블렌더</category>
      <category>조명</category>
      <category>치즈만들기</category>
      <author>슈팅스타제제</author>
      <guid isPermaLink="true">https://jemerald.tistory.com/260</guid>
      <comments>https://jemerald.tistory.com/260#entry260comment</comments>
      <pubDate>Thu, 16 Feb 2023 23:07:57 +0900</pubDate>
    </item>
    <item>
      <title>23.02.05 왜 super call?</title>
      <link>https://jemerald.tistory.com/259</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Constructors&amp;nbsp;for&amp;nbsp;derived&amp;nbsp;classes&amp;nbsp;must&amp;nbsp;contain&amp;nbsp;a&amp;nbsp;super&amp;nbsp;call&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;super() 을 호출하지 않으면 위와 같은 타입스크립트 에러로 this 로 서브 클래스에 접근할 수 없다. (타스만의 에러는 아님.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해주면 그럼 뭐 에러는 해결인데 왜 해줘야 하는지 좀 의문..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브 클래스에서 constructor 가 실행될 때, 생성자 함수에서는 &lt;b&gt;슈퍼클래스에 빈 객체를 만들고 this 로 객체 할당해주라고&lt;/b&gt; 기다리고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러니 서브 클래스 입장에서는 그냥 못 만들고 super() 을 호출해서 &lt;b&gt;슈퍼 클래스의 constructor 를 실행해야 하는 것&lt;/b&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 비로소 this 객체가 만들어지고 this. 를 사용할 수 있다~!~!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-05 오후 11.28.44.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/USU1p/btrX6iI1u1X/N1lZrkbFSHntre53RFLaOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/USU1p/btrX6iI1u1X/N1lZrkbFSHntre53RFLaOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/USU1p/btrX6iI1u1X/N1lZrkbFSHntre53RFLaOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUSU1p%2FbtrX6iI1u1X%2FN1lZrkbFSHntre53RFLaOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1416&quot; height=&quot;426&quot; data-filename=&quot;스크린샷 2023-02-05 오후 11.28.44.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>typescript</category>
      <category>Subclass</category>
      <category>super</category>
      <author>슈팅스타제제</author>
      <guid isPermaLink="true">https://jemerald.tistory.com/259</guid>
      <comments>https://jemerald.tistory.com/259#entry259comment</comments>
      <pubDate>Sun, 5 Feb 2023 23:31:06 +0900</pubDate>
    </item>
  </channel>
</rss>