<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>평행우주 : world 1</title>
    <link>https://1parallelworlds.tistory.com/</link>
    <description>꾸준함의 힘  
하루하루 성장하고 있다는 믿음  

1번 우주에서 나만의 텃밭을 운영 중인 
초보 농부입니다  &amp;zwj; 

소통 환영합니다 ! 
당근 받아가세요~~ </description>
    <language>ko</language>
    <pubDate>Fri, 8 May 2026 12:31:04 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>parallelworlds</managingEditor>
    <image>
      <title>평행우주 : world 1</title>
      <url>https://tistory1.daumcdn.net/tistory/5114304/attach/b5be3cccb6df4dbfbbc60c1f0ad4bfb2</url>
      <link>https://1parallelworlds.tistory.com</link>
    </image>
    <item>
      <title>[ 기획 ] 프로덕트 스펙 작성 방법</title>
      <link>https://1parallelworlds.tistory.com/155</link>
      <description>&lt;figure id=&quot;og_1657734777230&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;On Writing Product Specs&quot; data-og-description=&quot;If you&amp;rsquo;re a PM at a medium-to-large org, you should be writing product specs. Learn why and how along with a detailed example.&quot; data-og-host=&quot;goberoi.com&quot; data-og-source-url=&quot;https://goberoi.com/on-writing-product-specs-5ca697b992fd#.ysztdkv5p&quot; data-og-url=&quot;https://goberoi.com/on-writing-product-specs-5ca697b992fd&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bPNUZ0/hyO5LEufHc/M2PNU30ES7DpI8JaEBO4y1/img.png?width=1200&amp;amp;height=590&amp;amp;face=238_153_425_357,https://scrap.kakaocdn.net/dn/hUXuw/hyO5Sp4HkX/kqrHza90eIYfXRDbkIKQKK/img.png?width=1400&amp;amp;height=689&amp;amp;face=284_175_524_437,https://scrap.kakaocdn.net/dn/b2oHbK/hyO5GpDXkC/xo3hj3VSb3iMPflQB5buaK/img.png?width=1400&amp;amp;height=658&amp;amp;face=253_192_384_336&quot;&gt;&lt;a href=&quot;https://goberoi.com/on-writing-product-specs-5ca697b992fd#.ysztdkv5p&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://goberoi.com/on-writing-product-specs-5ca697b992fd#.ysztdkv5p&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bPNUZ0/hyO5LEufHc/M2PNU30ES7DpI8JaEBO4y1/img.png?width=1200&amp;amp;height=590&amp;amp;face=238_153_425_357,https://scrap.kakaocdn.net/dn/hUXuw/hyO5Sp4HkX/kqrHza90eIYfXRDbkIKQKK/img.png?width=1400&amp;amp;height=689&amp;amp;face=284_175_524_437,https://scrap.kakaocdn.net/dn/b2oHbK/hyO5GpDXkC/xo3hj3VSb3iMPflQB5buaK/img.png?width=1400&amp;amp;height=658&amp;amp;face=253_192_384_336');&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;On Writing Product Specs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;If you&amp;rsquo;re a PM at a medium-to-large org, you should be writing product specs. Learn why and how along with a detailed example.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;goberoi.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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;요약&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;잘쓰여진 프로덕트 스펙 리스트는 훌륭한 소프트웨어를 구축하는데 중요하게 작용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;비판적 사고, 커뮤니케이션 확장, 책임감 등이 더 높은 품질과 더 낮은 데드라인 위험, 더 적은 시간 낭비로 이어지게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;1. 비판적 사고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;글을 먼저 작성함으로써 코딩, 디자인, QA 등과 같은 리소스가 많이 들어가는 작업 전에 구체적으로 생각할 수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 효율적인 의사소통&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로덕트가 진행될 때 마주하게 되는 엔지니어, 디자인, 재무, 관리자 등 다양한 이해관계자에게 일괄적이고 모호하지 않게 제안할 수 있게 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 책임감&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;항상 측정 가능한 목표를 공개적으로 노출함으로써 팀의 인센티브를 조정하고, 책임감을 느끼게 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&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;size18&quot;&gt;1. 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해결하고자 하는 문제와, 문제를 다뤄야 할 가치를 논리적으로 서술해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 측정 가능한 목표&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;명확한 결과물과 달성가능한 결과를 시각화한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 맥락&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;팀원이 문제 상황을 이해하고 납득할 수 있는 증거를 제시해야 한다. (가정, 사례, 논리 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. 상세한 솔루션&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;제안은 팀이 바로 착수할 수 있을 정도로 상세해야 한다. 인간 두뇌가 작성하는 코드와 같다고 생각해라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. 타임라인&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;날짜와 이정표를 나열한다. 시작은 모호할 수 있지만, 마지막 검토에서는 구체화 되어야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 빠른 초안 작성 (1 시간)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-07-14 오전 3.02.11.png&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tSz1i/btrHflVLXHn/FfAkwPQ0Zy39KDN1tL0qE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tSz1i/btrHflVLXHn/FfAkwPQ0Zy39KDN1tL0qE1/img.png&quot; data-alt=&quot;예제 product spec/notes&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tSz1i/btrHflVLXHn/FfAkwPQ0Zy39KDN1tL0qE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtSz1i%2FbtrHflVLXHn%2FFfAkwPQ0Zy39KDN1tL0qE1%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;609&quot; height=&quot;799&quot; data-filename=&quot;스크린샷 2022-07-14 오전 3.02.11.png&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예제 product spec/notes&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 30분짜리 회의를 두어 번 진행한다. 이때 회의는 소규모로 유지하고, 가능한 적은 수의 사람들로 진행하는 것이 좋다 (1-4 시간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 프로덕트 스펙 작성 및 편집. 비판적 사고와 글쓰기로 여러 아이디어를 결합하고, 편집을 통해 간결하고 명확하게 만든다. (반나절-3 일)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. 1시간 리뷰 게시 및 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. 검토 (1 시간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&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;스크린샷 2022-07-14 오전 3.10.59.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dzgfd/btrHdaO0jYL/0yAkxqSHPIJfp51NRWhKgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dzgfd/btrHdaO0jYL/0yAkxqSHPIJfp51NRWhKgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dzgfd/btrHdaO0jYL/0yAkxqSHPIJfp51NRWhKgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDzgfd%2FbtrHdaO0jYL%2F0yAkxqSHPIJfp51NRWhKgK%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;607&quot; height=&quot;776&quot; data-filename=&quot;스크린샷 2022-07-14 오전 3.10.59.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-07-14 오전 3.11.11.png&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uzh3c/btrHdttJ4oQ/ph30kbV4kK3KGa1FXkCDM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uzh3c/btrHdttJ4oQ/ph30kbV4kK3KGa1FXkCDM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uzh3c/btrHdttJ4oQ/ph30kbV4kK3KGa1FXkCDM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUzh3c%2FbtrHdttJ4oQ%2Fph30kbV4kK3KGa1FXkCDM1%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;597&quot; height=&quot;776&quot; data-filename=&quot;스크린샷 2022-07-14 오전 3.11.11.png&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-07-14 오전 3.11.20.png&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXKLrk/btrHeXt4zGo/ZI996wmjw2uI4Paj8HvcZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXKLrk/btrHeXt4zGo/ZI996wmjw2uI4Paj8HvcZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXKLrk/btrHeXt4zGo/ZI996wmjw2uI4Paj8HvcZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXKLrk%2FbtrHeXt4zGo%2FZI996wmjw2uI4Paj8HvcZk%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;599&quot; height=&quot;778&quot; data-filename=&quot;스크린샷 2022-07-14 오전 3.11.20.png&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-07-14 오전 3.11.31.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;779&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIASCw/btrHd0xRDZy/KbkfaUNvjxt0Fo42irkgZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIASCw/btrHd0xRDZy/KbkfaUNvjxt0Fo42irkgZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIASCw/btrHd0xRDZy/KbkfaUNvjxt0Fo42irkgZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIASCw%2FbtrHd0xRDZy%2FKbkfaUNvjxt0Fo42irkgZk%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;594&quot; height=&quot;779&quot; data-filename=&quot;스크린샷 2022-07-14 오전 3.11.31.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;779&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;figure id=&quot;og_1657735400505&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;Example Spec Notes - Live Chat&quot; data-og-description=&quot;This is an example early draft product spec/notes, written as part of this blog post. Problem: Conversion sucks. 18% but should be able to do 30% (need source). What else have we tried here, and why is this worth trying? Need to look up our past support ca&quot; data-og-host=&quot;docs.google.com&quot; data-og-source-url=&quot;https://docs.google.com/document/d/1lGUTukK0b5Jp-nikMl7yBUaDxKVpgj77tUn4UF-vsaU/edit&quot; data-og-url=&quot;https://docs.google.com/document/d/1lGUTukK0b5Jp-nikMl7yBUaDxKVpgj77tUn4UF-vsaU/edit?usp=embed_facebook&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c4tHNn/hyO4JhddmH/BMOcJJkVibIk3vwpkIpD7K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.google.com/document/d/1lGUTukK0b5Jp-nikMl7yBUaDxKVpgj77tUn4UF-vsaU/edit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.google.com/document/d/1lGUTukK0b5Jp-nikMl7yBUaDxKVpgj77tUn4UF-vsaU/edit&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c4tHNn/hyO4JhddmH/BMOcJJkVibIk3vwpkIpD7K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;Example Spec Notes - Live Chat&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This is an example early draft product spec/notes, written as part of this blog post. Problem: Conversion sucks. 18% but should be able to do 30% (need source). What else have we tried here, and why is this worth trying? Need to look up our past support ca&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.google.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;figure id=&quot;og_1657735828577&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;Example Spec - Live Chat&quot; data-og-description=&quot;This is an example product spec, written as part of this blog post. Some notes: Commentary will appear with this light blue background throughout the doc. Read the doc once through while ignoring the blue bits, then go back and reread. Links don&amp;rsquo;t go any&quot; data-og-host=&quot;docs.google.com&quot; data-og-source-url=&quot;https://docs.google.com/document/d/1MU-fo5FlBbcz3R-Eg38lFtcAr5s_k2ynpd9ew0aButs/edit&quot; data-og-url=&quot;https://docs.google.com/document/d/1MU-fo5FlBbcz3R-Eg38lFtcAr5s_k2ynpd9ew0aButs/edit?usp=embed_facebook&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5iqep/hyO5Dl9DEP/CF9WeNVL83zsWgDdrHfavK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://docs.google.com/document/d/1MU-fo5FlBbcz3R-Eg38lFtcAr5s_k2ynpd9ew0aButs/edit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.google.com/document/d/1MU-fo5FlBbcz3R-Eg38lFtcAr5s_k2ynpd9ew0aButs/edit&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5iqep/hyO5Dl9DEP/CF9WeNVL83zsWgDdrHfavK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;Example Spec - Live Chat&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This is an example product spec, written as part of this blog post. Some notes: Commentary will appear with this light blue background throughout the doc. Read the doc once through while ignoring the blue bits, then go back and reread. Links don&amp;rsquo;t go any&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.google.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>텃밭 4/기획</category>
      <author>parallelworlds</author>
      <guid isPermaLink="true">https://1parallelworlds.tistory.com/155</guid>
      <comments>https://1parallelworlds.tistory.com/155#entry155comment</comments>
      <pubDate>Thu, 14 Jul 2022 06:15:33 +0900</pubDate>
    </item>
    <item>
      <title>[Rust] 러스트 데이터 타입 : scalar, Compound, 문자열</title>
      <link>https://1parallelworlds.tistory.com/153</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-08 오후 7.08.49.png&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVH98O/btryQB0ks3k/WZBd0NiHk1QuLIZ8kkIwh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVH98O/btryQB0ks3k/WZBd0NiHk1QuLIZ8kkIwh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVH98O/btryQB0ks3k/WZBd0NiHk1QuLIZ8kkIwh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVH98O%2FbtryQB0ks3k%2FWZBd0NiHk1QuLIZ8kkIwh0%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;275&quot; height=&quot;226&quot; data-filename=&quot;스크린샷 2022-04-08 오후 7.08.49.png&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;226&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Rust 데이타 타입&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Statically Type Language&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;프로그램 상의 모든 데이터 타입을 컴파일 시점에 결정한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;컴파일 시점에, 각 타입에 위배되는 코드가 있을 경우 에러가 발생한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;let으로 선언된 변수의 경우, 데이터 타입이 결정되지 않은 경우 러스트 컴파일러가 추론 결정한다&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;스칼라 타입(Scalar Type)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하나의 값을 갖는 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정수형, 부동소수점형, 불린형, 문자형이 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정수형&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649417544960&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let a: i32 = 1_000_000; // 10진수, 백만 | 가독성을 높이기 위해 _사용 가능
    let a = 0xff;    // 16진수
    let a = 0o15;    // 8진수
    let a =  0b1111_1111; // 2진수
    let a: u8 = b'A';   // 바이트 (앞에 b를 붙임)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;i8, u16, i32, u64, i128, usize 와 같이 정수를 포함하는 타입&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;부호가 있을 경우 : i&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;부호가 없는 경우 : u&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;부동소수점형&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649417607778&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a: f32  = 3.14;   // f32
