BITCOIN BTC
8,403,500 (+1.44%)
비트코인 백서
최초작성 : 5개월 전 / 최종수정 : 3주 전 / 번역자 : misskiwi

역자의 말. Satoshi Nakamoto의 비트코인 백서는 암호화 화폐를 공부하는 이들에게 바이블이라 할 수 있습니다. 하지만, 기술적인 용어가 많이 사용된터라, 짤막한 단문을 그대로 우리말로 옮기면 내용의 전달이 어려운 경우가 많습니다. 이 번역본은 이러한 점을 최대한 해소하고자 필요에 의해 내용을 길게 풀어 쓴 경우가 있습니다. 평역(評譯)에 가까운 것은 아니지만, 역자의 해설이 중간중간 들어갔음을 감안하여 읽어주시기 바랍니다.
- misskiwi

비트코인 : P2P 전자 화폐 시스템

Satoshi Nakamoto
satoshin@gmx.com
www.bitcoin.org


초록. 완전한 P2P 방식의 전자 화폐를 이용하면 금융기관을 통하지 않고 한쪽에서 다른쪽으로 온라인 송금이 가능하다. 전자 서명이 일반적인 해결책이지만, 이중지불(double-spending)을 방지하기 위해 신뢰받는 제3자의 개입을 필요로 한다면 우리가 원하는 바에서 벗어나게 된다. 이 문서는 P2P 네트워크를 이용하여 이중지불을 막는 해결책을 제시하고자 한다. 이 네트워크는 암호화 함수를 실행하는 해싱(hashing) 작업을 통해 해시 기반 작업증명(proof-of-work) 체인(chain)에 타임스탬프(timestamp)를 통해 시간을 기록하는데, 이를 통해 작업증명을 다시 수행하지 않고서는 변경할 수 없는 안전한 기록을 생성한다. 가장 긴 체인은 네트워크에 의해 검증된 거래의 연속적인 기록일 뿐만 아니라 가장 큰 연산능력(CPU power)의 결과물이기도 하다. 다수의 연산능력이 네트워크를 공격하는데 동조하지 않는 한, 가장 긴 체인을 만들면 공격자는 무력화 된다. 또한, 네트워크는 최소한의 구조만을 필요로 한다. 메시지는 최선의 노력을 다하는 것을 근간으로 삼아 네트워크에 전파되고, 노드는 네트워크에서 언제든 이탈했다가 재접속할 수 있으며, 이탈한 기간동안에는 가장 긴 작업증명 체인을 받아들이면 된다.

1. 서론(Introduction)

인터넷 상거래는 대부분 금융기관을 신뢰받는 제3자의 역할로 사용하는 전자지불 방식에 의존하고 있다. 이 시스템은 일상의 대부분의 거래에 무리 없이 작동하지만, 신뢰를 기반으로 한 구조라는 원천적인 약점을 가지고 있다. 금융기관의 형태는 중재를 위한 분쟁을 피할 수 없어, 완벽하게 취소 불가능한 거래를 보장하기 어렵다. 게다가 중재에 사용되는 비용은 거래 비용의 상승, 가능한 최소 거래량의 제한, 작고 간단한 거래의 원천적인 봉쇄와 같은 문제를 야기하고, 취소 불가능한 서비스가 필요로 하는 지불 방식을 만들지 못해 결국 더 많은 비용을 소진하게 된다. 거래의 취소가 가능한 구조는 일반적으로 더 많은 신뢰를 필요로 한다. 판매자는 고객을 더 경계하게 되어 그다지 필요하지 않은 정보들도 귀찮게 요구할 것이다. 그럼에도 불구하고 일정 수준의 사기가 발생하는 것은 감내할 수 밖에 없다. 이러한 비용의 증가와 지불의 불확실성 증가는 사람이 직접 실물 화폐를 사용하여 거래하면 해결될 문제지만 이렇게 처리해버리면 신뢰기관 없이 통신 채널만을 통해 지불하는 방법이 없다는 것과 같다.

