<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jo0n-lab.log</title>
        <link>https://velog.io/</link>
        <description>AI유치원</description>
        <lastBuildDate>Fri, 21 Oct 2022 13:45:10 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jo0n-lab.log</title>
            <url>https://velog.velcdn.com/images/jo0n-lab/profile/c57cee35-6ec0-4487-9b95-1186994b5519/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jo0n-lab.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jo0n-lab" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[블록체인]]></title>
            <link>https://velog.io/@jo0n-lab/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8</link>
            <guid>https://velog.io/@jo0n-lab/%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8</guid>
            <pubDate>Fri, 21 Oct 2022 13:45:10 GMT</pubDate>
            <description><![CDATA[<h1 id="비트코인이란-문제와-해결을-중심으로">비트코인이란? (문제와 해결을 중심으로)</h1>
<ul>
<li>비스코인 시스템의 원리</li>
<li>탈중앙화 시스템</li>
<li>여러가지 문제들의 해결 방법</li>
</ul>
<h2 id="비트코인의-원리">비트코인의 원리</h2>
<p>비트코인은 프로토콜의 집합이다. 즉 규칙이 정해져 있는 통신시스템이다.</p>
<ul>
<li>비트코인은 transaction 이라는 거래명부(돈의 흐름을 기록)로 이뤄진다.<ul>
<li>transaction 이란?<ul>
<li>“A가 B에게 1BTC 보냈음” 의 정보가 담긴 것</li>
</ul>
</li>
</ul>
</li>
<li>transaction 들을 여러 개 모아서 block 안에 기록한다.</li>
<li>이래서 이름이 <code>블록체인</code> 인거임</li>
</ul>
<h2 id="의문점과-문제점">의문점과 문제점</h2>
<ul>
<li><p>명부(transaction) 는 누가 관리합니까?</p>
<ul>
<li>누구나 열람할 수 있도록<ul>
<li>즉, account 만 있다면 누구나 열여보고 확인할 수 있다.. 완전 naked…</li>
<li>그러나 권리에 따른 책임은 없는 시스템!! : 언제든지 들어오고 나갈 수 있음</li>
</ul>
</li>
</ul>
</li>
<li><p>계정(account) 는 누가, 어떻게 생성합니까?</p>
<ul>
<li>public key 로 계정 생성<ul>
<li>생성된 public key 가 사용자의 아이디 및 adress 가 된다.</li>
<li>public key 이므로 누구나 개인의 adress 에 접근할 수 있음</li>
</ul>
</li>
<li>계정의 비밀번호는 <code>디지털 서명</code> 으로 작동<ul>
<li><code>디지털 서명</code> 을 만들기 위해서는 private key가 필요</li>
<li>즉, public key(adress) 의 짝이 되는 private key 가 계정 생성 시 부여됩니다~~</li>
</ul>
</li>
<li>계정 생성에는 횟수 제한이 없음</li>
</ul>
</li>
<li><p>거래의 순서 :  A→B→C vs B→C→A 처럼 양립할 수 없는 거래의 순서는 매우 중요하다.</p>
<ul>
<li>송출의 기록(transaction)을 여러개로 묶어서 블록 안에 기록<ul>
<li>블록 단위로 기록되므로 거래의 순서는 곧 블록의 순서가 될 것임</li>
<li>즉, 다음과 같은 과정을 통해 누군가의 소비가 인정된다.<ul>
<li>A는 transaction : A→B 를 채굴자에게 요구</li>
<li>transaction 이 유효한지 검사 (유효하면,)</li>
<li>채굴자는 transaction 을 블록 안에 넣어줌</li>
<li>블럭이 채굴되면</li>
<li>다른 채굴자들에게 유효한지 시험받음</li>
<li>최종적으로 의견일치가(6블럭 정도) 되면 거래가 인정됨</li>
</ul>
</li>
<li>6블럭 정도 이후에 B는 ‘안전하게’ A가 요청한 transaction 을 통해 새로운 transaction 을 요구할 수 있음</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="블록체인-암호학">블록체인 암호학</h1>
<p>블록체인의 보안을 담당하는 여러가지 암호(crypto) 기법을 알아보고, 어떻게 목적을 달성하는 지 알아본다.</p>
<h2 id="암호학의-4대-목표">암호학의 4대 목표</h2>
<ul>
<li>Confidentiality(기밀성) : 데이터가 유출되지 않았는가(나에게만 보이는가)?</li>
<li>Data integrity(무결성) : 데이터가 훼손되지 않았는가</li>
<li>Authentication(신빙성) : 데이터가 원본인가? 진짜를 흉내낸 가짜가 아닌가?</li>
<li>Non-repudiation(부인방지) : 이미 일어난 사건에 대해 부인하는 것을 막을 수 있는가?</li>
</ul>
<h2 id="암호학-용어-및-가정">암호학 용어 및 가정</h2>
<h3 id="용어">용어</h3>
<ul>
<li><code>cipher</code>, <code>cryptosystem</code> : <code>plaintext</code> 를 <code>encrypt</code> (암호화) 시키는데 사용되는 알고리즘<ul>
<li><code>plaintext</code> : 암호화의 대상. 수신자에게 유출되지 않고 전달되어야 하는 목표가 있음</li>
<li><code>encrypt(plaintext,key)=ciphertext</code></li>
<li><code>ciphertext</code> : 암호화된 <code>plaintext</code></li>
</ul>
</li>
<li><code>ciphertext</code> 를 <code>decrypt</code> (복호화) 시켜 <code>plaintext</code> 추출해냄<ul>
<li><code>plaintext=decrypt(ciphertext,key)</code></li>
<li><code>private_key</code> : 수신자만이 가지고 있는 복호화의 열쇠(key)</li>
</ul>
</li>
<li>symmetric key system : <code>encrypt</code> 와 <code>decrypt</code> 하는데 유일한(하나의) 키가 사용되는 시스템
  <img src="https://velog.velcdn.com/images/jo0n-lab/post/8513a793-2560-41f2-8a1d-fadf3669c7fc/image.png" alt=""></li>
</ul>
<ul>
<li>asymmetric key system : <code>public_key</code> 로 <code>encrypt</code> , <code>decrypt</code> 시 <code>private_key</code> 사용됨</li>
</ul>
<h3 id="가정">가정</h3>
<ul>
<li>모든 암호학 시스템은 공격자에게 알려져 있다.<ul>
<li>알려져도 상관없다는 말</li>
<li>즉, 알려져도 안전한 시스템을 만드는 것이 목표</li>
</ul>
</li>
</ul>
<h2 id="cipher-기법"><code>cipher</code> 기법</h2>
<ul>
<li>random functions - <code>hash</code> functions<ul>
<li>input : 길이의 제한이 없다 $0\sim \infty$ , output : 길이가 고정되어 있다</li>
<li>입력의 길이엔 제한이 없으나 출력의 길이가 일정하므로 <code>충돌 crash</code> 이 발생할 수 있음<ul>
<li>충돌 : 서로 다른 input 에 대해서 output 이 똑같은 상황</li>
</ul>
</li>
</ul>
</li>
<li>random generator - stream ciphers<ul>
<li>input 의 길이가 짧고 output 의 길이가 길다</li>
</ul>
</li>
<li>random permutations - block ciphers<ul>
<li>key 를 통해 input 을 output 으로 output 을 input 으로</li>
<li>input, output 모두 일정한 길이</li>
</ul>
</li>
<li>public key encryption<ul>
<li>public key 를 통해 encryption 을 누구나 할 수 있음</li>
<li>열어보는 것은 private key 소유자만 가능</li>
</ul>
</li>
<li>digital key signatures<ul>
<li>private key 소유자만 사인 가능</li>
<li>누구든지 public key 통해 사인의 유효성 검증 가능</li>
</ul>
</li>
</ul>
<h2 id="symmetric-crypto">symmetric crypto</h2>
<h3 id="hash-collision-issue---해시함수에서의-충돌-문제">hash collision issue :  해시함수에서의 충돌 문제</h3>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/4869f8cf-a2f0-4ac6-8f41-ae191117b6c9/image.png" alt=""></p>
<ul>
<li>collision resistance : 같은 해시값을 출력하는 두 개의 입력값을 찾기 어렵다.</li>
<li>preimage resistance : 특정 해시값을 만족시키는 입력값을 찾기 어렵다(POW).</li>
<li>second-preimage resistance : 특정 입력값에 해당하는 해시값을 동일하게 가지는 다른 입력값을 찾기 어렵다.</li>
</ul>
<p>모두 다 같은 말처럼 보이지만 공격자의 목표에 따라 각각 다른 의미를 지닌다.</p>
<h3 id="cryptographic-hash-function-에서-요구되는-것">cryptographic hash function 에서 요구되는 것</h3>
<ul>
<li>압축성 compression  : output(해시값)의 길이가 짧아야 한다.</li>
<li>효율성 efficiency : 입력값으로 해시값을 얻어내는 데 계산이 쉬워야(빨라야)한다. $hash(x)\text{ is fast and easy}$</li>
<li>단방향 one-way : 해시값을 얻는 입력값을 찾기 어려워야 한다. $\text{hard to find } x\text{ that                   } h(x)=y$</li>
<li>충돌안정성 collision resistance : 충돌이 일어나는 것을 완전히 막을 수 없으나, 충돌이 발생하는 입력을 찾는 게 매우매우매우 어려워야 한다.</li>
</ul>
<h3 id="hash-function-의-안정성">hash function 의 안정성</h3>
<ul>
<li><p><strong>Birthday Paradox</strong></p>
<p>  n 명이 있을 때, 어느 두명이 생일을 공유할 확률</p>
<p>  $$
  _nC_2\cdot \left(\frac{1}{365}\right)^2\left(\frac{364}{365}\right)^{n-2} =\frac{1}{2}
  $$</p>
<p>  위 식에서 $(364/365)^{n-2} \to 1$ 로 하면 다음과 같이 간단하게 $n$ 을 구할 수 있다.</p>
<p>  $$
  \frac{n(n-1)}{2}\left(\frac{1}{365}\right)^2=\frac{1}{2};;;;; take;;
  \frac{n(n-1)}{2}\approx \frac{n^2}{2}\
  \therefore n=\sqrt{365}
  $$</p>
<p>  여기서 중요한 것은 $\sqrt{;;;}$ 임을 알아두자.</p>
</li>
</ul>
<p>위의 birthday paradox를 통해 hash function 을 기반으로 하는 보안 시스템의 취약점을 계산할 수 있다.</p>
<p>먼저 주어진 시스템의 collision resistance 가 매우 높다 가정하고, output 의 길이가 $N,bit$ 라 하자.</p>
<p>output 의 가능한 경우의 수는 $2^N$ 개일 것이다.</p>
<p>그렇다면 birthday paradox 의 birthday 에 해당하는 것이 $2^N$ 이므로, 최초 collision 이 일어날 수 있는 합리적인(확률=1/2) 횟수는 $\sqrt{2^N}=2^{\frac{N}{2}}$이 된다.</p>
<p>즉, $2^{\frac{N}{2}}$연산을 하면 hash function 을 깰(break) 수 있다.</p>
<h3 id="hash-function-의-사용">hash function 의 사용</h3>
<p>사이트에 로그인 하는 상황을 생각해보자.</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/c8dd0600-e60d-470b-ab21-ca6338cfd922/image.png" alt=""></p>
<p>로그인하기 위해서는 아이디와 패스워드가 필요하다.</p>
<p>기본적으로 사이트의 DB 에는 $\text{[id,password]}$ 의 쌍이 저장되는 것을 기대할 수 있다.</p>
<p>그러나 사이트의 DB가 한번 털리면, 모든 사용자의 로그인 정보가 털리는 것이므로 안전하지 않다.</p>
<p>따라서 실제 사이트의 DB 안에는 password 를 input 으로 하는 해시값이 저장되어 있다.</p>
<p>즉, 로그인 시 사용자는 패스워드 입력을 통해 해시값을 생성하고, 생성된 해시값과 DB 의 해시값을 비교한다.</p>
<h2 id="asymmetric-crypto">asymmetric crypto</h2>
<h3 id="rsa-알고리즘">RSA 알고리즘</h3>
<p>ALICE 와 BOB 사이의 은닉 메시지 전달이 목적</p>
<p>연산 속도가 빠르지만 <code>key size</code> 가 알고리즘의 안정성을 결정한다는 점에서 길이가 충분히 길어야 하는데, 문제는 <code>key</code> 생성 방식이 소수를 찾는 과정이므로 시간이 꽤 오래 걸린다는 단점이 있다.</p>
<ul>
<li><p><code>public key</code> <code>private key</code> 생성</p>
<ul>
<li>$p-1, q-1$ 과 각각 서로수인 정수 $e$ 를 준비한다</li>
<li>$ed$ 를 $(p-1)(q-1)$ 로 나눈 나머지가 1이 되는 $d$ 를 찾는다.</li>
<li>$pq=N$ 인 $N$과 $e$ 를 공개한다. 여기서 $(N,e)$ 를 공개키(<code>public key</code>) 라고 한다.</li>
<li>그러면 $d$ 는 비밀키(<code>private key</code>) 가 된다.</li>
</ul>
</li>
<li><p><code>private key</code> 통한 <code>encryption</code> &amp; <code>decryption</code> 과정</p>
<ul>
<li>BOB → ALICE : BOB 은 ALICE 의 <code>public key</code> $(N,e)$ 를 통해 보내려는 메시지를 <code>encrypt</code><ul>
<li><code>plaintext</code> 인 $a$ 를 $x=a^e\mathtt{;;mod;;} N$ 으로 <code>encrypt</code> 한다.</li>
</ul>
</li>
<li>ALICE : BOB 이 보낸 $x$ 를 <code>private key</code> ($d$)를 통해  <code>decrypt</code><ul>
<li>$a&#39;=x^d$  ⇒ $a&#39;=a$ 이 성립하므로</li>
<li>ALICE 와 BOB 사이의 거래는 안전함이 보장된다</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="diffie-hellman-알고리즘">Diffie-Hellman 알고리즘</h3>
<p>ALICE 와 BOB 이 공유하는 <code>public key</code> <code>private key</code> 쌍을 안전하게 생성하는 것이 목적</p>
<ul>
<li>ALICE와 BOB이 공유하는 <code>public key</code> 로서 적당한 수 $p$ 와 $g$를 고른다.<ul>
<li>$p=23,;;g=5$</li>
</ul>
</li>
<li>ALICE가 자신의 <code>private key</code> 로서 $a$ 를 선택하고 $A=g^a \text{ mod } p$  를 BOB 에게 보낸다. (<code>encrypt</code>)<ul>
<li>$a=4,;;A=5^4\text{ mod }23=4 \to$ BOB</li>
</ul>
</li>
<li>BOB 또한 자신의 <code>private key</code> 로서 $b$ 를 선택하고 $B=g^b \text{ mod } p$  를 ALICE 에게 보낸다. (<code>encrypt</code>)<ul>
<li>$b=3,;;A=5^3\text{ mod }23=10 \to$ ALICE</li>
</ul>
</li>
<li>ALICE 는 도착한 $B$ 를 <code>private key</code> $a$ 로 <code>decrypt</code> $s=B^a \text{ mod } p$ 한다.<ul>
<li>$s = 104 \text{ mod } 23 = 18$</li>
</ul>
</li>
<li>BOB 는 도착한 $A$ 를 <code>private key</code> $b$ 로 <code>decrypt</code> $s=A^b \text{ mod } p$ 한다.<ul>
<li>$s = 43 \text{ mod } 23 = 18$</li>
</ul>
</li>
</ul>
<p>ALICE 와 BOB 에게 $s$ 라는 동일한 수가 생성되므로 둘만이 알고 있는 <code>private key</code> 가 성공적으로 공유되었다.</p>
<h3 id="ecc-알고리즘">ECC 알고리즘</h3>
<p>타원곡선의 수학적 성질을 사용한 알고리즘</p>
<ul>
<li><code>RSA</code> 알고리즘에 비해 <code>key size</code> 가 작으므로 <code>key</code> 생성 시 적은 시간이  든다.<ul>
<li>같은 길이의 <code>key size</code> 비해 <code>RSA</code> 보다 보안이 우수하다.</li>
</ul>
</li>
<li><code>private key</code> 를 이용하여 서명하는 시간이 <code>RSA</code> 보다 빠르다.</li>
<li><code>public key</code> 를 활용한 연산에는 속도가 느리다.</li>
<li>서명+검증(<code>sign</code> + <code>verification</code> ) 속도는 <code>RSA</code> 보다 빠르다.</li>
</ul>
<p>따라서 서명+검증 절차에는 많이 쓰이고 그 외의 분야에는 속도적 한계 때문에 <code>RSA</code> 만큼 활발하게 사용하진 않는다.</p>
<h3 id="non-non-repudiation">Non Non repudiation</h3>
<p>이미 일어난 사건에 대하여 서로가 부정(조작)할 수 없도록 하는 것</p>
<ul>
<li><p><code>symmetric key</code> 방식 : 서명 없음</p>
<ul>
<li>ALICE 가 BOB 에게 주식을 삼<ul>
<li>해당 내용의 <code>plaintext</code> 를 <code>symmetric key</code> 를 이용하여 <code>cipher text</code> 로 변환</li>
</ul>
</li>
<li>주식의 가격이 하락</li>
<li>ALICE 는 BOB 에게 주식을 사지 않았다고 주장함(사건 부정)</li>
<li>BOB 은 ALICE 의 주장이 거짓임을 밝힐 수 있는가? ⇒ NO!!!!!<ul>
<li>ALICE 와 BOB 은 서로 같은 <code>key</code> 를 공유(<code>symmetric key</code>) 하고 있으므로 제3가 봤을땐</li>
<li>BOB 이 거짓말한다고 볼 수도 있음(즉, ALICE 는 산 적이 없는데 BOB 이 조작했다)</li>
</ul>
</li>
</ul>
</li>
<li><p><code>asymmetric key</code> 방식 : 서명 사용</p>
<ul>
<li>ALICE 가 BOB 에게 주식을 삼<ul>
<li>해당 내용의 <code>plaintext</code> 를 ALICE 의 <code>private key</code> 를 이용하여 <code>cipher text</code> 로 변환</li>
</ul>
</li>
<li>주식의 가격이 하락</li>
<li>ALICE 는 BOB 에게 주식을 사지 않았다고 주장함(사건 부정)</li>
<li>BOB 은 ALICE 의 주장이 거짓임을 밝힐 수 있는가? ⇒ YES!!!!<ul>
<li>ALICE 의 <code>private key</code> 를 사용했기 때문에 BOB 은 사건의 조작이 불가능하다는 알리바이를 얻는다.</li>
<li>즉, <code>asymmetric key</code> 는 ALICE 와 BOB 모두에게 유용하다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="디지털-서명">디지털 서명</h2>
<p>앞서 나온 암호화 기법을 통해 <code>digital signature</code> 이 동작하는 과정과 실효성에 대해 알아본다. </p>
<h3 id="사이트-인증서">사이트 인증서</h3>
<p>사용자가 사이트에 접속하기 전에 사이트가 안전한지???</p>
<p>→ 해당 사이트가 위조 사이트가 아닌지? (<code>Authentication</code>)</p>
<p>를 검증하기 위해 사이트마다 보안 인증서 시스템이 존재한다. 사용자는 인증서를 통해 아래와 같은 사항이 유효한지 확인.</p>
<ul>
<li><p>CA(Certificate Authority) 가 유효한가?</p>
<ul>
<li><p>폐기되지 않은 인증서를 사용하는 게 맞는가? (유효기간 내에 드는가?)</p>
</li>
<li><p>해당 사이트가 진짜를 흉내낸 가짜 사이트가 아닌가?</p>
<p>$$
\text{Cert}<em>C(A)={A,K_A,T,L}</em>{{K_C}^{-1}}
$$</p>
</li>
<li><p>$C$ 가 발급한 $A$ 의 인증서는 $C$ 의 <code>private key</code> $K_C^{-1}$ 를 이용하여</p>
</li>
<li><p>발급한 시간 $T$ 부터 $L$ 기간 동안 $A$ 의 <code>public key</code> $K_A$를 보증한다.</p>
</li>
<li><p>따라서 누구나 $K_A$ 를 가지고 있다면, 아래를 통해 $A$ 가 유효한지 검증할 수 있다.</p>
<p>  <img src="https://velog.velcdn.com/images/jo0n-lab/post/ff1ae720-f69d-4f15-81e5-b5680ef921e2/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h3 id="hybrid-envelope">Hybrid envelope</h3>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/c43bf322-afaf-4dee-a992-d3724154e5fc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/f7e17483-d736-4ce3-86f0-9633511c713e/image.png" alt=""></p>
<ul>
<li>ALICE 는 <code>plaintext</code> 를 <code>enctrypt</code> 하기 위해 <code>common key</code> 를 생성한다.<ul>
<li>$\text{ciphertext}=\text{encrypt(common,key,plaintext)}$</li>
</ul>
</li>
<li>ALICE 는 BOB 의 <code>public key</code> 를 사용하여 <code>common key</code> 를 <code>encrypt</code> 한다.<ul>
<li>$\text{encrypted(secret),key=encrypt(public,key}_{BOB}\text{,common,key)}$</li>
</ul>
</li>
<li>ALICE 는 <code>cipher text</code> 와 <code>encrypted key</code> 를 BOB에게 보낸다.</li>
<li>BOB 은 자신의 <code>private key</code> 로 <code>encrypted key</code> 로부터 <code>common key</code> 를 얻어내고</li>
<li><code>common key</code> 로 <code>cipher text</code> 를 <code>decrypt</code> 하여 <code>plaintext</code> 를 얻어낸다.</li>
</ul>
<h3 id="전자서명의-동작원리">전자서명의 동작원리</h3>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/0c3a0596-9732-4dcb-89bb-70abee129bf4/image.png" alt=""></p>
<ul>
<li>서명자의 비밀키를 통해 메시지를 암호화한 서명을 생성한다</li>
<li>메시지와 서명을 검증자에게 보내면,</li>
<li>서명자의 공개키를 통해 추출한 메시지와 함께 보내진 메시지를 비교하여 검증한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/5cb9662b-c140-4c1a-8ce5-f67d4be4c954/image.png" alt=""></p>
<ul>
<li>서명자와 검증자가 공유하는 데이터를 통해</li>
<li>서명자는 데이터의 해시값을 본인의 비밀키로 암호화한 서명과 인증서를 함께 검증자에게 보낸다.</li>
<li>검증자는 공유하는 데이터의 해시값과 서명자의 공개키로 서명을 복호화한 해시값의 비교를 통해</li>
<li>서명자의 인증서가 유효한지 검증할 수 있다.</li>
</ul>
<h1 id="블록체인의-동작--자료구조와-script">블록체인의 동작 : 자료구조와 script</h1>
<p>블록체인 시스템의 자료구조와 동작원리를 살펴보고, 거래가 이루어지는 script 를 뜯어본다.</p>
<h2 id="블록체인의-자료구조와-유효성-검증">블록체인의 자료구조와 유효성 검증</h2>
<p>블록체인의 자료구조를 살펴보고, 해당 방식의 이점을 알아본다.</p>
<h3 id="hash-pointer-linked-list">Hash Pointer (linked list)</h3>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/614b0cdc-0296-4476-840a-38ae153ce9a7/image.png" alt=""></p>
<p>위의 그림과 같이 해시함수와 포인터가 연결된 해시 포인터 자료구조를 선탣하면, 외부의 공격을 빠르게 알아차릴 수 있다. </p>
<p>블록의 상단에는 이전 블록의 전체 데이터에 대한 해시값과 이전 블록과 연결해주는 포인터가 있다.</p>
<p>즉, 연결된 포인터를 통해 이전 블록의 전체 데이터를 읽어들일 수 있고, 또한 해시함수를 적용해 나온 해시값과 저장된 해시값 비교를 통해 유효성 검증이 가능하다.</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/38108fe7-1962-47fd-a205-e90105568bd2/image.png" alt=""></p>
<p>공격자의 입장에서 살펴보자.</p>
<p>공격자는 블록1 을 수정하기 위해</p>
<ul>
<li>블록1 의 데이터를 수정하고</li>
<li>블록1 에 대한 해시값이 바뀔것이니, 블록2 의 데이터도 바꿔야 될 것이다</li>
<li>블록2 에 대한 해시값이 바뀔것이니, 블록3 의 데이터도 바꿔야 될 것이다</li>
<li>$\cdots$</li>
</ul>
<p>이렇게 맨 마지막 블록에 다다를 때까지 모든 블록의 데이터를 수정해야 하므로, 공격자는 특정 블록안의 내용을 바꾸기 어렵다.</p>
<p>또한 수정을 시도하면, 다른 사람들이 빠르게 알아차려 이에 대응할 것이므로 또한 어렵다.</p>
<h3 id="merkle-tree">Merkle Tree</h3>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/54c87616-2876-4081-b56d-5d79c240b688/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/eb782dea-e9b8-44bd-bf39-d7ffe1ce985f/image.png" alt=""></p>
<p><code>merkle tree</code> 의 구조는 최상단 <code>transaction</code> 의 해시값으로서 <code>merkle root</code> 가 있고, 그것의 가지들을 이루는 leaves 로서 transaction들이 존재한다.</p>
<p>즉, <code>merkle root</code>  값만을 확인하면 어떤 <code>transaction</code> 이 조작되더라도 루트의 해시값이 변경되기 때문에 해당 블록이 유효한지 쉽고 빠르게 검증할 수 있다. </p>
<p>각각 vs 블록 단위 <code>consensus</code> 효율을 생각해보면 확실히 블록단위로 관리하는 것이 더 효율적이다.</p>
<p> 특정 노드에 접근(예를 들면 거래(5) : 오른쪽 그림)할 때에도 $\log$ 높이 만큼의 적은 시간이 걸린다는 장점이 있다. </p>
<p>따라서, 블록체인의 구조는 블록 각각은 블록-블록, 블록 내부에서는 TXN-TXN 구조를 따른다. 아래의 그림에서 통합된 구조를 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/cb5aed65-9a3d-4b4c-8c36-ddf89d317a0e/image.png" alt=""></p>
<h2 id="검증-절차와-주소-생성">검증 절차와 주소 생성</h2>
<h3 id="검증절차-pseudo-code">검증절차 (pseudo code)</h3>
<ul>
<li>$\mathtt{(sk, pk) := generateKeys( keysize )}$<ul>
<li><code>keysize</code> 를 입력받아 공유키, 개인키 쌍을 발급한다.</li>
<li><code>sk</code> : 사용자의 비밀키로서 메시지(<code>transaction</code> )에 서명할 때 이용된다.</li>
<li><code>pk</code> : 사용자의 공유키로서 사용자가 맞는지 검증할 때 이용된다.</li>
</ul>
</li>
<li>$\mathtt{sig := sign( sk , message )}$<ul>
<li><code>sig</code> : 비밀키를 사용하여 메시지를 <code>encrypt</code></li>
</ul>
</li>
<li>$\mathtt{isValid := verify( pk , message , sig )}$<ul>
<li>공유키를 통해 서명을 <code>decrypt</code> 한 결과와 메시지를 비교하여 검증</li>
<li>$\mathtt{                        verify ( pk , message , sign ( sk , message )) == true}$ 인지 확인</li>
</ul>
</li>
</ul>
<h3 id="비트코인-주소생성">비트코인 주소생성</h3>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/c00a1ac6-e0e6-4387-9853-e99067d21aea/image.png" alt=""></p>
<ul>
<li>비밀키를 보유<ul>
<li><code>18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725</code></li>
</ul>
</li>
<li>개인키에 부합하는 공유키를 생성<ul>
<li><code>0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6</code></li>
</ul>
</li>
<li>공유키에 SHA-256 적용해서 해시값 생성<ul>
<li>$\mathtt{SHA\text{-}256(pk)}$</li>
<li><code>600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408</code></li>
</ul>
</li>
<li>생성된 해시에 RUPEMD-160 적용해서 또 해시값 생성<ul>
<li>$\mathtt{RUPEMD\text{-}160(\mathtt{SHA\text{-}256(pk))}}$</li>
<li><code>010966776006953D5567439E5E39F86A0D273BEE</code></li>
</ul>
</li>
<li>생성된 해시의 맨 앞에 버전을 기록<ul>
<li>$\mathtt{RUPEMD\text{-}160(\mathtt{SHA\text{-}256(pk)).version()}}$</li>
<li><code>00010966776006953D5567439E5E39F86A0D273BEE</code></li>
</ul>
</li>
<li>버전기록된 해시에 SHA-256 적용해서 또또 해시값 생성<ul>
<li>$\mathtt{SHA\text{-}256(RUPEMD\text{-}160(\mathtt{SHA\text{-}256(pk))}.version()))}$</li>
<li><code>445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094</code></li>
</ul>
</li>
<li>생성된 해시에 SHA-256 적용해서 또또또 해시값 생성<ul>
<li>$\mathtt{SHA\text{-}256(SHA\text{-}256(RUPEMD\text{-}160(\mathtt{SHA\text{-}256(pk))}.version())))}$</li>
<li><code>D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30</code></li>
</ul>
</li>
<li>생성된 해시의 4bytes 앞부분을 잘라내서 <code>checksum</code><ul>
<li>$\mathtt{checksum=SHA\text{-}256(SHA\text{-}256(RUPEMD\text{-}160(\mathtt{SHA\text{-}256(pk))}.version())))[:4bytes]}$</li>
<li><code>D61967F6</code></li>
</ul>
</li>
<li>해당 <code>checksum</code> 을 5번의 해시에 붙이면 25bytes 이진 주소가 만들어진다<ul>
<li>$\mathtt{adress=checksum}+\mathtt{RUPEMD\text{-}160(\mathtt{SHA\text{-}256(pk)).version()}}$</li>
<li><code>00010966776006953D5567439E5E39F86A0D273BEED61967F6</code></li>
</ul>
</li>
<li>생성된 이진주소에 <code>base58</code> 인코딩을 적용하면 최종 주소가 생성된다<ul>
<li>$\mathtt{adress}=\mathtt{base58(adress)}$</li>
<li><code>16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM</code></li>
</ul>
</li>
</ul>
<h2 id="transaction-원리와-script">transaction 원리와 script</h2>
<h3 id="화폐와-구분되는-비트코인의-개념">화폐와 구분되는 비트코인의 개념</h3>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/f1a8eb66-cd1f-47b4-815f-1e603e7e3df4/image.png" alt=""></p>
<p>그림을 보면 비트코인이 지출되는 방식이 기존의 화폐와 많이 다르다는 것을 확인할 수 있다.</p>
<p>비트코인은 실체가 없다. 사용할 때마다 이전 지출 기록을 확인하여 재할당될 뿐이다. 그러므로 1회 소비시 비트코인을 “모두” 써버리는 것처럼 보인다.</p>
<p>즉, 비트코인에서는 “잔액”이라는 개념이 존재하지 않는다.</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/b8885695-6a34-4242-8e45-5f1ba004280f/image.png" alt=""></p>
<h3 id="transaction-구조">transaction 구조</h3>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/4766255d-0224-4dc5-a8ff-2aa12af9065e/image.png" alt=""></p>
<ul>
<li>metadata : transaction 의 ID(identity) 를 저장해두는 곳.</li>
<li>inputs : 이전 transaction 을 참조하는 부분. 정확히는 이전 transaction 의 해시값과 포인터로 연결되어 있다. 이전 기록에서 claim 된 인덱스도 함께 저장되어 있다.</li>
<li>outputs : 두 개의 필드 ( output 값들의 합 $\leq$ input 값들의 합 ) 로 검증하는 부분과 redeem 하기 위해 소유자의 signature 부분이 있다.</li>
</ul>
<h3 id="transaction-script">transaction script</h3>
<pre><code class="language-solidity">&lt;sig&gt; 
&lt;pubKey&gt;
-------------- 
OP_DUP 
OP_HASH160 
&lt;pubKeyHash?&gt; 
OP_EQUALVERIFY 
OP_CHECKSIG</code></pre>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/f303f214-290d-4bbf-bb09-be2cfa3c57ea/image.png" alt=""></p>
<p><code>-------------</code> 하단의 명령어(함수: <code>OP</code> 혹은 값: <code>&lt; &gt;</code>)를 푸시하고 스택의 최상단 값이 함수의 입력이 된다.</p>
<ul>
<li>송금자의 개인키 서명(<sig>)을 스택에 푸시</li>
<li>송금자의 공개키(<pubKey>)를 스택에 푸시</li>
<li>OP_DUP을 푸시하여 <pubKey>는 입력이 되어 최상단에 <pubKey> 복제 생성</li>
<li>OP_HASH160푸시, <pubKey>가 입력, 출력은 <pubKeyHash></li>
<li>송금자의 공개키해시로 &lt;pubKeyHash?&gt; 푸시</li>
<li>OP_EQUALVERIFY 푸시, &lt;pubKeyHash?&gt;,<pubKeyHash> 가 입력으로 들어오고, 서로 일치하면 true, 아니면 false 출력. true이면 진행 false이면 강제종료.</li>
<li>OP_CHECKSIG 푸시, <pubKey>,<sig> 가 입력, 서명과 일치하면 true 아니면 false</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/180c6706-6f6f-4c5e-b22a-83371bafaf34/image.png" alt=""></p>
<p>매우 복잡해보이지만.. 블록은 연속적으로 연결되어 있고, 앞서 말했듯 비트코인은 ‘잔액의 개념이 없다’ 의 연장선 상에서 unlocking, locking script가 연속되는 것이다. 위의 BOB→CHARLIE 의 예시를 보자.</p>
<ul>
<li><p>BOB 이 CHARLIE 에게 1BTC 를 보낸다는 메시지를 BOB 의 <code>sk</code> 로 BOB 의 <code>&lt;sig&gt;</code> 를 생성한다.</p>
<ul>
<li>즉,  <code>&lt;&lt;DEF&gt;&gt;</code>  의 OUTPUT</li>
</ul>
</li>
<li><p>따라서 <code>&lt;&lt;DEF&gt;&gt;</code> 의 INPUT 에서는 과연 해당 <code>&lt;sig&gt;</code> 가 유효한지 검증하는 script 의 시험을 받게 되는 데 script 의 내용은 다음과 같다.</p>
<ul>
<li><p>이전 TXN 의 검증에서 통과해야만 <code>&lt;&lt;DEF&gt;&gt;</code> 가 유효할 것이므로 아래와 같은 검증을 받는다</p>
<p>  <img src="https://velog.velcdn.com/images/jo0n-lab/post/b73e5885-b104-455f-b589-99d6e5027bb0/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>    - 여기서 `&lt;sig&gt;` 는 바로 위에서 언급한 것, &lt;public key&gt;,&lt;public hash&gt; 모두 BOB의 것이다.
    - 즉 해당 script 는 ALICE→BOB 에서 BOB 의 claim 을 검증한다.</code></pre><ul>