let b = 3.14;         // f64&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;f32, f64&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;존재&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;부동소수점 타입을 지정하지 않는 소수값은 컴파일러가 디폴트로 f64를&lt;span&gt;&amp;nbsp;지정&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;불린형&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649417688829&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a: bool = false;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문자형&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649417733551&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a: char = 'A';    // U+0041&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;char 키워드를 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;4바이트 크기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;U+0000 ~ U+D7FF와 U+E000 ~ U+10FFFF 범위의 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;유니코드 스칼라 값&lt;/span&gt;을 가질 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이러한 유니코드 문자가 아닌, 1 바이트의 값을 표현하기 위해서는 u8 타입을 사용&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;복합 타입(Compound Type)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;여러개의 값들로 구성된 타입&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;배열(Array)과 튜플(Tuple)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;배열(Array)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649417925536&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr: [i32; 3] = [1, 2, 3];   // 3개의 정수배열 
 
println!(&quot;{}&quot;, arr[0]);   // 배열 첫번째 요소 출력
 
println!(&quot;{:?}&quot;, arr);    // 배열전체를 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;동일한 데이타 타입을 갖는 요소들의 집합&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;고정된 길이를 갖는다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;러스트에서 배열은 스택에 할당된다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;배열값을 지정할 때, [1; 100] 과 같이 세미콜론을 사용하면, 이는 [1, 1, ..., 1] 와 같이 1을 100개 지정하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;튜플(Tuple)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649418096788&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let dat: (i32, char, bool) = (1, 'A', true);
let usr = (&quot;Tom&quot;, 'B');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;여러 데이타 타입의 값들을 하나로 묶은 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;괄호를 사용하고 각 타입이나 값들을 콤마로 분리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;튜플이 한번 정의되면, 새로운 요소를 추가하거나 기존 요소를 삭제할 수 없다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649418109755&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let dat: (i32, char, bool) = (1, 'A', true);
let a = dat.0; //1
let b: char = dat.1; //A
let c: bool = dat.2; //true&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649418184672&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let dat: (i32, char, bool) = (1, 'A', true);
let (a, b, c) = dat; //Destructuring : 튜플 전체를 읽어 여러 변수들에 나누어 할당&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;문자열 타입&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;일반적으로 &amp;amp;str 타입과 String 타입을 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;amp;str&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649419036274&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let s = &quot;hello&quot;;    // let s: &amp;amp;'static str = &quot;hello&quot;; 와 동일
    println!(&quot;{}&quot;, s);
}

//변수 s는 &amp;amp;'static str 타입으로 문자열 리터럴 &quot;hello&quot; 에 대한 레퍼런스(reference)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;문자열을 표현하는 Primitive 문자열 타입&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;str 타입은 항상 레퍼런스이기 때문에, 실제 코드에서는 &amp;amp;str 와 같이 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;문자열 리터럴은 코드 바이너리에 직접 저장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;프로그램의 실행기간 동안 계속 존재하여 'static 이라는 키워드 추가&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;amp;str의 &amp;amp;는 레퍼런스를 의미&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;문자열 리터럴을 변수에 할당할 때 사용 (&amp;amp;'static str 타입)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;다른 변수가 소유한(owned) 문자열의 일부를 슬라이스하여(&amp;amp;str 타입) 가져올 때 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649419205630&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//변수 s가 소유한(own) 문자열의 일부 범위를 문자열 슬라이스하여 변수 sub에 넣는 예제
fn main() {
    let s = &quot;hello&quot;;  
    let sub: &amp;amp;str = &amp;amp;s[1..4]; //&amp;amp;s[1..4] 는 요소1 부터 요소3까지의 범위 즉 &quot;ell&quot; 을 가리킨다
    println!(&quot;{}&quot;, sub);    // &quot;ell&quot; 출력
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;범위(range)를 지정할 때 [시작..마지막] 와 같이 표현하는 마지막위치는 실제 마지막위치의 다음 인덱스를 넣는다&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649419264533&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let s: &amp;amp;'static str = &quot;hello&quot;;  
 
    // &amp;amp;str 타입을 String 타입으로 변환
    let x: String = s.to_owned();
 
    println!(&quot;{}&quot;, x);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;amp;str 타입을 String 타입으로 변환하기 위해서는 to_owned() 함수 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;+)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;to_string()은 임의의 타입을 String 타입으로 변환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;to_string()은&amp;nbsp;&lt;/span&gt;많은 메모리를 사용하므로 &amp;amp;str 타입에서는 to_owned() 함수를 사용하는 것이 좋다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;String&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649419490513&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let s = String::from(&quot;hello&quot;);  
    // String::from() &amp;gt; 문자열 리터럴을 String 타입으로 
    // let s: String = &quot;hello&quot;.to_owned(); // 동일
 
    println!(&quot;{}&quot;, s);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Heap 메모리 상에 문자열을 저장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;문자열 메모리에 새 문자들을 추가하거나 수정할 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649419549890&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let mut s = String::new();   // 새로운 empty string 생성
    // 빈 문자열이므로 문자를 추가하기 위해 변수를 mut로 만들어준다
    s.push('H');           // 문자 추가
    s.push('i');           // 문자 추가
    s.push_str(&quot; Tom&quot;);  // 문자열 추가
     
    println!(&quot;{}&quot;, s);  // &quot;Hi Tom&quot; 출력
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649419614612&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
//String::replace() 함수를 사용 &amp;gt; 문자열의 일부를 다른 문자들로 치환
    let mut s = String::from(&quot;Hello Bill&quot;);
    s = s.replace(&quot;Hello&quot;, &quot;Hi&quot;);
     
    println!(&quot;{}&quot;, s); // &quot;Hi Bill&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>텃밭 1 : BlockChain/Rust</category>
      <author>parallelworlds</author>
      <guid isPermaLink="true">https://1parallelworlds.tistory.com/153</guid>
      <comments>https://1parallelworlds.tistory.com/153#entry153comment</comments>
      <pubDate>Fri, 8 Apr 2022 21:07:19 +0900</pubDate>
    </item>
    <item>
      <title>[Rust] 러스트 변수(variable) 특성</title>
      <link>https://1parallelworlds.tistory.com/152</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-08 오후 7.08.49.png&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KbXxR/btryOk6I9jq/sHW33uUiMgx8lhGMNJQqok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KbXxR/btryOk6I9jq/sHW33uUiMgx8lhGMNJQqok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KbXxR/btryOk6I9jq/sHW33uUiMgx8lhGMNJQqok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKbXxR%2FbtryOk6I9jq%2FsHW33uUiMgx8lhGMNJQqok%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;275&quot; height=&quot;226&quot; data-filename=&quot;스크린샷 2022-04-08 오후 7.08.49.png&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;226&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;변수 선언&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649413418868&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = 100;   