신용 기반이 아닌 암호화 기술에 기반한 전자 지불 시스템을 이용하면, 신뢰받는 제3자 없이 당사자간 직접 거래가 가능해진다. 전산을 통해 취소가 불가능한 거래는 판매자를 사기로부터 보호할 수 있고, 에스크로 방식을 통해 구매자도 보호할 수 있다. 이 문서에서 P2P 타임스탬프 서버를 이용하여 거래의 시간 순서를 전산을 통해 증명하는 방식으로 이중지불을 해결할 수 있는 방안을 제시하고자 한다. 이 시스템은 공격자 그룹의 연산능력보다 정직한 노드가 더 많은 연산능력을 보유하고 있는 한 안전하다.

2. 거래(Transactions)

전자 화폐를 디지털 서명이 연결된 것으로 정의하도록 하자. 소유자들은 이전 거래와 다음 소유자의 공개키를 해시하여 전자 서명하고 이를 코인의 뒤에 붙이는 형태로 전송한다. 수취인은 체인의 소유권을 확인하는 것으로 서명을 검증할 수 있다.

문제는 수취인의 입장에서 원 소유주가 이중지불을 하지 않았는지 검증하지 못한다는 것이다. 보편적인 해결책은 거래가 이중지불이 되었는지 확인하는 신뢰할 수 있는 중앙기관 혹은 조폐국을 두는 것이다. 거래가 발생하면 모든 코인은 조폐국으로 들어가 새 코인이 발행되도록 하고 조폐국을 거친 거래만을 유효한 것으로 인정하면 이중지불의 위험에서 벗어날 수 있다. 이 방식의 문제는 전체 시스템의 운명이 모든 거래에 개입하는 조폐국을 운영하는 주체에 달려있다는 점이다.

수취인의 입장에서 이전 소유자가 어떤 거래에도 (기존 코인의 잔액을 이용한) 서명을 사용하지 않았다는 것을 확인할 방법이 필요하다. 이를 위해서는 해당 서명을 사용한 가장 최초의 거래만 계산하면 뒤이어 이어지는 거래에 이중지불이 있는지는 굳이 확인할 필요가 없다. 누락된 거래가 있는지 확인하는 유일한 방법은 모든 거래를 확인하는 것이다. 조폐국을 기반으로 한 모델에서는 조폐국이 모든 거래를 확인하여 어떤 거래가 먼저 이루어진 것인지 결정을 해주면 된다. 이를 조폐국처럼 신뢰받는 주체가 없는 상태에서 해결하고자 한다면, 거래는 공개적으로 알려져야 하며[1], 참가자들이 그들이 받은 것을 순서대로 정리한 단일한 이력을 사용하는 시스템이 필요하다. 수취인은 거래가 발생하면 노드의 대다수가 이중 수취가 아닌 최초의 수취라고 인정하는 증명을 필요로 한다.

3. 타임스탬프 서버(Timestamp Server)

제시하려는 해결책은 타임스탬프 서버에서 시작된다. 타임스탬프 서버는 시간 순으로 기록된 블록들의 해시를 취하고, 신문이나 유즈넷 포스트[2-5]처럼 해시를 발행하는 역할을 한다. 타임스탬프는 해시의 형태로 취합되기 위해 해당 시간에 그 데이터가 존재했음을 증명해야한다. 각각의 타임스탬프는 이전 타임스탬프를 해시의 형태로 포함하는 구조로 결국, 각 타임스탬프는 이전 타임스탬프를 강화하는 형태로 체인을 형성한다.

4. 작업증명(Proof-of-Work)

P2P를 기반으로 한 분산형 타임스탬프 서버를 실현하기 위해서는 유즈넷이나 신문 등의 방식이 아니라, Adam Back의 Hashcash[6]와 유사한 작업증명 시스템을 이용해야 한다. 작업증명 방식은 SHA-256 같은 알고리즘을 통해 해시되었을 때 0(zero)으로 시작되는 값들을 찾는 과정을 수반한다. 해시를 한번 수행하는 것으로 확인하는 이 작업의 소요 시간은 어떠한 평균치에 수렴하며, 요구하는 0의 숫자가 많을수록 소요 시간이 지수의 형태로 늘어나는 특성을 가진다.

타임스탬프 네트워크는 블록 해시를 수행한 결과 만족하는 0비트를 가질때까지 임의의 값인 논스(nonce)를 증가시키는 방식으로 작업증명을 구현한다. CPU가 노력한 결과가 작업증명 조건을 충족하게 되면, 이 블록은 수행한 작업증명과 같은 노력의 일을 반복하지 않는 한 변경할 수 없다. 하나의 블록을 변경하려면 해당 블록에 연결된 모든 블록에 작업증명을 다시 진행해야 한다.