<li><p>위의 과정이 검증되면 output 으로 아래를 내놓는다</p>
<p> <img src="https://velog.velcdn.com/images/jo0n-lab/post/faac12bd-9376-4471-bb05-7a34e390b844/image.png" alt=""></p>
</li>
</ul>
<p>아래 그림을 통해 위의 이해한 바를 한 번 더 확인하자.</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/c036b666-1a3d-49c3-afd5-f38c8a556afd/image.png" alt=""></p>
<p>이해한 바에 따르면, 오른쪽의 과정은 Sandra 가 누군가에게 비트코인을 보낼때의 TXN 에서 일어난다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자동제어 정리 (mid-term)]]></title>
            <link>https://velog.io/@jo0n-lab/%EC%9E%90%EB%8F%99%EC%A0%9C%EC%96%B4-%EC%A0%95%EB%A6%AC-mid-term</link>
            <guid>https://velog.io/@jo0n-lab/%EC%9E%90%EB%8F%99%EC%A0%9C%EC%96%B4-%EC%A0%95%EB%A6%AC-mid-term</guid>
            <pubDate>Fri, 21 Oct 2022 11:02:49 GMT</pubDate>
            <description><![CDATA[<h1 id="자동제어-중간">자동제어 중간</h1>
<p>날짜: 2022년 10월 14일 → 2022년 10월 27일
태그: 중간</p>
<h1 id="시스템의-기본적인-성질">시스템의 기본적인 성질</h1>
<h2 id="중첩의-원리">중첩의 원리</h2>
<p>중첩의 원리가 적용되면 함수 및 응답을 쪼개고 확장하는 것이 가능</p>
<p>→ 주어진 입력신호가 개별적인 입력 신호의 합으로 표현 가능할 때</p>
<p>→ 시스템의 응답 또한 개별적으로 표현이 가능하다는 거</p>
<p>해당 법칙은 선형시스템에서만 성립</p>
<h2 id="시불변lti-system">시불변(LTI system)</h2>
<p>입력시간이 $\tau$ 만큼 지체되면, 출력이 $\tau$ 만큼 평행이동되는 시스템을 의미한다.</p>
<h2 id="convolution-적분--lti--중첩의-원리">convolution 적분 : LTI + 중첩의 원리</h2>
<ul>
<li><p><code>convolution</code> 이란?</p>
<p>  필터 계산 : 함수로부터의 값을 원하는 방식으로 제어하기 위함</p>
<p>  <a href="https://supermemi.tistory.com/104">https://supermemi.tistory.com/104</a></p>
</li>
</ul>
<p>특정 펄스 입력에 대해 LTI 시스템의 출력은 $\tau$ 시간의 지연에 관계 없이 일정하므로, 단위 입력 함수 $h(t)$ 라 하면 $[\Delta,2\Delta,3\Delta,\cdots,n\Delta]$ 의 시간 지연에 대한 개별적인 응답의 합으로 표현할 수 있을 것이다. </p>
<p>즉 $n\Delta$ 시간에서의 응답은 다음과 같다.</p>
<p>$$
\Delta u(k\Delta)h_{\Delta}(n\Delta-k\Delta)
$$</p>
<p>시스템의 전체 응답은 개별적인 입력에 따른 응답의 합이라 했으므로,</p>
<p>$$
y(t)=\sum^{k=\infty}<em>{k=0}\Delta u(k\Delta) h</em>{\Delta}(t-k\Delta)\
y(t)=\int^{\infty}<em>{-\infty} u(\tau)h(t-\tau)d\tau=\int^{-\infty}</em>{\infty}u(t-\tau_1)h(\tau_1)(-d\tau_1)=\int^{\infty}_{-\infty}u(t-\tau)h(\tau)d\tau
$$</p>
<h2 id="convolution-to-laplace">Convolution to Laplace</h2>
<p>$$
\begin{aligned}
Y(s)
&amp;=\int^{\infty}<em>{-\infty}y(t)e^{-st}dt\
&amp;=\int^{\infty}</em>{-\infty}\left[\int^{\infty}<em>{-\infty}h(\tau)u(t-\tau)d\tau \right]e^{-st}dt\
&amp;=\int^{\infty}</em>{-\infty}\left[\int^{\infty}<em>{-\infty}u(t-\tau)e^{-st}dt \right]h(\tau)d\tau\
&amp;=\left[\int^{\infty}</em>{-\infty}u(\eta)e^{-s\eta}d\eta \right]\int^{\infty}_{-\infty}h(\tau)e^{-s\tau}d\tau\
&amp;=U(s)H(s)
\end{aligned}
$$</p>
<p>$U(s)$ 는 입력함수의 Laplace 형태이고, 충격응답의 Laplace 변환은 $H(s)$ 이다.</p>
<p>$e^{st}$ 꼴의 입력에 의한 컨볼루션의 결과는 출력 $H(s)e^{st}$ 를 만든다.</p>
<p>$H(s)$ 를 시스템의 전달함수라고 정의한다.</p>
<p>여기서 $s$ 는 실수영역이 아닌 복수수 영역의 값이다. (허수일 수도 있는 것)</p>
<p>만약, $u(t)=e^{st}$ 로 주어진다면,</p>
<p>$$
\begin{aligned}
y(t)
&amp;=\int^{\infty}<em>{-\infty}h(\tau)u(t-\tau)d\tau\
&amp;=\int^{\infty}</em>{-\infty}h(\tau)e^{s(t-\tau)}d\tau\
&amp;=\int^{\infty}<em>{-\infty}h(\tau)e^{-s\tau}e^{st}d\tau\
&amp;=\int^{\infty}</em>{-\infty}h(\tau)e^{-s\tau}d\tau e^{st}\
&amp;=H(s)e^{st}
\end{aligned}
$$</p>
<p>이고, 여기서 중요한 것은,</p>
<p>$$
H(s)=\int^{\infty}_{-\infty}h(\tau)e^{-s\tau}d\tau
$$</p>
<p>임을 알아둡시당~</p>
<p>해당 조건( $u(t)=e^{st}$ ) 일때, 입력은 모든 시간대($-\infty,\infty$) 에서 지수적이고,  위의 식은 <code>모든 시간대</code> 에서 정의 되므로 <code>초기조건</code> 이 없음을 인지하자.</p>
<p>만약 이상적으로 $H(s)$ 가 주어지고 입력이 지수적으로 주어진다면, 출력은 라플라스 변환을 통해 쉽게 얻을 수 있다. 또한 해당 경우에서 전달함수 $H(s)$ 는 입출력 사이의 <code>스케일링 항</code> 일 뿐이다.</p>
<p>그리고 인과적 시스템(($-\infty,0$)이 무시되는)에서</p>
<p>$$
H(s)=\int^{\infty}<em>{0}h(\tau)e^{-s\tau}d\tau\
y(t)=\int^{\infty}</em>{0}h(\tau)u(t-\tau)d\tau
$$</p>
<p>으로 간단하게 나타내진다.</p>
<ul>
<li><p>예제</p>
<p>  시스템이 $\dot{y}+ky=u$ 으로 주어지고 입력 $u$ : $u(t)=e^{st}$ 으로 주어질 때, 모든 시간 $(-\infty,\infty)$ 에서의 출력 $y$ 를 구해본다.</p>
<p>  $$
  \dot{y}(t)+ky(t)=u(t)=e^{st}\
  y(t)=H(s)e^{st}\
  \Rightarrow;;sH(s)e^{st}+kH(t)e^{st}=e^{st}\
  H(s)=\frac{s}{s+k}\
  \therefore y(t)=\frac{1}{s+k}e^{st}
  $$</p>
<p>  입력이 $e^{st}$ 로 주어졌음에 $y(t)=H(s)e^{st}$ 으로 쓸 수 있고, 주어진 시스템 방정식에 따라 $H(s)$  를 구할 수 있었다. 전달함수는 입출력에 의한 스케일항(계수) 이므로 $y(t)$  를 간단히 얻어낸다.</p>
</li>
</ul>
<p>❗ 전달함수 $H(s)$ 는 입출력의 스케일 항, 즉 입력 $U(s)$, 출력 $H(s)$ 의 전달 이득(gain) 으로 작용한다. 즉, 말 그대로 비 : scaling term 으로서 입출력의 Laplace 비이다.</p>
<p>$$
y(t)=\int^{\infty}_{0}h(\tau)u(t-\tau)d\tau
$$</p>
<p>에서는 시스템의 초기조건 이 0이라는 가정($t&lt;0$ 에서 0) 하에</p>
<p>$$
\frac{Y(s)}{U(s)}=H(s)
$$</p>
<p>이 된다.</p>
<h1 id="단위함수">단위함수</h1>
<p>응답을 표현하기 위해 가장 단순한 형태의 함수를 정의할 필요가 있다. 소개하는 함수는 앞으로 제어할 신호의 가장 기본 단위가 되는 함수들이다.</p>
<h2 id="단위충격함수-deltat">단위충격함수 $\delta(t)$</h2>
<p>만약 입력함수 $u(t)$ 가 <code>단위충격함수</code> 인 $\delta(t)$ 으로 주어진다면, $\mathcal{L}(y(t))=H(s)$ 이다.</p>
<p>따라서, $H(s)$ 는 단위충격응답(입력이 그르케 주어질때) $h(t)$ 의 Laplace 변환이다. $Y(s)=H(s)$</p>
<ul>
<li><p><code>dirac delta</code> 함수</p>
<p>  $$
  \delta(t)=0;(t\neq0);;;;\int^{\infty}_{-\infty} \delta(t)dt=1
  $$</p>
<p>  을 만족하는 함수 $\delta(t)$ 를 디랙-델타 함수(또는 <code>단위충격함수</code>)라 하고, $\delta(t)$ 가 입력으로 주어질 때의 응답을 <code>단위충격응답</code>이라 한다.</p>
<p>  만약 함수 $f(t)$ 가 $t=\tau$ 에서 연속이라면, 다음이 성립한다.</p>
<p>  $$
  \int^{\infty}<em>{-\infty}f(\tau)\delta(t-\tau)d\tau=\int^{\infty}</em>{-\infty}f(\tau)\delta(t-\tau)d\tau=f(t)
  $$</p>
<p>  이 같은 성질을 <code>sift</code> 성질이라고 한다.</p>
</li>
<li><p><code>dirac delta</code> 예제</p>
<p>  $$
  \int^{\infty}_{0}\delta(t)e^{-st}=1
  $$</p>
<p>  임을 보인다.</p>
<p>  $$
  \int^{\infty}<em>{-\infty}\delta(t)e^{-st}dt=e^{-s\tau}\int^{\infty}</em>{-\infty}\delta(t)e^{-st+s\tau}dt=e^{-s\tau}\int^{\infty}_{-\infty}\delta(t)e^{s(\tau-t)}dt
  $$</p>
<p>  이므로 함수 $f(t)=e^{st}$ 이고 초기조건 $f(0)=0$ 으로 두면,</p>
<p>  $$
  e^{-s\tau}\int^{\infty}<em>{0}\delta(t)e^{s(\tau-t)}dt=f(-\tau)\int^{\infty}</em>{0}\delta(t)f(\tau-t)dt
  $$</p>
<p>  이므로, <code>sift</code> 효과에 의해 준식은 $f(-\tau)f(\tau)=e^{-st}e^{st}=1$ 이 된다.</p>
</li>
</ul>
<p>위의 언급된 유도와 조건에 따라, 초기 조건이 0 인 <code>LTI</code> 시스템을 특정지을 수 있는 방법을 생각해볼 수 있다.   초기조건이 0이라 했으므로, 단위충격을 인가한 후 해당 응답으로부터 시스템을 알아낼 수 있다.</p>
<p>일반적인 경우(꼭 단위충격이 아니더라도),</p>
<p>$$
a_1\ddot{y}+a_2\dot{y}+a_3y=b_1\ddot{u}+b_2\dot{u}+b_3u
$$</p>
<p>으로 초기조건이 0 인 시스템이 주어졌을 때,</p>
<p>$$
(a_1s^2+a_2s+a_3)Y(s)=(b_1s^2+b_2s+b_3)U(s)\
\therefore H(s)=\frac{Y(s)}{U(s)}=\frac{b_1s^2+b_2s+b_3}{a_1s^2+a_2s+a_3}
$$</p>
<p>과 같이 전달함수를 구해낼 수 있다.</p>
<h2 id="단위계단함수-1t">단위계단함수 $1(t)$</h2>
<p>단위계단함수 $1(t)$ 는 단위충격함수 $\delta(t)$ 의 부정적분으로서 $1(t)=\int_{-\infty}^{t}\delta(\tau)d\tau$ 으로 표현된다. </p>
<p>$$
\begin{aligned}
1(t)&amp;=0;;; (t&lt;0)\
1(t)&amp;=1;;; (t\geq0)
\end{aligned}
$$</p>
<p>단위계단함수의 라플라스 변환은 정의에 따라</p>
<p>$$
\mathcal{L}(1(t))=\int_{0}^{\infty}e^{-st}dt=\frac{1}{s}
$$</p>
<p>간단하게 구할 수 있다.</p>
<p>따라서 입력이 단위계단입력이고 단위계단응답을 구하라는 것은 다음과 같은 말로 단축된다.</p>
<p>$$
given;;;;;U(s)=\frac{1}{s},;;;find;;;y(t)
$$</p>
<h2 id="최종값-정리">최종값 정리</h2>
<p>라플라스 변환을 사용하면, 시스템의 정상상태($t\rightarrow \infty$) 를 간단하게 구해낼 수 있다.</p>
<aside>
❗ 만약 $sY(s)$ 의 모든 극점이 $s$-평면의 좌반평면(실수부가 모두 $s<0$)에 있다면 다음이 성립한다.

<p>$$
\lim_{x\to\infty}y(t)=\lim_{s\to0}sY(s)
$$</p>
</aside>

<p>위의 조건은 최종값 정리의 대상이 안정한 시스템임을 뜻한다.</p>
<h3 id="dc-이득">DC 이득</h3>
<p>최종값 정리를 사용하면, DC이득 또한 간단하게 구할 수 있다. </p>
<p>먼저 단위계단입력($U(s)=\frac{1}{s}$) 를 가정하고 출력의 정상상태를 구하기 위해 최종값 정리를 사용한다.</p>
<p>$$
\text{DC gain}=\lim_{s \to 0}sG(s)\frac{1}{s}=\lim_{s\to 0}G(s)
$$</p>
<h1 id="주파수-응답">주파수 응답</h1>
<p>입력함수 $u(t)=A\cos(\omega t)$ 으로 주어졌을 때 시스템의 응답을 알아본다.</p>
<p>오일러 변환에 의하여 아래와 같이 쓸 수 있고,</p>
<p>$$
A\cos(\omega t)=\frac{A}{2}(e^{j\omega t}+e^{-j\omega t})
$$</p>
<p>$u(t)=e^{st}$  으로 주어졌을 때의 응답 $y(t)=e^{st}H(s)$ 에 의하여, $s=j\omega$ 로 두면,</p>
<p>$$
u_1(t)=\frac{A}{2}e^{j\omega t};;;;u_2(t)=\frac{A}{2}e^{-j\omega t}\
y_1(t)=\frac{A}{2}H(j\omega)e^{j\omega t};;;;;;y_2(t)=\frac{A}{2}H(-j\omega)e^{-j\omega t}\
\therefore y(t)=\frac{A}{2}(H(j\omega)e^{j\omega t}+H(-j\omega)e^{-j\omega t}
$$</p>
<p>전달함수 $H(j\omega)$ 는 복소수 이므로 극형식 : $H(j\omega)=M(\omega)e^{j\varphi};;H=Me^{j\varphi}$ 으로 치환할 수 있다.</p>
<p>따라서, $y(t)$ 는</p>
<p>$$
\begin{aligned}
y(t)
&amp;=\frac{A}{2}M(e^{j(\omega t+\varphi)}+e^{-j(\omega t+\varphi)})\
&amp;=AM\cos(\omega t+\varphi)
\end{aligned}
$$</p>
<p>단, $M=|H(j\omega)|;;;\varphi=\angle H(j\omega)$</p>
<h1 id="극점-영점과-안정성">극점, 영점과 안정성</h1>
<p>전달함수 $H(s)$ 가 다음과 같이 주어졌을 때,</p>
<p>$$
H(s)=\frac{b(s)}{a(s)}=K\frac{\prod_{i=1}^{m}(s-z_i)}{\prod_{i=1}^{n}(s-p_i)}
$$</p>
<p>$b(s)=0$ 의 해가 되는 해집합 $[z_1,z_2,\cdots,z_m]$ 을 시스템의 <code>유한 영점</code> 이라 하고,</p>
<p>$a(s)=0$ 의 해가 되는 해집합 $[p_1,p_2,\cdots,p_n]$ 을 시스템의 <code>극점</code> 이라 한다.</p>
<p>극점은 시스템의 안정성을 결정짓는 중요한 요소가 되는데, </p>
<p>분모의 항들은 결국 부분집합의 합으로 표현되기 때문이다. </p>
<p>예를 들어, $H(s)=\frac{1}{(s+2)(s+1)}$ 일 때, 응답함수 $h(t)=e^{-t}+e^{-2t}$ 로서 외부 충격에 의한 응답이 감쇠하는 형태를 띤다. 그러나 $H(s)=\frac{1}{(s-2)(s-1)}$ 의 경우 응답함수 $h(t)=e^{t}+e^{2t}$ 는 응답이 증가하는 양상을 띤다</p>
<p>즉, 극점이 0보다 크면 시스템이 불안정해지는 것이다.</p>
<h3 id="이차미분방정식의-전달함수충격응답--계단응답은-1s-곱하면-됌">이차미분방정식의 전달함수(충격응답—- 계단응답은 $1/s$ 곱하면 됌)</h3>
<p>전달함수 $H(s)$ 가 이차함수 꼴로 주어질때, 다음과 같이 정리한다.</p>
<p>$$
H(s)=\frac{\omega_n^2}{s^2+2\zeta\omega_ns+\omega_n^2}=\frac{\omega_n^2}{(s+\zeta\omega_n)^2+\omega_n^2(1-\zeta^2)}
$$</p>
<p>따라서 극점은 $s=-\sigma \pm j\omega_d$ 이고, $\sigma=\zeta\omega_n,;;\omega_d=\omega_n \sqrt{1-\zeta^2}$  이다.</p>
<p>여기서 $\zeta$ 는 감쇠비, $\omega_n$ 는 비감쇠 고유주파수이다. 극점은 $s$-평면에서 반경: $\omega_n$, 각도: $\theta=\sin^{-1}\zeta$ 이다.</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/a962b04b-835f-4c58-8adb-af5915e4b660/image.png" alt=""></p>
<p>이에 따른 응답 $h(t)$ 가 다음과 같이 얻어진다.</p>
<p>$$
h(t)=\frac{\omega_n}{\sqrt{1-\zeta^2}}e^{-\sigma t}(\sin \omega_d t)1(t)
$$</p>
<p>해석적으로 접근하면, $\zeta$ 가 클 때(1에 접근할 때) 응답은 거의 진동하지 않는다. 즉, 감쇠비를 통해 응답의 대체적인 양상을 해석할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/7894769e-6fff-4a74-b647-82ccd4adee82/image.png" alt="충격응답"></p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/bda037ca-63e8-4ca3-9ce0-c554ea0614ec/image.png" alt="계단응답"></p>
<h3 id="time-domain-specificationsunit-step-계단응답">Time Domain Specifications(unit-step 계단응답)</h3>
<p>감쇠계수에 따라 응답의 양상이 매우 다르게 나타나므로 모든 해석적 특성을 아우를 수 있는 정성적인 방법이 필요하다.</p>
<p>다음은 응답의 특성을 기술하기 위해 도입한 시간과 관련된 사양(specifications) 이다.</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/bcadd6e4-354b-423f-80f3-bf0a85d5aa35/image.png" alt=""></p>
<ul>
<li><p>상승시간($t_r)$ <code>rise time</code> : 시스템이 새로운 설정값 근처에 도달하는 데 걸리는 시간</p>
<ul>
<li>$t_r \cong \frac{1.8}{\omega_n}$</li>
<li>위 식은 영점이 없는(분자가 상수인) 이차시스템에서 정확히 성립한다.</li>
<li>외의 조건에서는 근사식으로 사용할 수 있다.</li>
</ul>
</li>
<li><p>최고시간($t_p$) <code>peak time</code> : 시스템이 최대 오버슈트점에 도달하는 데 걸리는 시간</p>
<ul>
<li><p>오버슈트가 발생하는 지점의 시간</p>
<p>$$
y(t)=1-\frac{e^{-\sigma t}}{\sqrt{1-\zeta^2}}\cos(\omega_dt-\beta);;;;\dot{y}(t)=\sigma e^{-\sigma t}\left(\frac{\sigma^2}{\omega_d}+\omega_d\right)\sin\omega_d t=0;;;;\omega_dt_p=\pi;;;;t_p=\frac{\pi}{\omega_d}
$$</p>
</li>
</ul>
</li>
<li><p>오버슈트($M_p$) <code>overshoot</code> : 최종값을 초과하는 시스템의 최댓값을 최종값으로 나눈 값(%)</p>
<ul>
<li><p>응답의 미분이 0이 되는 지점(극값을 의미)</p>
<p>$$
\begin{aligned}
y(t_p)
&amp;\triangleq1+M_p\
&amp;=1-e^{-\sigma\pi/\omega_d}\left(\cos \pi + \frac{\sigma}{\omega_d} \sin \pi \right)\
&amp;=1-e^{-\sigma\pi/\omega_d}\
&amp;\therefore;;M_p=e^{-\pi\zeta/\sqrt{1-\zeta^2}}
\end{aligned}
$$</p>
</li>
</ul>
</li>
<li><p>정착시간($t_s$) <code>settling time</code>  : 시스템의 과도응답이 감소하는 데 걸리는 시간</p>
<ul>
<li>$y(t)$  가 정상상태에 도달하는 시간</li>
<li>$e^{-\zeta \omega_n t_s}=0.01$   $\zeta \omega_nt_s=4.6;;;t_s=\frac{4.6}{\zeta \omega_n}=\frac{4.6}{\sigma}$</li>
</ul>
</li>
</ul>
<p>이 같은 시간 사양을 통해 의도한 목표를 위한 설계방정식을 세울 수 있다.</p>
<p>$$
\omega_n\geq \frac{1.8}{t_r};;;;;;\zeta\geq\zeta(M_p);;;;;;\sigma\geq\frac{4.6}{t_s}
$$</p>
<p>위의 모든 시간 사양은 시스템이 이차일때 해당되는 값이다.</p>
<h2 id="영점과-추가-극점의-영향">영점과 추가 극점의 영향</h2>
<h3 id="영점의-영향">영점의 영향</h3>
<p>다음의 예시를 통해 영점이 시스템에 미치는 영향을 알아본다.</p>
<p>$$
\begin{aligned}
H_1(s)
&amp;=\frac{2}{(s+1)(s+2)}\
&amp;=\frac{2}{s+1}-\frac{2}{s+2}\
\
H_2(s)
&amp;=\frac{2(s+1.1)}{1.1(s+1)(s+2)}\
&amp;=\frac{2}{1.1}\left(\frac{0.1}{s+1}+\frac{0.9}{s+2}\right)\
&amp;=\frac{0.18}{s+1}+\frac{1.64}{s+2}
\end{aligned}
$$</p>
<p>$H_2(s)$ 함수는 단순히 $H_1(s)$ 함수에 $(s+1.1)$ 항이 추가된 것이다. </p>
<p>만약 추가된 항이 $(s+1)$  이라면, 해당 극점을 상쇄되었을 것이다. 이 점에 주목하여 식을 해석하면,</p>
<p>$H_1(s)$ 의 극점 $s=-1$ 과 영점의 $s=-1.1$ 은 상당히 가까우므로 $\frac{1}{s+1}$ 항의 비율이 작아짐을 기대할 수 있다.</p>
<p>위의 결과에서 보듯이 $\frac{1}{s+1}$ 의 영향이 2에서 0.18로 줄었음을 확인할 수 있다.</p>
<p>즉, 우리는 영점을 설계하여 극점에 대한 영향도를 키우거나 줄일 수 있다는 것이다. 위의 예시를 일반화시키면 다음과 같다.</p>
<p>$$
C_1=(s-p_1)F(s)|_{s=p_1}
$$</p>
<p>여기서 시사하는 바는 $F(s)$ 가 $p_1$ 근처에서 영점을 갖는다면 $C_1$ 의 값이 작아진다는 것이다.</p>
<p>제어시스템을 설계 시 영점이 과도응답에 미치는 영향을 고려하기 위해 두 개의 복소수 극점과 한 개의 영점을 가진 전달함수를 고려해본다.</p>
<p>여러가지 경우에 대해 효과적인 해석을 하기 위해 다음과 같이 표준화된 시간 및 영점 위치를 나타내는 식으로 변환하여 사용한다.</p>
<p>$$
H(s)=\frac{(s/\alpha\zeta\omega_n)+1}{(s/\omega_n)^2+2\zeta(s/\omega_n)+1}
$$</p>
<p>위의 식에서 영점은 $s=-\alpha\zeta\omega_n=-\alpha\sigma$ 에 위치한다. $\alpha$ 를 통해 극점의 실수부에 대한 영향을 설계할 수 있다. </p>
<p>$\alpha$ 가 크면, 영점은 극점에서 멀어질 것이고, 1에 가까워지면 극점의 실수부와 매우 가까워서 응답에 상당한 영향을 미칠 것이다.</p>
<p>다음의 그림을 통해 $\alpha$ 값이 응답에 미치는 영향을 직관적으로 확인해보라.</p>
<p>$$
\zeta=0.5
$$</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/3641d42e-cc86-413a-8be8-7c340526d2da/image.png" alt=""></p>
<p>$$
\zeta=0.707
$$</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/c58eb205-0ecd-44eb-accf-080f5b7bced9/image.png" alt=""></p>
<p>전달함수를 일반항과 미분항으로 분리해서 생각하면 영점이 오버슈트에 미치는 영향을 더 효과적으로 해석할 수 있다.</p>
<p>위에서 언급한 시스템을 보자.</p>
<p>$$
\begin{aligned}
H(s)
&amp;=\frac{(s/\alpha\zeta\omega_n)+1}{(s/\omega_n)^2+2\zeta(s/\omega_n)+1}=\frac{s/\alpha\zeta+1}{s^2+2\zeta s+1}\
&amp;=\frac{1}{s^2+2\zeta s+1}+\frac{1}{\alpha\zeta}\frac{s}{s^2+2\zeta s +1}\
&amp;=H_0(s)+H_d(s)\
&amp;=H_0(s)+\frac{1}{\alpha\zeta}sH_0(s)\
\end{aligned}
$$</p>
<p>미분항은 일반항에 계수와 $s$ 를 곱한 형태이고, $\mathcal{L}(df/dt)=sF(s)$ 에 따라</p>
<p>$$
\begin{aligned}
y(t)
&amp;=y_0(t)+y_d(t)\
&amp;=y_0(t)+\frac{1}{\alpha\zeta}\dot{y}_0(t)
\end{aligned}
$$</p>
<p>으로 간단하게 구할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/6e8f1287-132f-4a46-9a7d-96efbbc449b2/image.png" alt=""></p>
<p><code>RHP</code> : $s$-평면의 오른쪽  <code>LHP</code> : $s$-평면의 왼쪽 $\Rightarrow ;\alpha$ 가 결정!!</p>
<p>영점의 $s$-평면 상의 위치 또한 응답을 효과적으로 해석하는 데 도움이 된다.</p>
<p>영점은 초기의 응답에 영향을 크게 미치기는 하지만, 정상상태에는 거의 영향을 미치지 않는다. 
이것은 시스템을 표현하는 분모의 차수가 분자의 차수보다 크기 때문이다.</p>
<h3 id="추가극점의-영향">추가극점의 영향</h3>
<p>표준 2차 계단응답에 대한 추가극점의 영향 고려 또한 설계의 중요한 사항 중 하나이다. 다음의 전달함수를 예로 든다.</p>
<p>$$
H(s)=\frac{1}{(s/\alpha\zeta\omega_n+1)[(s/\omega_n)^2+2\zeta(s/\omega_n)+1]}
$$</p>
<p>주어진 전달함수를 $\alpha$ 에 따른 선도를 그리면,</p>
<p>$$
  \zeta=0.5
 $$</p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/e947dae9-069a-4ca9-9653-9991446ee187/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/e55443be-3b06-43b7-a435-6de0bcb23750/image.png" alt=""></p>
<h3 id="동적-응답의-극점-영점이-미치는-영향통합">동적 응답의 극점-영점이 미치는 영향(통합)</h3>
<ul>
<li><p>유한 영점을 갖지 않는 2차 시스템에서 과도응답 파라미터는 다음과 같이 근사화될 수 있다.</p>
<ul>
<li><p>상승시간($t_r$ ) : rise time   $t_r\approxeq \frac{1.8}{\omega_n}$</p>
</li>
<li><p>오버슈트($M_p$)</p>
<p>  $$
  \begin{aligned}
  M_p&amp;\approxeq5%;;;;;;;\zeta=0.7\
  M_p&amp;\approxeq16%;;;;;\zeta=0.5\
  M_p&amp;\approxeq35%;;;;;\zeta=0.3\
  \end{aligned}
  $$</p>
</li>
<li><p>정착시간($t_s$) : settling time   $t_s\approxeq\frac{4.6}{\sigma}$</p>
</li>
</ul>
</li>
<li><p>만약 LHP(좌반평면)의 영점이 복소수 극점 실수부의 4배 이내에 있으면 오버슈트를 증가시킨다.</p>
<ul>
<li>$z&lt;4\cdot RE(p);;(z&lt;0)\Rightarrow$  오버슈트 증가</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/ba65273f-8cb8-4d07-919a-7168eb4eed78/image.png" alt=""></p>
<ul>
<li>RHP(우반평면)에 있는 영점은 오버슈트를 감소시킨다. 그리고 계단 응답을 반대방향으로 출발시킨다.</li>
<li>만약 LHP 에 있는 부가극점이 복소수 극점의 실수부의 4배 이내에 있으면 상승시간(rise time) 을 증가시킨다.<ul>
<li>복소수 극점의 실수부 : $\sigma=\zeta\omega_n$, 부가 극점 : $p_{add}=\alpha\zeta\omega_n$</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jo0n-lab/post/29d9bfe1-abdb-49b2-8686-a567ba279fb8/image.png" alt=""></p>
<pre><code>    그래프에서 alpha 가 무한대로 가면 0
   (부가극점 없는 상황)이고 4 이후에도 상승효과의 증가가 분명 있지만, 매애애ㅐ애애우 작으므로 4를 기준으로 증가로 보겠다는 말임.</code></pre>]]></description>
        </item>
    </channel>
</rss>