let b = 3.14;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;변수의 데이터 타입이 정의되지 않은 경우 러스트 컴파일러는 타입을 추론한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(상수는 항상 타입을 지정해야 한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649413484246&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let c: u32 = 12345;  //32비트 정수
let d: f32  = 3.14;  //32비트 부동소수점
let e: bool = true;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;변수의 불변성 (디폴트)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649415526973&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = 100;
a = a + 1;    
// 에러: cannot assign twice to immutable variable `a`
println!(&quot;{}&quot;, a);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;변수는 불변성을 갖는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;가변적 변수 (예외)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649415611737&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let mut a = 100;
a = a + 1;    // 에러 없음
println!(&quot;{}&quot;, a);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;변수의 데이터가 변경되어야 하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;변수 앞에 mut 를 입력하면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;상수&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649416000802&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    const PI: f64 = 3.141592;
 
    let area = PI * 5.0 * 5.0;
    println!(&quot;{}&quot;, area);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;상수는 항상 불변의 값을 갖는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;const로 선언하며,&lt;b&gt; 항상 데이터 타입&lt;/b&gt;을 지정해야 한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Shadowing&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649416385110&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let a = 1;        // 변수 a는 정수형
    println!(&quot;{}&quot;, a);

    let a = &quot;hello&quot;;  // 변수 a는 문자열
    println!(&quot;{}&quot;, a);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&quot;let&quot;으로 변수를 사용한 경우, 한 코드 Scope에서 동일한 변수명을 let으로 여러 번 정의할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새로 정의하는 시점에 이전의 변수 a는 잊게 되고 2를 갖는 a만을 기억하게 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1649416466592&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let a = 1;
    let a = 2;
    {
        let a = a + 1;
        println!(&quot;{}&quot;, a); // 출력: 3
    }

    println!(&quot;{}&quot;, a); // 출력: 2
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre id=&quot;code_1649416493308&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let mut a = 1;
    a = 2;
    {
        a = a + 1;
        println!(&quot;{}&quot;, a); // 출력: 3
    }

    println!(&quot;{}&quot;, a); // 출력: 3
}&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;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;&amp;nbsp;&lt;/p&gt;</description>
      <category>텃밭 1 : BlockChain/Rust</category>
      <author>parallelworlds</author>
      <guid isPermaLink="true">https://1parallelworlds.tistory.com/152</guid>
      <comments>https://1parallelworlds.tistory.com/152#entry152comment</comments>
      <pubDate>Fri, 8 Apr 2022 20:15:29 +0900</pubDate>
    </item>
    <item>
      <title>[Rust] 러스트 Cargo 사용법</title>
      <link>https://1parallelworlds.tistory.com/151</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-08 오후 7.08.49.png&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csj0kM/btryQ15jy1u/Hk67fvIBwyeDqnvhWLDnvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csj0kM/btryQ15jy1u/Hk67fvIBwyeDqnvhWLDnvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csj0kM/btryQ15jy1u/Hk67fvIBwyeDqnvhWLDnvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcsj0kM%2FbtryQ15jy1u%2FHk67fvIBwyeDqnvhWLDnvK%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;275&quot; height=&quot;226&quot; data-filename=&quot;스크린샷 2022-04-08 오후 7.08.49.png&quot; data-origin-width=&quot;275&quot; data-origin-height=&quot;226&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Cargo 란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;rust 프로젝트/패키지 매니저&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;rust 빌드시스템 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새 프로젝트를 만들거나 프로젝트 빌드 시 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로젝트가 필요로 하는 종송 패키지들을 다운 받을 때도 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Cargo : 프로젝트 생성&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;myproject1 생성 시 명령어&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1649412689555&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cargo new myproject1