또한, 작업증명 방식은 다수결 의사결정에서 대의(代議)의 문제를 해결한다. 만약, IP 주소당 하나의 투표권을 부여하게 되면 누구나 IP 주소를 많이 확보하는 것 만으로 시스템을 전복시킬 수 있다. 이에 반해, 작업증명은 연산 능력에 비례하여 투표권을 주는 것이다. 가장 긴 체인은 가장 많은 연산능력(작업증명)을 포함하고 있으므로 이것이 곧 다수의 결정이 된다. 정직한 노드들이 연산능력의 대부분을 차지하고 있다면, 정직한 체인이 가장 빠르게 늘어나 여타 경쟁 체인을 압도할 것이다. 과거의 블록 한 개를 수정하려면 공격자는 해당 블록과 이후의 모든 블록에 작업증명을 과정을 수행하여 정직한 노드의 블록 길이를 추월해야 한다. 느린 공격자가 블록을 따라잡을 가능성은 뒤에 추가로 언급하겠다.

증가하는 하드웨어 속도와 노드를 실행하는 동기를 보상하기 위해 작업증명의 난이도는 시간당 생성되는 블록의 이동평균을 통해 정해진다. 만약 블록이 빠르게 생성되면, 난이도는 증가한다.

5. 네트워크(Network)

네트워크는 아래와 같은 과정으로 동작한다.

  • 새로운 거래들이 전체 노드들에게 전파된다.
  • 각 노드들은 새 거래들을 블록에 취합한다.
  • 각 노드들은 블록에 가장 어려운 난이도로 행해진 작업증명을 찾는다.
  • 노드가 새로운 작업증명을 발견하면 해당 블록을 전체 노드에 전파한다.
  • 노드들은 모든 거래가 유효하고, 이미 사용되지 않은 경우에만 블록을 받아들인다.
  • 노드들은 체인 위의 다음 블록에 이전 블록을 해시 형태로 추가하는 것으로 해당 블록을 받아들였다는 의사를 표시한다.

노드들은 항상 가장 긴 체인을 옳은 것으로 간주하고 인증된 체인을 이어간다. 만일 두 개의 노드가 각기 다른 버전의 다음 블록을 동시에 전파하는 경우, 다른 버전의 블록을 전달받는 노드들이 발생한다. 이 경우, 먼저 전달 받은 블록을 기준으로 작업을 수행하지만, 다른 갈래의 블록도 저장하여 해당 블록이 더 길어질 것에 대비한다. 다음 작업증명이 완료되어 둘 중 하나가 더 긴 체인이 되는 경우 더 이상 두 블록은 대등하지 않고 긴 체인을 형성한 블록을 기준으로 작업한다.

새로운 거래는 꼭 모든 노드에 전파될 필요는 없다. 최대한 많은 노드에 도달한다면 이 거래는 블록이 길어지기 전에 포함될 것이다. 블록의 전파가 누락되는 경우에도 크게 걱정할 필요가 없다. 만약 노드가 중간 블록을 전달받지 못하더라도, 이를 요청하여 받게 되면 정상적인 체인을 만들 수 있다.

6. 보상(Incentive)

블록의 첫 거래는 블록의 생성자에게 새로운 코인을 보내는 특별한 거래가 된다. 이는 네트워크를 유지하는 노드들에게 보상이 되고, 중앙관리기구 없이 분산된 형태로 유통되는 구조를 만들 수 있다. 새로운 코인이 지속적으로 공급되는 것은 흡사 금광을 캐는 광부들이 자원을 소진하여 금의 순환구조를 만드는 것과 비슷하다. CPU 사용시간과 전력이 소비되는 자원에 해당한다.

거래 수수료도 보상 중 하나다. 거래에서 출력되는 돈보다 입력되는 금액이 작다면 그 차이는 거래 수수료의 형태로 블록을 생성하는 보상으로 추가된다. 초기 예상 발행량의 전부가 발행된 이후에는 거래 수수료만 보상으로 주어지며, 인플레이션에서 벗어날 수 있다.