$ cd myproject1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;myproject1 폴더가 생성된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;또한 Cargo.toml 파일과 src/main.rs&lt;span&gt; 파일이 생성된다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Cargo.toml&lt;span&gt;&amp;nbsp;파일은 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;nodejs의 package.json 와 비슷한 역할을 한다 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;( 프로젝트의 기본정보와 패키지 목록 관리 텍스트파일)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;숫자로 시작하는 파일은 만들 수 없다&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Cargo : 빌드와 실행&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;소스파일들은 src폴더 안에 들어간다&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;cargo 빌드를 하면 실행파일은 target 폴더 안에 만들어진다&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;cargo new aa 로 만들어진 프로젝트 폴더 안에서 cargo build를 수행하면,&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;코드가 빌드되고 target 폴더 안에 실행파일 aa이 생성된다&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;빌드와 실행을 함께 하고 싶을 때는 cargo run 명령을 수행하면 된다&lt;/p&gt;
&lt;pre id=&quot;code_1649413206614&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cargo run&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>텃밭 1 : BlockChain/Rust</category>
      <author>parallelworlds</author>
      <guid isPermaLink="true">https://1parallelworlds.tistory.com/151</guid>
      <comments>https://1parallelworlds.tistory.com/151#entry151comment</comments>
      <pubDate>Fri, 8 Apr 2022 19:21:04 +0900</pubDate>
    </item>
    <item>
      <title>[실습 | 블록체인] Truffle을 이용한 다량의 ERC-721 개발하기</title>
      <link>https://1parallelworlds.tistory.com/150</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-02-17 오전 3.37.16.png&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWjJE/btryDKqQtSh/qiYNxbvh1w2HrujHFxwf51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWjJE/btryDKqQtSh/qiYNxbvh1w2HrujHFxwf51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWjJE/btryDKqQtSh/qiYNxbvh1w2HrujHFxwf51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWjJE%2FbtryDKqQtSh%2FqiYNxbvh1w2HrujHFxwf51%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;243&quot; height=&quot;405&quot; data-filename=&quot;스크린샷 2022-02-17 오전 3.37.16.png&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;face&quot; data-emoticon-name=&quot;073&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/073.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/073.png&quot; width=&quot;80&quot; /&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt; &amp;nbsp; 대량 민팅 ... ! 나도 해보고 싶다&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;한 두개씩 ERC-721 을 배포해보고,,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보통의 NFT 프로젝트처럼 만들어보고 싶어졌다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여러 요소들을 만들고 희귀성도 넣어보고 500개 정도 민팅해보는 게 목표 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;중간중간 에러가 나서,, 시간은 좀 더 걸릴 거 같지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;되는대로 업데이트 할 예정이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;⛑ 개발 환경&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &amp;nbsp; truffle&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &amp;nbsp; rinkeby&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &amp;nbsp; opensea testnet&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &amp;nbsp; pinata&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &amp;nbsp; openzeppelin&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &amp;nbsp; Solidity&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &amp;nbsp; &amp;nbsp;react&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt; &amp;nbsp; JS&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;참고자료 : &lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;Ethereum for JS Developer&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt; &amp;zwj;  만들어 볼 것 : 500개 정도의 랜덤한 조합의 ERC-721 토큰 개발&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ERC-721 토큰을 만들자 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대략 500개 정도 발행하되, 희귀성도 넣어보자 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;오픈씨 테스트넷에 올려보자 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;1. 속성 이미지 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 이미지 랜덤 조합 스크립트 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 생성된 이미지 IPFS 업로드 후 메타정보 생성 (JSON형식으로 IPFS 업로드)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. ERC-721 컨트랙트 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. 리액트로 아주 간단한 NFT 발행 가능한 어플리케이션 만들기&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;6. 오픈씨 테스트넷에 올리기&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>텃밭 1 : BlockChain/Solidity</category>
      <author>parallelworlds</author>
      <guid isPermaLink="true">https://1parallelworlds.tistory.com/150</guid>
      <comments>https://1parallelworlds.tistory.com/150#entry150comment</comments>
      <pubDate>Thu, 7 Apr 2022 17:12:42 +0900</pubDate>
    </item>
    <item>
      <title>[실습 | Solidity] 블록체인을 사용한 DID 백신 접종 인증서 개발</title>
      <link>https://1parallelworlds.tistory.com/149</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-02-17 오전 3.37.16.png&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qhruG/btryExLA3uN/ycVIdNby7gN9YZ18yyTA60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qhruG/btryExLA3uN/ycVIdNby7gN9YZ18yyTA60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qhruG/btryExLA3uN/ycVIdNby7gN9YZ18yyTA60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqhruG%2FbtryExLA3uN%2FycVIdNby7gN9YZ18yyTA60%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;243&quot; height=&quot;405&quot; data-filename=&quot;스크린샷 2022-02-17 오전 3.37.16.png&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignLeft&quot; data-emoticon-type=&quot;face&quot; data-emoticon-name=&quot;073&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/073.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/073.png&quot; width=&quot;80&quot; /&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt; &amp;nbsp; SSI, DID가 매력적인 이유&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;verifiable data registry.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bchVeZ/btryI6e99bX/KhDCCrOMnV5lRgIqcblmr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bchVeZ/btryI6e99bX/KhDCCrOMnV5lRgIqcblmr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bchVeZ/btryI6e99bX/KhDCCrOMnV5lRgIqcblmr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbchVeZ%2FbtryI6e99bX%2FKhDCCrOMnV5lRgIqcblmr1%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;620&quot; height=&quot;1080&quot; data-filename=&quot;verifiable data registry.png&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;우리는 신원과 식별자를 종종 혼동하는 경우가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;우리가 신원하면 흔히 떠올리는 신분증, 여권, 인증서 등은 신원이 아닌 식별자다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;신원은 보다 더 개인적이고, 자기주권적 인간인 내 자신의 통제하에 있는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;문제는, 우리의 신원과 관련된 대부분의 것들이 조직의 관리 편리성을 위한 방법대로 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;우리 자신의 통제가 없는 상태에서 이뤄지고 있다는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;우리는 우리의 신원을 통제할 필요가 있다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;SSI의 발전은 바로 그 시작점이다&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;✍  SSI, DID에 대한 짧은 정리글&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1649314247329&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;[SSI | DID] SSI 자기주권 신원증명 인증&quot; data-og-description=&quot;SSI&amp;nbsp;자기주권&amp;nbsp;신원증명 대부분의 SSI 플랫폼은 블록체인 기술을 기반으로 개발 모든 SSI 플랫폼이 블록체인을 통해 개발될 필요는 없다 블록체인 분산원장의 특징 블록체인에 참여하는 모든 사&quot; data-og-host=&quot;1parallelworlds.tistory.com&quot; data-og-source-url=&quot;https://1parallelworlds.tistory.com/144&quot; data-og-url=&quot;https://1parallelworlds.tistory.com/144&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3v3nN/hyNXmNz13L/mMbnHuMaihfyBSPhKWAAi0/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/bpDcg2/hyNXlA77c8/6nVUHYD2VgIdKnnKx8koKK/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/X9El0/hyNXtTsZAV/WBx6GJ1MgZ24ePj0HRANxK/img.jpg?width=905&amp;amp;height=905&amp;amp;face=0_0_905_905&quot;&gt;&lt;a href=&quot;https://1parallelworlds.tistory.com/144&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://1parallelworlds.tistory.com/144&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3v3nN/hyNXmNz13L/mMbnHuMaihfyBSPhKWAAi0/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/bpDcg2/hyNXlA77c8/6nVUHYD2VgIdKnnKx8koKK/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/X9El0/hyNXtTsZAV/WBx6GJ1MgZ24ePj0HRANxK/img.jpg?width=905&amp;amp;height=905&amp;amp;face=0_0_905_905');&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;[SSI | DID] SSI 자기주권 신원증명 인증&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SSI&amp;nbsp;자기주권&amp;nbsp;신원증명 대부분의 SSI 플랫폼은 블록체인 기술을 기반으로 개발 모든 SSI 플랫폼이 블록체인을 통해 개발될 필요는 없다 블록체인 분산원장의 특징 블록체인에 참여하는 모든 사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;1parallelworlds.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1649314257138&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;[SSI | DID] DID(Decentralized IDentifier) 구성요소, 생성과 사용과정&quot; data-og-description=&quot;DID(Decentralized&amp;nbsp;IDentifier) 사용하는 사람 스스로 생성하고 제어할 수 있는 분산형 식별자 DID를 사용하는 객체에 대한 식별자로 사용될 뿐만 아니라, 인증 수단인 DID document를 참조할 수 있는 URI 역&quot; data-og-host=&quot;1parallelworlds.tistory.com&quot; data-og-source-url=&quot;https://1parallelworlds.tistory.com/145&quot; data-og-url=&quot;https://1parallelworlds.tistory.com/145&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kr34U/hyNXjXBwga/jepVO3CzqtV1MAY8obvKOk/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/fniV9/hyNXppY78D/axGPWrO2rmVB7ukpTkGcH1/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/bcUtBp/hyNXqWJwYD/w7dgiykDYElRBQiDxrkKk0/img.jpg?width=905&amp;amp;height=905&amp;amp;face=0_0_905_905&quot;&gt;&lt;a href=&quot;https://1parallelworlds.tistory.com/145&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://1parallelworlds.tistory.com/145&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kr34U/hyNXjXBwga/jepVO3CzqtV1MAY8obvKOk/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/fniV9/hyNXppY78D/axGPWrO2rmVB7ukpTkGcH1/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/bcUtBp/hyNXqWJwYD/w7dgiykDYElRBQiDxrkKk0/img.jpg?width=905&amp;amp;height=905&amp;amp;face=0_0_905_905');&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;[SSI | DID] DID(Decentralized IDentifier) 구성요소, 생성과 사용과정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DID(Decentralized&amp;nbsp;IDentifier) 사용하는 사람 스스로 생성하고 제어할 수 있는 분산형 식별자 DID를 사용하는 객체에 대한 식별자로 사용될 뿐만 아니라, 인증 수단인 DID document를 참조할 수 있는 URI 역&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;1parallelworlds.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1649314271014&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;[SSI | DID] DID Document 구성요소 : id&quot; data-og-description=&quot;DID Document DID Document에는 DID의 소유권을 증명할 수 있는 인증 수단이 포함된다 +) 대부분의 DID 플랫폼은 DID와 DID doc 생성 시 비대칭키를 함께 생성 생성한 비대칭키의 비밀키는 본인이 보관하고, &quot; data-og-host=&quot;1parallelworlds.tistory.com&quot; data-og-source-url=&quot;https://1parallelworlds.tistory.com/146&quot; data-og-url=&quot;https://1parallelworlds.tistory.com/146&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fOqWA/hyNXsAgCk2/ilPvjcrNgVxuyHWh75YF4K/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/dZEfkC/hyNXsAgCgc/3kvmBlhM6DK9etlUhLTbw1/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/IQQ4B/hyNXkPMhx5/kvgVsu7qar5rpf8IACaYKk/img.jpg?width=905&amp;amp;height=905&amp;amp;face=0_0_905_905&quot;&gt;&lt;a href=&quot;https://1parallelworlds.tistory.com/146&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://1parallelworlds.tistory.com/146&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fOqWA/hyNXsAgCk2/ilPvjcrNgVxuyHWh75YF4K/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/dZEfkC/hyNXsAgCgc/3kvmBlhM6DK9etlUhLTbw1/img.png?width=493&amp;amp;height=441&amp;amp;face=0_0_493_441,https://scrap.kakaocdn.net/dn/IQQ4B/hyNXkPMhx5/kvgVsu7qar5rpf8IACaYKk/img.jpg?width=905&amp;amp;height=905&amp;amp;face=0_0_905_905');&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;[SSI | DID] DID Document 구성요소 : id&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DID Document DID Document에는 DID의 소유권을 증명할 수 있는 인증 수단이 포함된다 +) 대부분의 DID 플랫폼은 DID와 DID doc 생성 시 비대칭키를 함께 생성 생성한 비대칭키의 비밀키는 본인이 보관하고,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;1parallelworlds.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt; &amp;zwj;  만들어 볼 것 : 백신 접종 증명서&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;코로나 19 백신 접종을 받았음을 검증 가능한 자격 증명을 DID로 구현해보자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span&gt;W3C의 권고사항에 따르면 다음과 같은 사항을 설계 시 참고해야 한다&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 발급자가 선택적 공개를 지원하는 소프트웨어가 없는 경우에도,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;선택적 공개를 지원하는 검증가능한 크리덴셜을 발급할 수 있는 수단 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 발급자는 선택적 공개를 지원하는 검증가능한 크리덴셜을 발급 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;검증은 어떤 발급자에게도 검증자의 신원을 공개하지 않아야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;&amp;gt;&amp;gt; issuanceDate&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;크리덴셜이 유효한 날짜와 시간을 나타내는 문자열 값&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;&amp;gt;&amp;gt; proof&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;변조를 감지하고 크리덴셜 또는 프레젠테이션의 소유권을 확인하는 데 사용할 수 있는 암호화 프루프&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;&amp;gt;&amp;gt; credentialStatus&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;id , type 등이 포함되어야 한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;이보다 더더 많은데,, 일단 도전해볼 수 있을만한 것들만 추려보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;일단 이번에는 위의 참고사항도 다 포함하지 않은&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;&lt;b&gt;아주 간단한 DID 개발&lt;/b&gt;을 해볼 예정이다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 코드 분석&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;OwnerHelper&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1649320282171&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Owner만 실행할 수 있는 컨트랙트