이러한 보상 체계는 노드들이 선의의 행동을 하도록 독려한다. 만약 이기적인 공격자가 선의의 노드보다 많은 연산능력을 끌어모을 수 있다면, 다른 이의 지불을 갈취하거나, 새로운 코인을 생성하여 사적인 이익을 취하려 할 것이다. 하지만 이러한 방법보다 정해진 규칙에 순응하는 것이 더 많은 코인을 가져다 주기 때문에 공격자가 굳이 공격을 해야할 이유는 없다.

7. 저장 공간의 재사용(Reclaiming Disk Space)

코인을 기준으로 충분히 많은 블록 이어지게 되면 지난 거래 내역은 저장 공간의 확보를 위해 폐기해도 된다. 블록 해시를 깨지않고 이를 가능하게 하려면 거래가 머클 트리(Merkle Tree)[7][2][5]안에 해시되고, 머클트리의 루트 부분만 블록 해시에 포함되면 된다. 오래된 블록은 나무의 가지를 친 것처럼 최소화할 수 있다. 내부의 해시는 저장될 필요가 없다.

거래가 하나도 포함되지 않은 블록의 헤더는 80 바이트(byte)이다. 만약 블록이 매 10분마다 생성된다고 가정하면, 연간 소요되는 데이터는 80 bytes x 6 x 24 x 365 = 42MB가 된다. 2008년에 보편적인 컴퓨터가 2GB 램(RAM)을 장착하고 있으며, 무어의 법칙에 따라 현재 기준으로 1.2GB가 1년에 증가하므로, 블록 헤더가 메모리에 저장되더라도 큰 문제가 되지 않는다.

8. 지불 검증의 간소화(Simplified Payment Verification)

풀 노드(full network node)를 운용하지 않더라도 지불을 검증하는 것은 가능하다. 사용자가 자신이 가장 긴 체인임을 확인할 수 있을 때까지 네트워크 노드들에게 요청하여 가장 긴 작업증명 체인의 블록 헤더의 사본(copy)을 가지고 있으면 해당 거래가 포함된 블록의 머클트리의 가지(branch)를 얻어올 수 있다. 사용자 스스로 거래의 유효성을 체크할 수는 없으나, 체인에 연결된 것을 확인하고, 네트워크 노드들이 이를 받아들이는지 확인한 뒤, 블록이 뒤에 연결되는지 확인하면 할 수록 네트워크가 이를 유효한 것으로 인식하는지 확신할 수 있다.

정직한 노드들이 네트워크를 제어하는 상태에서 이뤄지는 검증 작업은 신뢰할 수 있으나, 공격자의 힘이 강한 네트워크에서는 신뢰가 어렵다. 네트워크 노드들이 검증 절차를 가지고 있다하더라도, 공격자가 지속적으로 네트워크에서 힘을 유지하고 기록을 날조하여 잘못된 거래 내역을 퍼뜨리면 속을 수 밖에 없다. 이러한 문제를 막기 위한 하나의 방편은, 사용자의 소프트웨어가 블록 전체를 다운로드 받아 모순점이 있는지 확인할 수 있도록 하고, 유효하지 않은 블록을 발견했을 때 네트워크 노드들에 경고성 알림을 보내는 것이다. 이런 면에서, 잦은 거래를 필요로하는 사업분야에서는 빠른 검증과 독립적인 보안체계를 유지하기 위해 자신의 노드를 직접 운용하는 것을 원할 것이다.

9. 가치의 병합과 분할(Combining and Splitting Value)

코인을 중심으로 개별적 관리하는 것도 가능하지만, 이는 작은 단위의 거래를 하기에는 불편하다. 가치가 나누고 합쳐질 수 있도록 하기 위해 다수의 입력과 다수의 출력을 허용한다. 보통, 큰 규모의 단일 입력이거나 다수의 소액을 합친 입력일 것이며, 출력은 지불을 위한 것 하나와 남는 잔액을 송금자에게 돌려주는 출력 두 개일 것이다.

하나의 거래가 여러 거래들로부터 비롯되고, 이 거래들은 더 많은 거래들로부터 비롯되는 팬아웃(fan-out)형태는 여기서 문제가 되지 않는다. 거래 기록의 완전한 독립 사본을 추출할 필요가 없기 때문이다.

10. 프라이버시(Privacy)

기존의 은행 구조는 담당하는 그룹과 신뢰받는 제3자의 정보 접근 권한을 제한하는 방식으로 프라이버시를 보호한다. 모든 거래를 공개하는 방식에서 은행 형태의 모델을 차용할 수는 없지만 프라이버시를 유지하면서 모든 거래를 공유하는 것이 불가능한 것은 아니다 : 공개 키들을 익명으로 사용하면 된다. 참여자 누구나 어떤 이가 다른 이에게 얼마를 보냈는지 확인할 수 있지만, 정작 거래가 누구에 귀속되는지에 대한 정보는 공개하지 않는 방식이다. 이는 증권 거래소에서 정보를 공개하는 것과 비슷하다. 시간과 거래량은 공개되지만 누구의 거래인지 알 수 없는 것처럼 말이다.

추가적인 방화벽으로서, 매 거래마다 새로운 키를 사용하도록 하여 소유자 분별이 어렵도록 한다. 다수의 입력이 존재하는 거래일 경우 입력들이 동일한 소유자에서 온 것이 밝혀질 수도 있다. 만약 소유자의 키가 공개되면, 다른 거래의 것도 동일한 소유자라는 것이 밝혀질 수 있다는 위험성이 있으므로 새로운 거래를 수행 시 매번 새로운 키를 사용하도록 권장한다.

11. 계산(Calculations)

공격자가 정직한 체인보다 빠르게 체인을 이어가려는 경우를 생각해보자. 이 공격이 성공한다해도 시스템에 없던 돈을 새로 만들어내거나 하는 식의 제멋대로인 상태로 망가뜨릴 수는 없다. 노드들은 유효하지 않은 거래는 받아들이지 않을 것이고, 정직한 노드는 아예 해당 내용을 블록에 포함하는 것조차 허용하지 않는다. 공격자는 오직 자신이 행한 거래의 돈을 되찾는 공격만 가능하다.

정직한 체인과 공격자 체인의 경쟁은 이항무작위행보(Binomial Random Walk)의 특성을 지닌다. 정직한 체인이 블록 한 개를 성공적으로 생성하는 사건에 +1을 부여하고, 공격자 체인이 블록 한 개를 성공적으로 생성하는 사건에 -1을 부여한다고 하자.