abstract contract OwnerHelper {
    address private owner;

    event OwnerTransferPropose(address indexed _from, address indexed _to);

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    // 함수 호출 시 owner = msg.sender로 자동 설정
    constructor() {
        owner = msg.sender;
    }
     // owner 권한을 가진 자가 다른 주소로 권한 위임
    function transferOwnership(address _to) public onlyOwner {
        require(_to != owner);
        require(_to != address(0x0));
        owner = _to;
        emit OwnerTransferPropose(owner, _to);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;IssuerHelper&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1649320375444&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// IssuerHelper는 Issuer을 추가 또는 삭제할 수 있다
// 그 기능은 onlyOwner로 제한되어 Owner만 제어 가능
abstract contract IssuerHelper is OwnerHelper {
    mapping(address =&amp;gt; bool) public issuers;

    event AddIssuer(address indexed _issuer);
    event DelIssuer(address indexed _issuer);

    modifier onlyIssuer() {
        require(isIssuer(msg.sender) == true);
        _;
    }

    constructor() {
        issuers[msg.sender] = true;
    }

    function isIssuer(address _addr) public view returns (bool) {
        return issuers[_addr];
    }

    function addIssuer(address _addr) public onlyOwner returns (bool) {
        require(issuers[_addr] == false);
        issuers[_addr] = true;
        emit AddIssuer(_addr);
        return true;
    }

    function delIssuer(address _addr) public onlyOwner returns (bool) {
        require(issuers[_addr] == true);
        issuers[_addr] = false;
        emit DelIssuer(_addr);
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CredentialBox : mapping, struct&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649320570608&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Credential 발행, 확인
contract CredentialBox is IssuerHelper {
    uint256 private idCount; // Credential이 한 주소에 하나씩만 발급받게 한다
    mapping(uint8 =&amp;gt; string) private vaccineEnum; // 백신 종류
    mapping(uint8 =&amp;gt; string) private statusEnum; // 접종 상태 (횟수)

    // VC를 구현하기 위한 구조체
    struct Credential {
        uint256 id; // index 순서 표기하는 idCount
        address issuer; // 발행자
        uint8 vaccineType; // 백신 증명서 타입
        uint8 statusType; //접종 상태 (횟수)
        string value; // 크리덴셜에 포함되어야 하는 암호화된 정보.
        // 중앙화된 서버에서 제공하는 신원, 서명 등이 JSON 형태로 저장됨
        uint256 createDate;
    }

    // 주소값으로 발급된 크리덴셜 확인
    mapping(address =&amp;gt; Credential) private credentials;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CredentialBox : constructor&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649320617828&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    constructor() {
        idCount = 1;
        vaccineEnum[0] = &quot;미접종 권고 대상자&quot;; //약물알러지, 기저질환 등
        vaccineEnum[1] = &quot;PFI&quot;; //화이자
        vaccineEnum[2] = &quot;JOH&quot;; //얀센
        vaccineEnum[3] = &quot;AST&quot;; //아스트라제네카
        vaccineEnum[4] = &quot;NOV&quot;; //노바백스
        vaccineEnum[5] = &quot;MOD&quot;; //모더나
        statusEnum[0] = &quot;미접종&quot;; // 접종 상태 (횟수)
        statusEnum[1] = &quot;1회차&quot;;
        statusEnum[2] = &quot;2회차&quot;;
        statusEnum[3] = &quot;3회차&quot;;
        statusEnum[4] = &quot;4회차&quot;;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CredentialBox :&amp;nbsp;&lt;/b&gt;&lt;b&gt;claimCredential&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649320679763&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// claimCredential 함수로 Credential 발행
    function claimCredential(
        address _vaccineAddress,
        uint8 _vaccineType,
        uint8 _vaccineStatusType,
        string calldata _value
    ) public onlyIssuer returns (bool) {
        Credential storage credential = credentials[_vaccineAddress];

        // credential의 id가 0일 경우에만 함수 작동
        require(credential.id == 0);
        credential.id = idCount;
        credential.issuer = msg.sender;
        credential.vaccineType = _vaccineType;
        credential.statusType = 0;
        credential.value = _value;
        credential.createDate = block.timestamp; //block.timestamp를 활용해 크리덴셜을 클레임한 시간 저장

        idCount += 1;

        return true;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CredentialBox : getCredential, addStatusType, changeStatus&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1649320751102&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// getCredential 함수로 Credential을 발행한 주소에서 VC확인
    function getCredential(address _vaccineAddress)
        public
        view
        returns (Credential memory)
    {
        return credentials[_vaccineAddress];
    }

    function addVaccineType(uint8 _type, string calldata _value)
        public
        onlyIssuer
        returns (bool)
    {
        require(bytes(vaccineEnum[_type]).length == 0);
        vaccineEnum[_type] = _value;
        return true;
    }

    function getVaccineType(uint8 _type) public view returns (string memory) {
        return vaccineEnum[_type];
    }

    // bytes로 변환하여 길이로 String이 null인지 검사
    // 내부 statusEnum의 Type이 중복되는 타입이 존재하는지 검사
    function addStatusType(uint8 _type, string calldata _value)
        public
        onlyIssuer
        returns (bool)
    {
        require(bytes(statusEnum[_type]).length == 0);
        statusEnum[_type] = _value;
        return true;
    }

    function getStatusType(uint8 _type) public view returns (string memory) {
        return statusEnum[_type];
    }

    // 특정 사용자의 상태 변경
    // statusType의 값을 가져와 변경한다
    function changeStatus(address _vaccine, uint8 _type)
        public
        onlyIssuer
        returns (bool)
    {
        require(credentials[_vaccine].id != 0);
        require(bytes(statusEnum[_type]).length != 0);
        credentials[_vaccine].statusType = _type;
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;&lt;b&gt;  전체 코드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1649320132169&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 - potterpeter/vaccine-DID: vaccine DID&quot; data-og-description=&quot;vaccine DID. Contribute to potterpeter/vaccine-DID development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/potterpeter/vaccine-DID&quot; data-og-url=&quot;https://github.com/potterpeter/vaccine-DID&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/potterpeter/vaccine-DID&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/potterpeter/vaccine-DID&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;GitHub - potterpeter/vaccine-DID: vaccine DID&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;vaccine DID. Contribute to potterpeter/vaccine-DID 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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>텃밭 1 : BlockChain/SSI | DID</category>
      <author>parallelworlds</author>
      <guid isPermaLink="true">https://1parallelworlds.tistory.com/149</guid>
      <comments>https://1parallelworlds.tistory.com/149#entry149comment</comments>
      <pubDate>Thu, 7 Apr 2022 15:55:21 +0900</pubDate>
    </item>
    <item>
      <title>[SSI | DID] DID Document 구성요소 : id</title>
      <link>https://1parallelworlds.tistory.com/146</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-31 오전 2.45.11.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceHoXk/btrx19cUb1o/3gCIkTrbRWmgG6NuRXOkw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceHoXk/btrx19cUb1o/3gCIkTrbRWmgG6NuRXOkw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceHoXk/btrx19cUb1o/3gCIkTrbRWmgG6NuRXOkw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceHoXk%2Fbtrx19cUb1o%2F3gCIkTrbRWmgG6NuRXOkw0%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;250&quot; height=&quot;441&quot; data-filename=&quot;스크린샷 2022-03-31 오전 2.45.11.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;DID Document&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DID Document에는 DID의 소유권을 증명할 수 있는 인증 수단이 포함된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;+)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대부분의 DID 플랫폼은 DID와 DID doc 생성 시 비대칭키를 함께 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성한 비대칭키의 비밀키는 본인이 보관하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공개키는 DID doc에 넣어 블록체인에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예) DID 소유권을 증명하는 DID Auth 방법 중 하나&lt;/b&gt;&lt;/h4&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;스크린샷 2022-03-31 오전 11.43.23.png&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBNQcl/btrxVEkUlJa/qXNrfcVh2Ddpza47MydbeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBNQcl/btrxVEkUlJa/qXNrfcVh2Ddpza47MydbeK/img.png&quot; data-alt=&quot;소유권 증명 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBNQcl/btrxVEkUlJa/qXNrfcVh2Ddpza47MydbeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBNQcl%2FbtrxVEkUlJa%2FqXNrfcVh2Ddpza47MydbeK%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;555&quot; height=&quot;275&quot; data-filename=&quot;스크린샷 2022-03-31 오전 11.43.23.png&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;소유권 증명 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 사용자가 검증기관에 did:ethr:1234가 본인의 DID 라고 주장한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 검증기관은 사용자의 DID 를 통해 사용자 DID Document 가 저장된 위치를 확인하고 획득한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 검증기관은 획득한 DID Document를 이용하여 해당 DID 가 사용자가 생성한 DID임을 인증해보라는 challenge 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; challenge를 받은 사용자는 인증을 위해 challenge에 해당하는 response를 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; response를 받은 검증기관은 사용자의 DID Document에 포함된 공개키를 이용하여 검증&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DID Document에는&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;@context,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;id,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;publicKey,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;authentication,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;service 라는 중요 항목이 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;DID Doc - id&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DID Document의 id 항목에는 id를 통해 식별되는 객체(사람, 물건 등)의 DID가 들어있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반적으로 DID와 DID Doc를 생성하고 등록한 사람의 DID가 id 항목에 들어간다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-31 오전 11.58.21.png&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0ByCc/btrx4THbbiO/KvT4zz8MvsAFTOOylFazYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0ByCc/btrx4THbbiO/KvT4zz8MvsAFTOOylFazYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0ByCc/btrx4THbbiO/KvT4zz8MvsAFTOOylFazYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0ByCc%2Fbtrx4THbbiO%2FKvT4zz8MvsAFTOOylFazYK%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;186&quot; height=&quot;304&quot; data-filename=&quot;스크린샷 2022-03-31 오전 11.58.21.png&quot; data-origin-width=&quot;243&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DID Document 생성 및 요청과정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 사용자는 DID를 생성한 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; DID Doc를 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DID Doc의 id 값에는 생성했던 DID 외 향후 소유권 인증(DID Auth)에 필요한 값 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; DID Doc 생성을 완료하면 DID method에 정의된 저장소에 DID Doc 등록&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-31 오후 12.01.12.png&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cffUnF/btrx30zNlGh/TgX2ZCKK2tIKYJAUDdh2a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cffUnF/btrx30zNlGh/TgX2ZCKK2tIKYJAUDdh2a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cffUnF/btrx30zNlGh/TgX2ZCKK2tIKYJAUDdh2a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcffUnF%2Fbtrx30zNlGh%2FTgX2ZCKK2tIKYJAUDdh2a1%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;370&quot; height=&quot;259&quot; data-filename=&quot;스크린샷 2022-03-31 오후 12.01.12.png&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DID Document&amp;nbsp; 반환 과정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; DID Doc 생성 후 사용자가 검증기관에게 자신의 DID를 알려주면&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 검증기관은 사용자의 DID method에 명시된 블록체인에 DID Doc를 반환해 줄 것을 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; DID Doc 반환 요청을 받은 블록체인은 저장된 DID Doc 중 id 항목이&amp;nbsp;검증기관이 요청한 DID 와 동일한 DID Doc를 찾아서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 검증기관에게 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;+)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DID를 사용하는 당사자만이 직접 did를 생성할 수 있는 것은 아니다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DID로 식별되는 사용자 대신 다른 인물이 DID를 생성하고 인증하는 경우,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자를 식별하기 위한 DID는 DID Doc의 id 항목에 들어가고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자의 DID를 대신 생성해주고 해당 DID의 소유권을 인증할 수 있는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DID 생성자는 controller 항목에 들어가게 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>텃밭 1 : BlockChain/SSI | DID</category>
      <author>parallelworlds</author>
      <guid isPermaLink="true">https://1parallelworlds.tistory.com/146</guid>
      <comments>https://1parallelworlds.tistory.com/146#entry146comment</comments>
      <pubDate>Thu, 31 Mar 2022 12:05:23 +0900</pubDate>
    </item>
    <item>
      <title>[SSI | DID] DID(Decentralized IDentifier) 구성요소, 생성과 사용과정</title>
      <link>https://1parallelworlds.tistory.com/145</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-31 오전 2.45.11.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QjMf8/btrx3Z1AQFf/rMOeEKylDtiwIkNjoBSHh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QjMf8/btrx3Z1AQFf/rMOeEKylDtiwIkNjoBSHh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QjMf8/btrx3Z1AQFf/rMOeEKylDtiwIkNjoBSHh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQjMf8%2Fbtrx3Z1AQFf%2FrMOeEKylDtiwIkNjoBSHh1%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;250&quot; height=&quot;441&quot; data-filename=&quot;스크린샷 2022-03-31 오전 2.45.11.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;DID(Decentralized&amp;nbsp;IDentifier)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용하는 사람 스스로 생성하고 제어할 수 있는 분산형 식별자&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DID를 사용하는 객체에 대한 식별자로 사용될 뿐만 아니라,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인증 수단인 DID document를 참조할 수 있는 URI 역할까지 동시에 수행가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;+)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;분산형 식별자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;동일한 식별자가 생성되지 않은 구조로 만들어진다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;URI&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인터넷에 존재하는 자원을 나타내는 주소&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서, DID는 즉 DID doc의 위치를 나타낼 수 있는 주소&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;DID 구성요소&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0sv1P/btrx0s5APUm/WXd9EZbhmY0C8kEkVZUrEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0sv1P/btrx0s5APUm/WXd9EZbhmY0C8kEkVZUrEK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;135&quot; data-filename=&quot;스크린샷 2022-03-31 오전 11.18.18.png&quot; style=&quot;width: 66.5472%; margin-right: 10px;&quot; data-widthpercent=&quot;67.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0sv1P/btrx0s5APUm/WXd9EZbhmY0C8kEkVZUrEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0sv1P%2Fbtrx0s5APUm%2FWXd9EZbhmY0C8kEkVZUrEK%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;416&quot; height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mr7zX/btrx0DL2TcB/uSDhFGvPbaBDgMFFRIML8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mr7zX/btrx0DL2TcB/uSDhFGvPbaBDgMFFRIML8K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;208&quot; data-filename=&quot;스크린샷 2022-03-31 오전 11.18.58.png&quot; style=&quot;width: 32.29%;&quot; data-widthpercent=&quot;32.67&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mr7zX/btrx0DL2TcB/uSDhFGvPbaBDgMFFRIML8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMr7zX%2Fbtrx0DL2TcB%2FuSDhFGvPbaBDgMFFRIML8K%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;311&quot; height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DID scheme&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;URI가 어떤 프로토콜을 사용해서 자원에 접근하는지 명시&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DID method&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DID doc가 어떤 저장소에 저장되어 있는지 보여준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예) DID method에 btcr이 명시되어 있으면 비트코인에 접근하여 DID doc를 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;method-specific identifier&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;DID&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;method 가 가리키는 저장소 내 DID doc가 저장된 정확한 위치를 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예)&amp;nbsp; &lt;span&gt;DID&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;method를 참조해서 비트모인 블록체인에 접근한 후 method-specific identifier를 이용해 검색하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DID doc을 가져올 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;DID와 DID document의 사용 과정&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;스크린샷 2022-03-31 오전 11.22.21.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhD9AU/btrx0K5YHVy/VcZ6Zfbsl2tSmEjNsYUzc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhD9AU/btrx0K5YHVy/VcZ6Zfbsl2tSmEjNsYUzc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhD9AU/btrx0K5YHVy/VcZ6Zfbsl2tSmEjNsYUzc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhD9AU%2Fbtrx0K5YHVy%2FVcZ6Zfbsl2tSmEjNsYUzc0%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;302&quot; data-filename=&quot;스크린샷 2022-03-31 오전 11.22.21.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 사용자 1은 DID와 DID doc을 생성한 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; DID doc은 DID method에 명시된 저장소에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 사용자 2가 사용자 1의 DID 주소를 알고 있다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; DID에 명시된 저장소와 저장소 내 method-specific identifier가 가르키는 위치에 저장된 사용자 1의 DID doc을 획득 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;DID와 DID document의 생성&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대부분의 DID 플랫폼은 DID와 DID doc 생성 시 비대칭키를 함께 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성한 비대칭키의 비밀키는 본인이 보관하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;공개키는 DID doc에 넣어 블록체인에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DID의 생성 구조는 플랫폼마다 조금씩 다르다&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Sovrin 블록체인의 DID는 비대칭키 생성 시 공개키의 일부분이 &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;method-specific identifier가 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; &lt;span&gt;DID는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;did:sov:공개키&lt;/b&gt; 구조로 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이더리움은 어카운트 주소가 method-specific identifier가 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; DID는 &lt;b&gt;did:ethr:어카운트&lt;/b&gt; 구조로 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>텃밭 1 : BlockChain/SSI | DID</category>
      <author>parallelworlds</author>
      <guid isPermaLink="true">https://1parallelworlds.tistory.com/145</guid>
      <comments>https://1parallelworlds.tistory.com/145#entry145comment</comments>
      <pubDate>Thu, 31 Mar 2022 11:32:21 +0900</pubDate>
    </item>
    <item>
      <title>[SSI | DID] SSI 자기주권 신원증명 인증</title>
      <link>https://1parallelworlds.tistory.com/144</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-31 오전 2.45.11.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUFTr6/btrx18YY6km/KeIU2eUOa2wt7EoF6v7SI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUFTr6/btrx18YY6km/KeIU2eUOa2wt7EoF6v7SI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUFTr6/btrx18YY6km/KeIU2eUOa2wt7EoF6v7SI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUFTr6%2Fbtrx18YY6km%2FKeIU2eUOa2wt7EoF6v7SI1%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;250&quot; height=&quot;224&quot; data-filename=&quot;스크린샷 2022-03-31 오전 2.45.11.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;SSI&amp;nbsp;자기주권&amp;nbsp;신원증명&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대부분의 SSI 플랫폼은 블록체인 기술을 기반으로 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모든 SSI 플랫폼이 블록체인을 통해 개발될 필요는 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;블록체인에 참여하는 모든 사람이 동일한 원장을 소유하고 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모든 정보가 암호화되어 Append-only 방식으로만 원장에 저장된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉, 한 번 원장에 기록된 정보는 절대 수정할 수 없다(불가변성 특성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;블록체인 참여자는 스마트 컨트랙트를 통해 분산원장에 정보를 기록하거나 불러올 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;size18&quot;&gt;블록체인에 참여하는 모든 사람이 동일한 원장을 소유하기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 조건을 만족시키기 위해 참여한 노드의 합의가 필요하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;SSI 특징&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;블록체인에 저장된 데이터는 이미 구성원 간 신뢰에 대한 합의가 끝난 데이터이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;따라서 기존 검증과 달리, 신뢰성을 위한 별도의 기능을 고려하지 않고 저장된 데이터를 바탕으로 검증가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;신원인증을 위해 제출하는 ID에 새로운 속성을 추가하거나 민감한 정보를 삭제해 제출 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Verifiable Credential 이라는 보관용 ID와,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Verifiable Presentation 이라는 제출용 ID가 따로 존재한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보관용 ID는 신분증, 졸업 증명서와 같이 각 기관에서 발급하는 전자 증명서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자는 보관용 ID의 속성 중 필요한 부분만 추출하여 제출용 ID를 생성한 뒤 제출할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;스크린샷 2022-03-31 오전 2.55.54.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MaxBD/btrx0LDq7Rn/GtyY2s6ChQ8gEy1TXBrr5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MaxBD/btrx0LDq7Rn/GtyY2s6ChQ8gEy1TXBrr5k/img.png&quot; data-alt=&quot;SSI 플랫폼에서 사용하는 ID&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MaxBD/btrx0LDq7Rn/GtyY2s6ChQ8gEy1TXBrr5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMaxBD%2Fbtrx0LDq7Rn%2FGtyY2s6ChQ8gEy1TXBrr5k%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;459&quot; height=&quot;339&quot; data-filename=&quot;스크린샷 2022-03-31 오전 2.55.54.png&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSI 플랫폼에서 사용하는 ID&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;size18&quot;&gt;또한 영지식 증명 기술을 사용한다면, 검증자에게 ID속성 값을 알려주지 않고도 ID 속성을 검증할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SSI에서 사용되는 ID는 모두 전자기기에 암호화되어 안전하게 저장돼서 사용된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기존의 중앙화된 CA 중심의 구조 대신 SSI 기술의 DID (탈중앙식별자)를 사용하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;탈중앙화된 구조에서 안전하게 공개키를 교환할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;SSI 구성요소&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSI 플랫폼의 구성요소&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;식별자와,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인증수단으로 사용되는 DID 및 DID doc,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보관용 ID로 사용되는 VC(검증가능한 자격증명),&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;제출용 ID로 사용되는 VP(검증 가능한 제공 ID 데이터 집합) 으로 이루어져 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSI 플랫폼의 주요 참여자&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;VC를 발행하는 발행인(issuer),&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;VC를 발급받은 후 VP로 가공하여 검증기관에 제출하는 사용자 (holder),&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자로부터 VP를 수신하여 VP의 진위를 검증하는 검증인(verifier),&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 DID 및 ID 관련 정보를 저장하는 분산 저장소인 블록체인이 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;+)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;분산 저장소는 꼭 블록체인을 사용하지 않아도 되지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재 SSI의 기술적 요구 조건을 수용하기에 가장 적절한 수단이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;VC | VP&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보관용 ID로 사용된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자가 발행기관으로부터 발급받은 신분증, 졸업증명서, 재직증명서 등과 같은 신원증명 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자는 VC를 직접 사용하지 않고, 제출용 ID인 VP로 필요한 속성만 추출 가공해서 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;DID&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;VC와 VP에 들어가는 식별자&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;VC와 VP에는 사용자와 발행기관의 DID가 명시된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;##&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;따라서 VP를 수신한 검증기관은 VP를 올바른 사용자로부터 수신했는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;VP 제출자 DID를 통해 알 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;##&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;VP내 포함된 VC속성을 가진 사람이 사용자가 맞는지는&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;VC 내 명시된 subject(사용자) DID를 통해 알 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;##&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;VP내 포함된 VC속성 값이 어떤 발행기관에서 발행 됐는지는&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;발행기관의 DID을 통해 알 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;##&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;검증기관은 VP내 포함된 VC속성의 ubject(사용자) DID가 진짜 사용자의 것인지&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DID Auth를 통해 알 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;+)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;블록체인에 저장되는 데이터는 누구나 열람하고 획득할 수 있는 데이터이기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SSI 플랫폼을 설계할 때는 DID 관련 정보 외에 어떤 데이터가 블록체인에 저장될지 신중하게 결정해야 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;스크린샷 2022-03-31 오전 3.22.51.png&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Mazb/btrx2RCF7t8/kU2kRWpiNcjrjaVixaP7T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Mazb/btrx2RCF7t8/kU2kRWpiNcjrjaVixaP7T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Mazb/btrx2RCF7t8/kU2kRWpiNcjrjaVixaP7T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Mazb%2Fbtrx2RCF7t8%2FkU2kRWpiNcjrjaVixaP7T1%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;619&quot; height=&quot;316&quot; data-filename=&quot;스크린샷 2022-03-31 오전 3.22.51.png&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;316&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;&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>텃밭 1 : BlockChain/SSI | DID</category>
      <category>vp #vc #did #신원인증 #블록체인</category>
      <author>parallelworlds</author>
      <guid isPermaLink="true">https://1parallelworlds.tistory.com/144</guid>
      <comments>https://1parallelworlds.tistory.com/144#entry144comment</comments>
      <pubDate>Thu, 31 Mar 2022 03:23:26 +0900</pubDate>
    </item>
    <item>
      <title>[블록체인이론] 이더리움 데이터 계층 : 어카운트 구조와 생성</title>
      <link>https://1parallelworlds.tistory.com/143</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-12 오후 10.41.37.png&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L4wJh/btrxUYWFE8T/54ZL7QwzWIKdlgnVEABksK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L4wJh/btrxUYWFE8T/54ZL7QwzWIKdlgnVEABksK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L4wJh/btrxUYWFE8T/54ZL7QwzWIKdlgnVEABksK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL4wJh%2FbtrxUYWFE8T%2F54ZL7QwzWIKdlgnVEABksK%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;212&quot; height=&quot;501&quot; data-filename=&quot;스크린샷 2022-03-12 오후 10.41.37.png&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;이더리움 플랫폼 데이터 계층 : 어카운트&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이더리움 플랫폼에서 어카운트는 모든 트랜잭션의 실행 주체이자 기본 단위로서 모든 것은 어카운트에서 시작한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이더리움은 두 가지 어카운트 타입을 갖는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;어카운트&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;외부소유 어카운트 EOA&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반적으로 말하는 이더리움 사용자 어카운트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사람이 직접 개인키로 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스마트 컨트랙트 실행 코드를 가지고 있지 않다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;개인 키를 분실하면 해당 어카운트도 분실한 것과 마찬가지이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;EOA는 개인 키를 사용하여 전자 서명된 트랜잭션을 생성 및 실행함으로써&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다른 EOA나 컨트랙트 어카운트에 메시지를 보낸다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;보통, EOA 간의 메시지는 이더를 전송하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또는 EOA가 컨트랙트 어카운트에 메시지를 보내 해당 코드를 실행시켜 다양한 결과를 만들 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;컨트랙트 어카운트 CA&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반적으로 말하는 스마트 컨트랙트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;컨트랙트 어카운트는 외부 소유 어카운트나 다른 컨트랙트 어카운트의 메시지를 받은 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;내부의 스마트 컨트랙트 코드를 실행한 후,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새로운 컨트랙트를 생성하거나 다른 메시지를 읽거나 보낸다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또한, 필요하면 내부 저장 공간에 데이터를 저장할 수도 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러나 랜덤 넘버를 생성하거나 직접 운영체제를 조작하는 API를 호출하는 작업 등은 할 수 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;오직 EOA나 다른 컨트랙트 보드에 의해서만 작동된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉 자기 자신이 직접 새로운 트랜잭션을 실행할 수는 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;스크린샷 2022-03-30 오전 1.39.52.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ox2i2/btrxNZP9b04/yodkVtEf9oeMiTONXzNKA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ox2i2/btrxNZP9b04/yodkVtEf9oeMiTONXzNKA0/img.png&quot; data-alt=&quot;외부 소유 어카운트와 컨트랙트 어카운트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ox2i2/btrxNZP9b04/yodkVtEf9oeMiTONXzNKA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fox2i2%2FbtrxNZP9b04%2FyodkVtEf9oeMiTONXzNKA0%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;631&quot; height=&quot;295&quot; data-filename=&quot;스크린샷 2022-03-30 오전 1.39.52.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;외부 소유 어카운트와 컨트랙트 어카운트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;어카운트 구조&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1648577964221&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type Account struct {
	Nonce	uint64
    Balance	*big.Int
    Root	common.Hash
    CodeHash	[]byte //머클 패트리시아 트리의 루트 해시
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;어카운트 정보는 4개의 필드로 구성되어 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;넌스&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 어카운트로부터 보내진 트랜잭션의 수를 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;0으로 시작한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;트랜잭션을 오직 한 번만 실행되게 할 때 사용할 수 있는 카운터&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 컨트랙트 어카운트이면 넌스는 어카운트에 의해 생성된 컨트랙트 수다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;잔액&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 어카운트의 이더 잔고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;루트&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 어카운트가 저장될 머클 패트리시아 트리의 루트 노드&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;참고로, 실제 어카운트의 저장소는 머클 패트리시아 트리에 저장된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 트리의 루트 노드를 암호 해시한 것이 바로 루트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;암호 해시는 Keccak256 암호 해시를 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드해시&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 어카운트의 스마트 컨트랙트 바이트 코드의 해시&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;코드 해시값이 비어 있으면 해당 어카운트는 EOA이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;어카운트 생성&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모든 이더리움 어카운트는 개인 키와 공개 키의 쌍으로 정의된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;개인 키와 공개 키를 비대칭 키라고 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이더리움은 비대칭 암호화 알고리즘으로 256비트 ECDSA를 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이더리움은 C언어로 작성된 비트코인의 ECDSA 라이브러리인 secp256k1을 GO언어로 래핑하여 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ECDSA 서명 암호화를 통해 얻은 256비트 공개 키를&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다시 암호 해시 알고리즘 Keccak256을 사용하여 암호화하여 32바이트의 고정값을 생성하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 중 20바이트를 절삭하여 어카운트 주솟값으로 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ECDSA : 비대칭 암호 키의 생성 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Keccak256 : 임의의 값을 암호화 한 후 고정 크기 값을 생성해 내는 암호 해시 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 어카운트 주소 = Keccak256(공개키(ECDSA(개인키)))&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;스크린샷 2022-03-30 오전 3.39.50.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg0U1C/btrxHZbDUXu/V1BnJznjTsIokJFiP8qOB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg0U1C/btrxHZbDUXu/V1BnJznjTsIokJFiP8qOB0/img.png&quot; data-alt=&quot;어카운트 주소생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg0U1C/btrxHZbDUXu/V1BnJznjTsIokJFiP8qOB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg0U1C%2FbtrxHZbDUXu%2FV1BnJznjTsIokJFiP8qOB0%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;694&quot; height=&quot;634&quot; data-filename=&quot;스크린샷 2022-03-30 오전 3.39.50.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;어카운트 주소생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Account 패키지 : 어카운트 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반적으로 말하는 이더리움 사용자 어카운트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;코드분석  &lt;/b&gt;&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;a href=&quot;https://1parallelworlds.tistory.com/141&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2022.03.30 - [텃밭 1 : BlockChain/Go] - [Go] 이더리움 Account 패키지 : 어카운트 생성 코드 분석&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1648581778422&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;[Go] 이더리움 Account 패키지 : 어카운트 생성 코드 분석&quot; data-og-description=&quot;이더리움&amp;nbsp;Account&amp;nbsp;패키지&amp;nbsp;:&amp;nbsp;어카운트&amp;nbsp;생성&amp;nbsp;코드&amp;nbsp;분석 GitHub - potterpeter/core-ethereum-book-code-review: core ethereum book code review core ethereum book code review. Contribute to potterpete..&quot; data-og-host=&quot;1parallelworlds.tistory.com&quot; data-og-source-url=&quot;https://1parallelworlds.tistory.com/141&quot; data-og-url=&quot;https://1parallelworlds.tistory.com/141&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Q1NZw/hyNR2t0lmE/tDK93vNyWxJDAedc7Ik0uk/img.png?width=535&amp;amp;height=547&amp;amp;face=0_0_535_547,https://scrap.kakaocdn.net/dn/bzGWAa/hyNR2U4Mtk/kpzBOQgKaxQOLy8HhEvd20/img.png?width=535&amp;amp;height=547&amp;amp;face=0_0_535_547,https://scrap.kakaocdn.net/dn/CTLV4/hyNR3sU5u8/GAGT9ccmgFuNhhQMkK9b8k/img.jpg?width=905&amp;amp;height=905&amp;amp;face=0_0_905_905&quot;&gt;&lt;a href=&quot;https://1parallelworlds.tistory.com/141&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://1parallelworlds.tistory.com/141&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Q1NZw/hyNR2t0lmE/tDK93vNyWxJDAedc7Ik0uk/img.png?width=535&amp;amp;height=547&amp;amp;face=0_0_535_547,https://scrap.kakaocdn.net/dn/bzGWAa/hyNR2U4Mtk/kpzBOQgKaxQOLy8HhEvd20/img.png?width=535&amp;amp;height=547&amp;amp;face=0_0_535_547,https://scrap.kakaocdn.net/dn/CTLV4/hyNR3sU5u8/GAGT9ccmgFuNhhQMkK9b8k/img.jpg?width=905&amp;amp;height=905&amp;amp;face=0_0_905_905');&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;[Go] 이더리움 Account 패키지 : 어카운트 생성 코드 분석&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이더리움&amp;nbsp;Account&amp;nbsp;패키지&amp;nbsp;:&amp;nbsp;어카운트&amp;nbsp;생성&amp;nbsp;코드&amp;nbsp;분석 GitHub - potterpeter/core-ethereum-book-code-review: core ethereum book code review core ethereum book code review. Contribute to potterpete..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;1parallelworlds.tistory.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;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;어카운트 상태&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;어카운트들이 모인 것을 이더리움에서는 상태라고 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 stateObject 구조체로 표현한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;어카운트에 접근하여 상태를 변경하려면 stateObject를 통해 접근한 후 상태를 변경할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;변경된 어카운트는 CommitTrie() 함수를 호출하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;변경된 Trie를 ethdb 패키지를 통해 levelDB에 업데이트한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648582861488&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//go-ethereum/core/state/state_object.go / 66

type stateObject struct {
	address  common.Address
	addrHash common.Hash // hash of ethereum address of the account
	data     types.StateAccount
	db       *StateDB

	// DB error.
	// State objects are used by the consensus core and VM which are
	// unable to deal with database-level errors. Any error that occurs
	// during a database read is memoized here and will eventually be returned
	// by StateDB.Commit.
	dbErr error

	// Write caches.
	trie Trie // storage trie, which becomes non-nil on first access
	code Code // contract bytecode, which gets set when code is loaded

	originStorage  Storage // Storage cache of original entries to dedup rewrites, reset for every transaction
	pendingStorage Storage // Storage entries that need to be flushed to disk, at the end of an entire block
	dirtyStorage   Storage // Storage entries that have been modified in the current transaction execution
	fakeStorage    Storage // Fake storage which constructed by caller for debugging purpose.

	// Cache flags.
	// When an object is marked suicided it will be delete from the trie
	// during the &quot;update&quot; phase of the state transition.
	dirtyCode bool // true if the code was updated
	suicided  bool
	deleted   bool
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>텃밭 1 : BlockChain/이론</category>
      <author>parallelworlds</author>
      <guid isPermaLink="true">https://1parallelworlds.tistory.com/143</guid>
      <comments>https://1parallelworlds.tistory.com/143#entry143comment</comments>
      <pubDate>Wed, 30 Mar 2022 04:42:34 +0900</pubDate>
    </item>
  </channel>
</rss>