공격자가 적자의 상태에서 시작하여 선의의 체인을 따라잡을 가능성은 도박사의 파산 문제(Gambler's Ruin problem)와 유사하다. 적자 상태의 도박사가 무제한의 신용을 바탕으로 무한대로 게임을 시도하여 손익분기점에 도달했다고 하자. 그가 손익분기점에 도달할 확률, 혹은 공격자가 정직한 체인을 따라잡을 확률은 다음과 같이 계산할 수 있다.[8]

p > q 라 가정한다면, 공격자가 블록을 따라잡을 확률은 블록 수의 증가분에 지수로 감소한다. 공격자가 가능한 빨리 시도하여 운좋게 성공하지 못한다면, 가능성은 뒤로 갈수록 희박해진다.

수신자의 입장에서 송금자가 거래를 변조하지 못할거라 판단되는 충분한 기간은 얼마인지 고려해보자. 공격자인 송금자가 수신자로 하여금 일정 기간동안 자신은 돈을 받았다고 믿도록 하다가 다시 돈을 자신에게 되돌리는 시도를 할 것이다. 수신자는 이에 대한 경고를 받겠지만 공격자는 이미 늦은 상태에서 알림을 받게 하길 원한다.

수신자는 새로운 키 쌍을 생성하여 송금자에게 공개키를 보낸다. 이는 공격자가 미리 멀리 달아나기 충분한 만큼 블록을 체인의 형태로 만들어 두는 것을 방지한다. 거래가 전송되면, 정직하지 않은 송금자는 비밀리에 다른 거래 내역을 포함하는 체인의 생성을 시작할 것이다.

수신자는 거래가 블록에 포함되고 z개의 블록만큼이 추가되길 기다린다. 그는 공격자가 어느 정도의 작업을 진행했는지는 모르지만, 정직한 블록들은 평균 블록 생성시간에 따라 생성될 것으로 유추할 수 있다. 공격자의 잠재적 진행률은 포아송 분포의 기대값인 다음과 같다.

공격자가 해당 시점에도 따라잡을 수 있는 확률을 계산하기 위해, 포아송 분포를 공격자가 따라잡을 매 진행률에 곱한다.

분포 상의 무한 소수를 더하지 않기 위해 식을 정리하면...

이를 C언어 코드로 구현하면...

#include 
double AttackerSuccessProbability(double q, int z)
{
	double p = 1.0 - q;
	double lambda = z * (q / p);
	double sum = 1.0;
	int i, k;
	for (k = 0; k <= z; k++)
	{
		double poisson = exp(-lambda);
		for (i = 1; i <= k; i++)
			poisson *= lambda / i;
		sum -= poisson * (1 - pow(q / p, z - k));
	}
	return sum;
}

실행 결과를 보면 z의 증가에 따라, 지수 형태로 확률이 감소하는 것을 확인할 수 있다.

q=0.1
z=0    P=1.0000000
z=1    P=0.2045873
z=2    P=0.0509779
z=3    P=0.0131722
z=4    P=0.0034552
z=5    P=0.0009137
z=6    P=0.0002428
z=7    P=0.0000647
z=8    P=0.0000173
z=9    P=0.0000046
z=10   P=0.0000012
   
q=0.3
z=0    P=1.0000000
z=5    P=0.1773523
z=10   P=0.0416605
z=15   P=0.0101008
z=20   P=0.0024804
z=25   P=0.0006132
z=30   P=0.0001522
z=35   P=0.0000379
z=40   P=0.0000095
z=45   P=0.0000024
z=50   P=0.0000006

P가 0.1%보다 작은 경우를 계산하면...

P < 0.001
q=0.10   z=5
q=0.15   z=8
q=0.20   z=11
q=0.25   z=15
q=0.30   z=24
q=0.35   z=41
q=0.40   z=89
q=0.45   z=340

12. 결론(Conclusion)

지금까지 신뢰에 기반하지 않은 전자 거래 시스템을 제안하였다. 전자 서명으로 이뤄진 일반적인 형태는 소유권에 대한 강한 통제권을 제공하지만 이중지불을 막지 못하면 불완전할 수 밖에 없다. 이를 해결하기 위해 작업증명을 이용하여 공개적으로 거래를 기록하는 P2P 네트워크를 제안하였다. 이 방식은 정직한 노드들이 다수의 연산능력을 확보하고 있다면 공격자가 쉽게 조작하는 것이 불가능하다. 이 네트워크는 간결함을 기반으로 함에도 견고하다. 노드들은 약간의 협력만으로 합일이 가능하다. 특정한 위치까지 메시지가 전달되지 않더라도 최선을 다하는 것을 기반으로 전달되기만 하면 되기 때문에, 굳이 신원을 밝힐 필요도 없다. 노드들은 언제든지 네트워크에서 이탈했다가 재접속할 수 있으며, 그들이 이탈한 동안 이뤄진 작업증명의 체인을 받아들이기만 하면 된다. 유효한 블록의 뒤에는 블록을 연장하고, 유효하지 않은 블록은 거부하는 행위를 통해 작업증명 연산 능력은 참여자들의 의사표현의 수단이 된다. 이러한 합의 구조는 규칙이나 보상과 함께 제시된다.

참고문헌(References)

[1] W. Dai, "b-money," http://www.weidai.com/bmoney.txt, 1998.
[2] H. Massias, X.S. Avila, and J.-J. Quisquater, "Design of a secure timestamping service with minimal trust requirements," In 20th Symposium on Information Theory in the Benelux, May 1999.
[3] S. Haber, W.S. Stornetta, "How to time-stamp a digital document," In Journal of Cryptology, vol 3, no 2, pages 99-111, 1991.
[4] D. Bayer, S. Haber, W.S. Stornetta, "Improving the efficiency and reliability of digital time-stamping," In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993.
[5] S. Haber, W.S. Stornetta, "Secure names for bit-strings," In Proceedings of the 4th ACM Conference on Computer and Communications Security, pages 28-35, April 1997.
[6] A. Back, "Hashcash - a denial of service counter-measure," http://www.hashcash.org/papers/hashcash.pdf, 2002.
[7] R.C. Merkle, "Protocols for public key cryptosystems," In Proc. 1980 Symposium on Security and Privacy, IEEE Computer Society, pages 122-133, April 1980.
[8] W. Feller, "An introduction to probability theory and its applications," 1957.