diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..d7fb5ae Binary files /dev/null and b/.DS_Store differ diff --git a/00-DeveloperEnvironment/README_KR.md b/00-DeveloperEnvironment/README_KR.md new file mode 100644 index 0000000..f4ba75c --- /dev/null +++ b/00-DeveloperEnvironment/README_KR.md @@ -0,0 +1,33 @@ +# 개발 환경 설정 + +이 튜토리얼에서 rholang snippet을 실행하려면, 당신은 어떤 종류의 개발 환경이 필요합니다. 이것은 rholang 개발 도구나 스택에 대한 완벽한 지침은 아닙니다. 오히려, 그것은 여러분을 시작하기 위한 몇 가지 일반적인 기본 개발 환경을 보여줍니다. + +## RChain 클라우드 +RChain 커뮤니티의 구성원들은 공개 웹 기반 [온라인 rholang transver] (http://rchain.cloud) ([mmir]) (https://rchain cloud)을 제공합니다. inblock.io)). 이 도구는 시작하는 가장 쉬운 방법이며 소프트웨어를 설치할 필요가 없습니다. + +## Cryptofex IDE +Pyrofex는 [cryptofex](https://cryptofex.io/).이라 불리는 유망한 통합 개발 환경을 개발하고 있습니다. Cryptofex는 기본적으로 창, Mac 및 리눅스/에서 실행됩니다. 그것은 rholang 구문 강조를 제공하며 rholang 코드를 내부적으로 또는 실행 중인 RNode로 평가할 수 있습니다. IDE는 또한 외래 개발을 지원합니다. + +경고: 2018년 10월 현재 Cryptofex는 구문 오류가 발생할 때 올바른 라인 번호를 보고하지 않습니다. 이것은 꽤 절망적일 수 있습니다. + +## 로컬 노드 +rholang 코드를 실행하기 위해 시도하고 참된 방법은 당신의 지역 RNode를 시작하고 그것의 rholang 통역기를 사용하는 것입니다. 먼저, 플랫폼에 대해 [ RNode](https://rchain.atlassian.net/wiki/spaces/CORE/pages/428376065/User+guide+for+running+RNode)을(를) 설치해야 합니다. + +초보 학습자의 경우 [AWS](https://blog.rchain.coop/running-rnode-0-5-3-on-amazon-ec2/) 또는 [Docker](https://blog.rchain.coop/running-rnodev-0-6-x-with-docker/).을 사용하여 노드를 설정하는 단계별 가이드를 참조하세요. + +RNode가 설치되면 기본 독립 실행형 노드를 실행할 수 있습니다 +``` +$rnode run -s -n +``` + +별도의 터미널에서 RNode의 eval 모드를 사용하여 코드를 평가할 수 있다. + +``` +$rnode eval intersection.rho. +Result for intersection.rho: +Deployment cost: CostAccount(39,Cost(1132)) +Storage Contents: + @{Unforgeable(0xb19519ab773d1ec4ce96f1b71b748552e4a084dfc9942371717f5cb87e818879)}!(@{"name"}!(Nil)) | @{Unforgeable(0xb19519ab773d1ec4ce96f1b71b748552e4a084dfc9942371717f5cb87e818879)}!(@{"age"}!(Nil)) | @{"world"}!("hello") | for( x0, x1 <= @{Unforgeable(0x01)} ) { Nil } | for( x0, x1, x2, x3 <= @{"secp256k1Verify"} ) { Nil } | for( x0, x1 <= @{"sha256Hash"} ) { Nil } | for( @{{@{"name"}!(_) | _ /\ @{"age"}!(_) | _}} <= @{Unforgeable(0xb19519ab773d1ec4ce96f1b71b748552e4a084dfc9942371717f5cb87e818879)} ) { @{Unforgeable(0x00)}!("Both name and age were in the data") } | for( x0, x1 <= @{Unforgeable(0x03)} ) { Nil } | for( x0, x1, x2, x3 <= @{"ed25519Verify"} ) { Nil } | for( x0, x1 <= @{"blake2b256Hash"} ) { Nil } | for( x0 <= @{Unforgeable(0x02)} ) { Nil } | for( x0 <= @{Unforgeable(0x00)} ) { Nil } | for( x0, x1 <= @{"keccak256Hash"} ) { Nil } +``` + +RNode의 출력 중 일부는 코드를 실행하는 동일한 터미널에 표시됩니다. 그러나 다른 출력은 노드(첫 번째 단자)에서 직접 나옵니다. 따라서 표시되는 출력에 익숙해질 때까지 두 위치를 모두 확인하세요. \ No newline at end of file diff --git a/01-SendingAndStandardOut/README_KR.md b/01-SendingAndStandardOut/README_KR.md new file mode 100644 index 0000000..edd1933 --- /dev/null +++ b/01-SendingAndStandardOut/README_KR.md @@ -0,0 +1,94 @@ +# Sending 및 StandardOut + +# Say Hello + +!["Person Wawaying hello." (HelloWorld.pn) + + +프로그래밍에는 당신의 첫 프로그램이 "Hello World"라고 말해야 하는 오랜 전통이 있습니다. 여기 화면에 그 텍스트를 올릴 수 있는 가장 간단한 rholang 코드가 있습니다. + +[hello.rho] (hello.rho) + +### Exercise +프로그램을 "Hello World" 대신에 "Rholang rockes!"라고 인쇄하십시오. + + +##WTH가 stdout인가? + +![채널은 메시지 보내기 우편함과 같다](mailbox.png) + +Rholang의 중심부는 채널로 의사소통하고 있습니다. 채널은 메시지를 보내고 받는 데 사용하는 통신 라인입니다. 채널을 통해 메시지를 보내려면 문자를 사용하십시오. + +![이 도표 다시 쓰세요!](sendSyntax.png) + +프로그램 첫 줄에 새로운 stdout으로 stdout 채널을 만들었습니다. 당신은 당신이 rholang을 배우면서 많은 채널을 만들 것입니다. (rho:io:stdout)을 포함하여 채널에도 특별한 힘을 주었습니다. 나중에 더 자세히 말하자면, 지금은 그 부분이 화면에 실제로 나타나도록 하기 위해 괄호 안에 있어야 한다는 것을 알고 있습니다. + + +##다른 채널 사용 + +여기서 "메시지 삭제"... JK, '튜플스페이스'라고 하는 우편함에서 메시지가 수신되기를 기다린다.png) + +스투(stdout)뿐만 아니라 많은 채널에 메시지를 보낼 수 있다. 그러나 "stdout"과 달리 그들은 화면에 나타나지 않을 것이다. 왜냐하면 우리가 그들에게 특별한 힘을 가하지 않기 때문이다. + +[TupleSpace.rho](TupleSpace.rho) + +그럼 다른 채널들은 어디로 갈까? 아무데도! 아직은 아니다, 어차피. 메시지들은 그저 누군가(또는 어떤 과정) 그것들을 받을 수 있기를 기다리며 그곳에 앉아 있다. 우리는 다음 수업에서 메시지를 받는 방법을 배울 것이다. 그동안 메시지가 담겨있던 곳을 "튜플스페이스"라고 부른다. + +메시지가 투플스페이스에 있는지 확인하십시오. 사용하는 개발자 환경에 따라 이와 같은 텍스트를 봐야 한다. + +``` +저장소 내용: +@{"RandoChannel"}!("화면에 나타나지 않음)" | for (x0, x1 @{unforgeable(0x01) { Nil } | for (x0, x1, x2, x3 @{"secp256k1verify"}) ) {nil} |(x1 @{"256"} @(x1).feet(0x02)} ) { Nil } |(x0 @{Unforgeable(0x00)} ) { Nil } |(x0, x1 @{"keccak256Hash"} ) ) { Nil } +``` + + + +##한 번에 두 가지 작업 수행 +순서만 따져도 모든 재료가 동시에 첨가된다png) + +Rholang에서 우리는 컴퓨터에 한 가지, 다른 것, 그리고 세 번째 것을 하라고 말하지 않는다. 우리가 해야 할 모든 것을 말하고, 그것은 "현재" 혹은 모든 것을 동시에 한다. + +[parallel.rho] (병렬).rho) + +| 는 짧게 "병렬" 또는 "par"로 발음된다. + + +### 운동 +피자 가게라는 채널에 "1큰 페퍼로니 주세요"라는 메시지를 보내세요. + +### 운동 +"엄마" 채널에서 "엄마"를 전송하십시오. + +### 운동 +화면에 한 프로그램에서 "Rick"과 "Morty"라는 두 개의 메시지를 인쇄하십시오. + + + +## 퀴즈 + +무엇이 '떨어질' 것인가!("프로그래밍!") 화면에 인쇄? +- [x] 프로그래밍! +- [ ] stdout! +- [ ] 없음 + + +무슨 채널이야!("위로") 메시지를 보내시겠습니까? +- [ ] '업' +- [x] '무엇' +- [ ] '무엇' +- [ ] 'stdout' + + +Rholang이 먼저 하는 일은 +``` +stdout!("Dogs") +| +stdout!("캣츠") +``` +- [ ] "개" 인쇄 +- [ ] "캣츠" 인쇄 +- [x] 둘 다. 그들은 동시적이다. + + +### 운동 +Rho:io:stderr라는 특별 채널도 있다. 당신이 그것을 보낼 때 무슨 일이 일어나는지 살펴봐라. 차이가 뭐야? ](https://en.wikipedia.org/wiki/Standard_streams)) \ No newline at end of file diff --git a/02-Receiving/README_KR.md b/02-Receiving/README_KR.md new file mode 100644 index 0000000..69406e6 --- /dev/null +++ b/02-Receiving/README_KR.md @@ -0,0 +1,98 @@ +# Receiving + +## 메시지 확인 + +![//] 미래의 자기, 열쇠를 냉동실에 넣어 두는 이유는...](Keys.png) + +우리는 지난 번에 어떻게 메시지를 보내는지를 배웠다. 이제 메시지를 받는 법을 배울 시간이다. 일반적인 구문: + +(메시지<- 채널)용{ + // 여기서 작업 수행 +}` + +어떤 메시지가 채널로 나오면 수신을 하고 메시지라고 부른다. 곱슬곱슬한 교정기 안의 코드인 {}은(는) "계속"이라고 불리고 메시지를 받으면 실행된다. + +BTW, '//'로 시작하는 줄을 '코멘트'라고 한다. 그들은 단지 인간 코더들을 위해 그곳에 있고 프로그램이 실행되는 방식에 전혀 영향을 미치지 않는다. 그것들은 좋은 생각이고, 너는 그것을 사용해야 해! 당신의 코드를 읽는 사람은 누구나 그것들을 감상할 것이다. + + +## Comm 이벤트 + +![피자샵은 그 채널에서 메세지를 수신할 수 있다](피자.png) + +다음 코드는 피자 가게의 채널에 메시지를 보내고 피자 가게에서는 그것을 받는다. 이 피자 가게는 스투아웃에 인쇄로 메시지를 받았다는 것을 인정한다. + +[피자주문](피자주문).rho) + +### 운동 +코프숍과 같은 다른 채널로 메시지를 보내라. 인정서가 인쇄되었는가? 투플스페이스에 남은 거 있어? + +![커피 숍에 들어가자].(커피).png) + +### 운동 +기억하라, 어떤 특정한 순서로 일어난 것이 아니라, 그것들은 동시에 일어난다는 것을. 우리가 피자 가게 코드를 먼저 넣으면 잘 될 것이다. 한번 해 봐! + + +# 보내기 전에 받기 + +![메시지가 먼저 나타나는데, 그 다음 누군가가 그것을 받고 있는데, 밥이 먼저 받으려 하고 있다]. 누군가 그에게 통신 이벤트를 할 수 있도록 메시지를 보내기를 바란다.....(lookingForMessages).png) + +송신과 수신이 한 채널에서 합쳐지면, 그것은 통신 이벤트 또는 짧게 "공통 이벤트"라고 불린다. + +메시지를 받아야 하는 일반 우편과 달리, 두 우편은 순서에 상관없이 혹은 동시에 홀랑에서 발생할 수 있다. 메시지를 받은 후에 보내는 것도 똑같이 받아들여진다. 송신과 수신이 함께 올 때마다, 통신 행사가 열린다. + + +## 계약 + +[그 불쌍한 주방장은 너무 바빠서 피자주문도 받을 수 없다.] + +우리의 피자 가게의 예는 comm 이벤트를 잘 설명하지만, 들어오는 주문이 tuplespace에서 그들의 것을 소비할 때마다 피자 가게가 수동으로 새로운 수신을 할 것이라고 기대하는 것은 그리 현실적이지 않다. + +다행히도 코드를 한 번 배치하는 것이 가능하고, 메시지를 받을 때마다 코드를 실행하도록 하는 것이 가능하다. 이런 종류의 것을 "스마트 계약"이라고 한다. 피자 가게보다 훨씬 우수한 커피숍의 코드를 좀 살펴봅시다. + +[커피쇼프.rho](커피쇼프.rho) + + +### 운동 +커피숍에서 더 많은 음료 주문 + +### 운동 +주문을 받을 때 커피숍에서 인쇄하는 승인 메시지를 변경하십시오. + +일반적으로 어떤 것이 가장 먼저 되어야 하는가? +- [ ] 보통 우편이 그렇게 작동하기 때문에 발송한다. +- [ ] 코드를 그렇게 빨리 실행할 수 있기 때문에 수신. +- [x] 송신 또는 수신이 먼저거나, 또는 함께 올 수 있다. +- [ ] - rholang이 동시에 있으므로 수신 +- 둘 다. 그냥 직접 통신 이벤트를 해. + +### 운동 +그 채널의 이름은 커피샵이다. 당신이 선택한 특정한 커피숍의 이름을 따서 바꾸시오. + + +# 영구적 +실제로 이 지속적인 행동을 달성하기 위해 rholang에는 두 가지 다른 스타일의 구문이 있다. 우리는 계약이라는 것에 대해 막 배웠는데, 다른 사람은 보통 받는 사람 같아 보인다. 다음의 작은 조각들은 동등하다. + +"홀랑 +커피에 손을 대다Shop(주문) = { +``` + +"홀랑 +(주문 <= cof coffee) { +``` +단 하나의 화살표가 아닌 양방향 화살표가 있기 때문에 이는 일반적인 용도와는 다르다는 점에 주목하라. 끈질긴 용도와 계약 사이의 유일한 차이점은 우리가 블록체인들에 대해 이야기하기 시작할 때 있다. 지금으로서는 그들을 같은 것으로 생각할 수 있다. + +### 운동 +그 피자 가게는 커피숍에서 했던 것과 같은 계약을 사용할 수 있었다. 계약서 대신 영구히 쓰자. 구문을 더 잘 기억할 수 있도록 처음부터 전부 쓰도록 노력해라. + + + +이 중 어느 것이 다른 것과 같지 않은가? +- [x] '(a <- b){}' +- [ ] '계약 b(a) = {}' +- [ ] (a <= b){}"용 + +(메시지<- 할머니스냅샷)을 위한 common 이벤트를 생성할 것{닐}? +- (할마스냅샷)"안녕 할머니" +- [x] 할머니스냅챗!"할머니를 찰싹찰싹 때리는구나" +- [ ] for ("여기 네 g'ma를 위해 잠깐 쉬어" <- 할머니스냅챗)". \ No newline at end of file diff --git a/03-TelephoneNamesAndProcesses/README_KR.md b/03-TelephoneNamesAndProcesses/README_KR.md new file mode 100644 index 0000000..257cc2c --- /dev/null +++ b/03-TelephoneNamesAndProcesses/README_KR.md @@ -0,0 +1,134 @@ +# 전화, 이름 및 프로세스 + +## 메시지 릴레이 + + +![전화 게임은 Rholang의 메시지 전달을 흉내내는 데 완벽하다.(전화).png) + + +우리는 전에 할머니나 피자 가게에 메시지를 보내는 방법을 배웠다. 그러나 지금까지 수령자들은 표준 출력물에 인쇄함으로써 메시지를 승인했다. + +이제 아이들의 전화 게임처럼 메시지를 전달함으로써 그들이 좀 더 흥미로운 일을 하도록 합시다. + +[전화3.rho][전화3].rho) + +메시지가 말하듯이, 당신은 실험을 할 때 가장 많이 배운다. 그러니 당신이 적합하다고 생각하는 대로 반드시 사물을 바꾸도록 하라. + +### 운동 + +그 전화 게임은 재미있었지만, 더 많은 선수들을 보유하는 것이 항상 더 좋다. 먼저 찰리라는 세 번째 선수를 추가하십시오. 아웃에 인쇄하는 대신, 봅은 찰리에게 메시지를 전달할 것이다. 그리고 나서 찰리는 그것을 화면에 프린트할 것이다. 더 많은 메리어! + + + +![전화가 제대로 전달되지 않는 것 같다]. 나는 Bob을 탓한다.](전화 교환 메시지.png) + + + +### 운동 +만약 여러분이 실제로 전화를 해본 적이 있다면, 여러분은 그 메시지가 재치 있게 도착하는 일이 거의 없다는 것을 알고 있을 것이다. 프로그램을 변경하여 밥이 받는 것에 상관없이 다른 메시지를 전달하도록 하라. + + +##저것이 '*'인가? + +![반대] .png) + +bobb의 *를 보셨나요?(*메시지)'? Rholang에는 두 가지 종류의 "채널"과 "프로세스"가 있다. 두 가지 사이를 전환할 수 있는 방법도 있다. + + + +"프로세스"는 우리의 전화 게임이나 피자 가게 주문 프로그램과 같은 어떤 Rholang 코드 조각이다. 프로세스는 수백 개의 대형 온라인 프로그램 또는 소규모 온라인 프로그램일 수 있다. 그것들은 심지어 단지 가치일 수 있는 작은 코드 조각일 수도 있다. 여기 몇 가지 예제 과정이 있다. + + - 'stdout'!("Sup Rholang?")"일반적으로 보내는 편지 + - 'Nil' 가장 작은 과정. 그것은 문자 그대로 "아무것도 하지 말라"는 뜻이다. + - (msg <- 전화){Nil}' 메시지가 도착할 때 아무 것도 하지 않는 일반적인 수신. + 헬로 월드(Hello World)도 별 효과가 없는 작은 과정이다. 이것들은 "지상 조건"이라고 불린다. + + +채널("이름")은 메시지를 보낼 수 있는 것이다. Rholang에서는 @ 기호를 공정 앞에 붙여서 따옴표에서 따온 이름이다. 여기 몇가지 예명이 있다. + + 헬로 월드라는 기본 용어를 인용해 만든 @(@)헬로월드. + - @Nil이 가장 작은 이름. 가능한 한 가장 작은 프로세스를 인용하여 만든다. + @(알리스)!("Rholang, transfer on.")"전화게임의 과정을 인용하여 만든 + + + +# 그럼*이란 무엇인가? + + +![저 이름은 뭐니!] 너희 부모님께서 방금 컴퓨터 코드 이름을 지어주셨니?](myNameIs.png) + +"@" 기호로 이름 짓기 과정을 일괄 처리할 수 있다. 우리는 또한 '*' 기호로 이름을 'unquant'함으로써 다시 과정으로 바꿀 수 있다. + +기억해야 할 중요한 것은 Rholang에서 **프로세스와 이름**을(를) 받는 것이다. 그게 중요하니까 다시 말할게. 당신은 항상 **프로세스**를 보내고, 반대로 당신은 **이름**을(를) 받는다. + +앨리스가 포어(메시지 <- 앨리스>)로 메시지를 받으면 메시는 이름이 된다. 나중에 밥에게 보낼 때, 그녀는 '*'를 사용하여 '메시지'를 다시 '밥'으로 바꾼다.(*메시지)' + + + +## 퀴즈 + +뭐 보낼까? +- [x] 프로세스 +- [ ] 이름 + + + +뭘 받나? +- [ ] 프로세스 +- [x] 이름 + + + + {의 새 등록 코드에서 등록이란?}` +- [ ] 공정 +- [x] 이름 +- [ ] 구문이 잘못됨 + + + + +닐이란 무엇인가? +- [x] 공정 +- [ ]명 +- [ ] 구문이 잘못됨 + + + +@Nil이란 무엇인가? +- [ ] 공정 +- [x] 이름 +- [ ] 구문이 잘못됨 + + + + +@Nil이란 무엇인가? +- [ ] 공정 +- [ ]명 +- [x] 잘못된 구문 + + + +*중요데이터는 과정이다. 그렇다면 '중요데이터'란 무엇인가? +- [ ] 공정 +- [x] 이름 +- [ ] 구문이 잘못됨 + + + + 다음 중 'BobsPhone'과 맞먹는 것은? +- [x] '*@'BobsPhone' +- [ ] @"BobsPhone". +- [ ] '*"BobsPhone"" +- [ ] @*"BobsPhone" +- [ ] 'stdout!("BobsPhone")" + + + +### 운동 + +![이 전화 게임에는 포크가 있다] + +각 플레이어가 다음 사람에게 메시지를 전달하는 선형 전화 게임 대신, 게임에 분점을 추가해 봅시다. 그래서 이제 밥은 예전처럼 찰리에게 보낼 것이다. 그러나 밥도 던에게 보낼 것이다. + +나뭇가지마다 원하는 만큼 길 수 있지만, 나뭇가지 끝에 메시지를 출력해 버린다. \ No newline at end of file diff --git a/04-PersistentSendAndPeek/README_KR.md b/04-PersistentSendAndPeek/README_KR.md new file mode 100644 index 0000000..c6c7cf8 --- /dev/null +++ b/04-PersistentSendAndPeek/README_KR.md @@ -0,0 +1,76 @@ +# 지속성 있는 발송 및 Peek + +##왜 반복해서 보내는가? + +![이 라디오 내비게이션 보조 장치는 동일한 메시지를 반복해서 방송하여 항공기가 항해를 할 수 있도록 돕는다.(방송.png) + +우리의 피자와 커피숍은 같은 재사용 가능한 채널에서 많은 메시지를 받는 것에 관심이 있었다. (msg <= chan){}' 또는 계약 샹(msg){...}`. + +항공 교통 관제탑은 같은 메시지를 반복해서 보내는 정반대의 행동을 하는 데 관심이 있을 수 있다. 타워의 관제사들은 날씨와 활성 활주로 정보가 포함된 메시지를 한 번 기록하고, 그것을 필요로 하는 모든 조종사가 이용할 수 있게 하려고 한다. 피자 가게처럼, 그들은 바쁘고 조종사가 그것을 소비할 때마다 계속해서 메시지를 다시 보낼 수 없다. + + + +## 영구 전송 구문 + +관제탑은 전송을 지속시키기 위해 그들의 코드에서 약간의 조정만 하면 된다. 1인 1조로 보내는 대신 2인 1조로 하는!!`. + +[PersistentSend.rho](perstentSend.rho) + +원본 전송이 아직 Tuplespace에 있는지 직접 확인하십시오. + +### 운동 +두 번째 조종사가 정보를 받도록 위의 코드를 수정한다. 여전히 송장은 계속되고 있다. + +그런데, 스크린 'stdout'에 아무 것도 인쇄하지 않아도 'new stdout(...)'이 필요하지 않다는 것을 알아챘는가? + +for (x <- y) {Nil} | y!!에서 얼마나 많은 통신 이벤트가 발생하는지.(없음) +- [x] '1' +- [ ] '다수' +- [ ] `0` + + +## 메시지 이중 확인 + +우리가 방금 보여줬듯이 지속적인 송신과 수신은 매우 유용하다. 그러나 종종 정상적인 송수신 또한 완벽하게 좋다. 항공 교통 관제사들이 날씨가 변할 때 공항 정보를 업데이트하기를 원한다고 상상해 보라. 만약 그들이 지속적인 전송을 사용한다면, 그들은 업데이트를 할 수 없다. + +더 나은 해결책은 정상적인 전송을 사용하는 것이며, 메시지를 받은 각 조종사가 메시지를 받은 후에 채널에 다시 보내도록 요구하는 것이다. + +[putBack.rho](putBack.rho) + +### 운동 +이미 알고 있는 것을 이용하면, 정직한 조종사가 정보를 '에어포트Info' 채널에 반환하는 코드를 완성할 수 있다. + +그것을 너 혼자서 한번 해 봐. 해결책은 다음과 같다. + + +for (x <= y) {Nil} | y!!에서 얼마나 많은 통신들이 발생하는지.(없음) +- [ ] `1` +- [x] '다수' +- [ ] `0` + + + +## Peek 구문 +위의 코드의 한 가지 문제점은 건망증이 있는 조종사가 실제로 이 정보를 항공모함 채널에 다시 올려놓지 않을 수도 있다는 점이다. 더 나은 해결책은 애초에 그 메시지를 실제로 수신하지 않는 것이다. + +![메시지를 한 번 읽어 보면 안 읽고 쓸 수 있다....png) + +Rholang은 결국 이런 종류의 것에 대한 특별한 구문을 갖게 될 것이다. 지금 당장은 이용할 수 없지만, 네가 준비될 수 있도록 구문을 보여 줄게. 채널을 사용하지 않고 채널 내용을 "피크"하려면 " + +문제는 경쟁자들이 앨리스가 들을 수 있는 같은 채널에서 들을 수 있다는 것이다. 그래서 그녀에게 정말 필요한 것은 그녀의 팬들이 "쓰기 전용 번들"을 갖는 것이다. + +[판메일Publish.rho](판메일Publish.rho) + +번들+ {*알리케FanMail}은(는) 수신되지 않고 on만 전송될 수 있다는 점을 제외하면 AliceFanMail과 같은 채널이다. + +## Subscriptions +위의 번들 솔루션은 이브가 우편물을 훔치는 것을 막는데, 그것은 좋은 것이다. 하지만 블록체인 상황에서 앨리스는 팬메일 주소를 보내기 위해 돈을 지불해야 하는 불행한 부작용도 있다. 블록체인 수수료는 우편 요금과 약간 비슷하다. + +![발송인은 이미 자기 자신에게 게시된 반송용 봉투를 포함한다].png) + +### Exercises + +앨리스는 팬들이 그녀에게 팬메일 주소를 요청하도록 함으로써 우편 요금을 절약할 수 있다. 그리고 나서 그들은 거래 비용을 지불해야 할 것이다. 우표를 붙여서 반송용 봉투를 보내는 것 같아. + +그녀가 밥이 필요로 하는 주소를 얻을 수 있도록 앨리스의 코드를 완성해라. + +정답: +[판메일Ask.rho](판메일Ask.rho) + + +예리한 독자들은 이제 이브가 팬메일 주소를 요청하는 메시지를 가로챌 수 있다는 것을 알게 될 것이다. 관찰력이 좋다. 보너스 연습으로 당신은 이브의 새로운 코드를 쓸 수 있다. (힌트: 이전 코드와 동일) 이 문제에 대한 해결책은 공개 키 암호화와 등록부를 포함한다. 우리는 나중에 그것에 대해 배울 것이다. + +### Exercises +2과에서 우리 피자 가게는 앨리스와 비슷한 문제를 가지고 있었다. 그들이 새로운 고객을 쉽게 인수할 수 있도록 그 코드를 다시 만드세요. + +## Jackpot + +포수 한 명이 공을 던져서 잡아낸다.png) + +나는 어렸을 때 잭팟이라는 게임을 하곤 했다. 한 선수가 공을 던지고 숫자를 외쳤다. 다른 선수들은 모두 공을 잡으려고 할 것이고, 공을 잡은 사람은 그 수의 점수를 받을 것이다. + +대박을 터뜨리는 것은 팬레터를 보내는 것과 정반대다. 이전에 많은 팬들이 한 명의 연예인에게 보내왔다. 이제 던지는 사람이 한 명 있는데 많은 받는 사람 중 한 명에게 + +[jackpot.rho]rho) + +누가 잭팟 코드에서 공을 잡을 것인가? +- [ ] 빌이 함정이 먼저니까. +그의 캐치 코드는 던 코드와 가장 가깝기 때문에 [ ] 빌. +- [ ] 페이지 마지막 캐치 코드라서. +- 우리는 모른다; 확실하지 않다. + + +### Exercise +운동: stdoutAck를 사용하여 각 사람이 공을 잡을 때 실제로 얼마나 많은 점수를 얻는지 표시하십시오. + + + + +Rholang에서의 이 게임은 한 공을 반복적으로 던지는 실제 게임과는 어떻게 다른가? +- [ ] 매우 정확한 시뮬레이션 +- [x] Rholang에서는 모든 공이 동시에 던져지고 순서대로 잡힌다. +- [ ] Rholang에서 볼은 던져지는 것과 반대로 잡힌다. +- 홀랑빌에서 모든 걸 낚아채면, 페이지도 모든 걸 낚아챈다. + +## Side bar: String +대부분의 프로그래밍 언어는 당신이 두 개의 문자열을 함께 결합하거나 "상호화"할 수 있도록 해주며, rholang도 예외가 아니다. 우리는 'stdout'할 수 있다.("안녕"++ "세계") 그러나 우리는 int와 문자열을 연결할 수 없다. + +stdoutAk와 send certifications를 사용하는 것도 한 방법이다. 또 다른 옵션은 stdout 목록을 인쇄하는 것이다.("빌) 득점은 ", * 포인트"이다. 우리는 향후 수업에서 두 가지 기술에 대해 더 자세히 살펴볼 것이다. + +마지막 옵션은 문자열 보간법을 사용하는 것이다. 문자열 보간법은 당신이 자리 표시자를 당신의 문자열에 넣고 지도를 사용하여 실제 값으로 대체할 수 있도록 해준다. + +[interpolation.rho] (interpolation).rho) + +당신은 어떻게 데이터 구조에 대한 12과에서 설정되는 지도가 무엇인지 더 배울 수 있다. + +## Imposter throws + +누구든지 따라와 가짜 공을 던짐으로써 이 게임을 망칠 수 있다는 것을 주목하라. 이것은 이브가 다가와 앨리스의 팬메일을 훔치는 것과 정반대되는 것이다. + +100점짜리 가짜 공을 던지기 위해 이브는 어떤 코드를 사용해야 할까? +- (임포스터 <- 던짐){임포스터에 대해 [ ]!(100)} +- 던지기!(100) +- [ ] @"throw"!("100") + + +우리는 이 문제를 대중들이 던지는 채널에서만 읽을 수 있고, 그것에 글을 쓰는 것이 아니라는 것을 확실히 함으로써 해결한다. + +[잭팟플리쉬.rho](잭팟플리쉬.rho) + +이전처럼, 이 코드는 게임 진행자에게서 받은 모든 사람에게 돈을 지불하도록 요구한다. 그것은 리팩터링 되어 있어서 선수들은 우리가 앨리스와 그녀의 팬메일에서 했던 것처럼 그 게임에 가입해야만 한다. + +## 공개 키 암호화 + +[이 보따리는 블록체인 세계에서는 봉인되어 있으나, 외부에서는 누구나 완전히 개봉할 수 있다. 블록체인 내에서 데이터가 제한을 벗어났다고 해서 그것이 정말로 사적인 것이 아니라는 것을 기억하라.](개인 이름).png) + +어떤 면에서 읽기 전용 번들은 [public-key cryptography](https://en.wikipedia.org/wiki/Public-key_cryptography).의 서명 기능을 중복한다. 여기에 있는 잭팟캐쳐들은 공이 투어에서 온 것이라고 확신한다. 왜냐하면 그는 오직 암호화 서명과 같은 던지기 채널에서만 보낼 수 있기 때문이다. + +어떤 면에서 쓰기 전용 번들은 공개 키 암호화의 암호화 기능을 복제한다. 오직 앨리스만이 그녀의 팬 메일 채널로 보낸 메시지를 받을 수 있다. **매우 중요한 차이점**은(는) 여기에 전송된 메시지가 블록체인 외부에서 100% 볼 수 있다는 것이다. 그래서 쓰기만 하는 번들이 용서할 수 없는 이름들을 전달하는 효과적인 방법이기는 하지만, 그들은 음모를 꾸미거나 정부의 감시를 피하는 좋은 방법이 아니다. **조심해!** + +## More About Bundles + +읽기 전용 번들과 쓰기 전용 번들에 더하여, 두 가지 다른 유형들이 또한 유용하다. + +| 읽을 수 있다 | 쓸 수 있다. +| ------ | -------- | --------- | +| 번들- {proc} | 예스 | 노 | +| 버들+ {proc} | 아니오 | 예스 | +| 버들0 {proc} | 노 | 노 | +| 버들 {proc} | 예스 | 예스 | + +당신은 당신이 보내거나 받을 수 없는 묶음이 왜 유용한지 궁금할 것이다. 우리가 지금까지 배운 것을 고려해 볼 때, 그것은 멋진 질문이다. 다음 유닛에서 패턴 매칭에 대해 논의할 때, 번들이 읽기 및 쓰기 기능을 제한하는 것 이상을 수행하는 것을 볼 수 있다. 그들은 또한 내부를 보기 위해 합성 이름을 분리하는 것을 막는다. \ No newline at end of file diff --git a/08-StateChannelsAndMethods/README_KR.md b/08-StateChannelsAndMethods/README_KR.md new file mode 100644 index 0000000..6bf0718 --- /dev/null +++ b/08-StateChannelsAndMethods/README_KR.md @@ -0,0 +1,126 @@ +# State Channels + +## Holding on to data + +![가변은 2015년이다]. 이제는 모두 주(州)의 통로에 관한 겁니다] (변수).png) + +지금쯤이면 당신은 투플스페이스로 데이터를 보내는 것과 투플스페이스에서 데이터를 받는 것에 능숙할 것이다. 그러나 당신이 컴퓨터를 할 때마다, 당신은 때때로 나중에 사용하기 위해 데이터를 따로 남겨둘 필요가 있다. 거의 모든 프로그래밍 언어는 변수 개념을 가지고 있다. + +Rholang이 독특한 또 다른 방법은 전통적인 변수가 없다는 것이다. 대신, 우리는 데이터를 저장하기 위해 투플스페이스를 사용할 수 있다. 나중에 어떤 것을 예약하고 싶을 때마다, 그것을 어떤 채널로 보내고 나중에 다시 받아. 이러한 방식으로 사용되는 채널은 "주요 채널"이라고 하며, 이름 끝에 "Ch"가 있는 경우가 많다. + +[box.rho](box.rho) + + +어떤 데이터가 '@angerPublicChannel'으로 보내지는가. +- [ ] 0 +- [ ] 상자 +- [x] 42 +- [ ] 비어 있음 + + +BoxCh 상태 채널에 어떤 데이터가 남아 있는가? +- [ ] 0 +- [ ] @"일부PublicBox" +- [ ] 42 +- [x] 비어 있음 + + +## Persisting Data +만약 우리가 그 상자를 다시 확인한다면, 우리는 결과를 얻지 못할 것이다. 왜냐하면 우리가 일단 메시지를 받으면, 그것은 투플스페이스로부터 소비되기 때문이다. 우리는 끈질긴 송신과 엿보기 수업에서 그 해결책에 대해 간단히 토론했다. + +[listentBox.rho](pertentBox.rho) + +어떤 데이터가 '@angerPublicChannel'으로 보내지는가. +- [ ] 0 +- [ ] 상자 +- [x] 42 +- [ ] 비어 있음 + + +BoxCh 상태 채널에 어떤 데이터가 남아 있는가? +- [ ] 0 +- [ ] @"일부PublicBox" +- [x] 42 +- [ ] 비어 있음 + + +## Patience Game Revisited +몇 가지 교훈으로 우리는 각 참가자들이 계약서에 메시지를 보내는 마지막이 되기를 바라는 인내 게임에 대해 토론했다. 우리는 그 당시 몇 가지 문제가 있었다. 왜냐하면 우리는 그 경기의 결과가 산출될 것이라고 보장할 수 없었기 때문이다. + +잠시 시간을 내어 우리가 가졌던 문제를 상기시켜라. 우리는 주 채널로 이 문제를 제대로 해결할 수 있다. + +[patient.rho] (환자.rho) + +위의 코드는 각 블록이 한 번 호출되는 문제를 어떻게 피하는가? +- [ ] 플레이어 1이 상단 블록을 사용하도록 강제 적용 +- [x] 처음 통화 후 activeCh가 비어 있기 때문에 +- [ ] 상태 채널이 사물을 순차적으로 만들기 때문에 + +## Objects and Methods +![이 클릭카운터는 증가하고 재설정할 수 있다].(클릭카운터).png) + +자바와 같은 "객체 지향 프로그래밍" 언어에서는 데이터를 사용하거나 변경하는 방법과 함께 일부 데이터를 캡슐화하여 실제 개체를 모델링할 수 있다. 같은 것이 Rholang에서도 가능하다. + +이 예에서는 기본 클릭 카운터를 나타내는 개체를 만들 것이다. 재료는 다음과 같다. +* 상태 채널: currentCount +* 방법: 증가, 재설정 + +[카운터.rho]rho) + +### Exercises +내가 그것을 확인할 때마다 카운터 값을 수동으로 바꾸는 것은 불편하다. 대신에 우리는 그것에 대한 방법을 가지고 있어야 한다. + + + + +### Exercises +이제 카운터를 더 쉽고 안전하게 점검할 수 있게 되었으니, 모든 방법을 실제로 점검하는 더 나은 테스트를 써봅시다. + + + +## Factories +만약 당신이 자바와 같은 다른 언어로 프로그램 했다면 당신은 건설업자들을 잘 알고 있을 것이다. 만약 여러분이 자바에서 프로그램을 짜보지 않았다면, 그것은 훌륭하다. 왜냐하면 Rholang은 공장을 건설자 보다는 새로운 물체를 만들기 위해 사용하기 때문이다. + +카운터는 Rholang의 유용한 구조로서, 당신이 당신의 프로젝트에서 그것을 사용한다는 것을 발견할 것이다. 문제는 많은 프로젝트들이 카운터를 사용하고 싶어할 수도 있고, 하나만을 갖는 것은 불충분하다는 것이다. 그래서 해결책은 카운터를 만드는 공장 계약을 만드는 것이다. 공장 계약서가 요청되면, 그것은 완전히 새로운 카운터를 다시 보낸다. + +[counterFactory.rho] (counterFactory).rho) + +사용자는 새 카운터를 얻기 위해 공장을 어떻게 부를 것인가? +- [ ] "카운터 팩토리!(*ack)' +- [ ] "카운터 팩토리!(0, *ack)" +- [ ] @"counterFactory()". +- [x] counterFactory!(MyIncrease, myReset)". + +위에 표시된 대로 만든 후 사용자가 카운터를 재설정하는 방법. +마이 인스!(*ack)' +- [x] 'myReset'!(*ack)' +- [ ] "카운터 팩토리!(MyReset, *ack)" +- [ ] "카운터 팩토리!(마이셋) + + + +## Method Dispatching +방법을 사용할 수 있게 하는 데는 두 가지 기본적인 기술이 있다. 각 방법이 고유의 전용 채널에서 듣기 때문에 내가 "권력의 분리"라고 부르는 첫 번째 옵션. + +또 다른 옵션은 제어판이라고 불리는 용서할 수 없는 이름이 하나 있고 모든 방법이 그 위에 만들어지는 "제어판" 기법이다. + +``` +// 권력 분리 +계약 공장(method1, method2) = { + 계약 방법1(ack) = { ... } + 계약 방법2(ack) = { ... } +} + +// 제어판 +공장(패널) = { + @[canpanel, "method1"(ack) = { ... } + @[canpanel, "method2"(ack) = { ... } +} +``` + +카운터 예시에서는 어떤 기법을 사용하여 방법을 사용했는가? +- [x] 권력 분리 +- [ ] 제어판 + +### Exercises +다른 메서드 디스패치 기술을 사용하려면 카운터 예를 변환하십시오. 너도 시험을 전환해야 한다. \ No newline at end of file diff --git a/09-ObjectCapabilities/README_KR.md b/09-ObjectCapabilities/README_KR.md new file mode 100644 index 0000000..a66bf90 --- /dev/null +++ b/09-ObjectCapabilities/README_KR.md @@ -0,0 +1,86 @@ +# Object Capabilities + +최근에 우리는 용서할 수 없는 이름들이 그 이름을 아는 사람들에게 채널의 사용을 얼마나 제한할 수 있는지를 배웠다. 또한 상태 채널을 사용하여 데이터를 저장하고 캡슐화된 데이터를 수정하는 방법을 사용할 수 있는 방법도 확인하였다. 이 수업에서 우리는 용서할 수 없는 이름에 놓여진 방법들이 어떻게 "객체 능력"이라고 알려진 엄청나게 유용한 디자인 패턴으로 이어지게 되는지 볼 것이다. + +![차량을 잃지 않아서 다행이야, 그 냉동고 안에 있는 차 열쇠 말이야] (키즈.png) + +물체 능력의 일례는 집이나 자동차의 열쇠다. 물건을 소유하는 것은 당신에게 집에 들어가거나 차를 시동할 수 있는 능력을 준다. 당신은 또한 다른 사람에게 열쇠나 열쇠의 복사본을 줌으로써 위임할 수 있는 능력을 가지고 있다. + +이 수업에서는 상태 채널과 객체 기능을 사용하는 몇 가지 예시 프로젝트를 만들 것이다. 우리는 데이터를 읽고 쓰는 것과 같은 권한을 부여하기 위해 번들보다 객체 기능이 더 일반적으로 사용될 수 있다는 것을 볼 수 있을 뿐만 아니라, 카운터를 재설정하거나 페이스북 계정을 삭제하는 것과 같은 더 추상적 기능도 사용할 수 있다는 것을 알게 될 것이다. + +## ATC Revisited +4과목의 항공 교통 관제 예제를 다시 살펴보자. 이전에 관제사들은 반복적으로 송신함으로써 날씨와 활주로 정보를 방송할 수 있었다. 그러나 그들은 정보를 갱신할 수 없었다. 그리고 우리 모두는 날씨가 예측할 수 없이 변할 수 있다는 것을 안다. 따라서 이 예에서는 현재 정보를 상태 채널에 저장하고, 관제사에게 필요에 따라 업데이트를 할 수 있는 기능을 제공할 것이다. + +[atc.rho](atc.rho) + +역내 튜닝에 읽기 전용 번들을 사용하는 것은 당연해 보인다. 그러나, 만약 우리가 번들을 사용한다면, 그 메시지를 가장 먼저 듣는 사람이 그것을 주 채널로부터 소비할 것이다. 그것은 다른 조종사들이 받을 수 있도록 남겨두지 않을 것이다. 메시지가 우리가 원하는 대로 유지되도록 하기 위해, 우리는 주 채널에 대한 모든 접근을 우리 스스로 처리하고, 조종사에게 정확한 메시지를 질문할 수 있는 능력을 준다. + +ATC는 어떻게 정보를 업데이트하는가? +- 셋!("강력한 역풍, 주의)"" +- [ ] '("강력한 역풍, 주의)"" +- [ ] "getInfo!"("강력한 역풍, 주의)"" +- [ ] "stationFactory.setInfo!("강력한 역풍, 주의)"" + +### Exercise +ATC가 성공적으로 상태를 업데이트할 수 있고 조종사가 할 수 없는지를 확인하기 위해 보다 철저한 테스트를 작성하십시오. + +## Savings Account +이 예에서 우리는 rholang에 있는 간단한 저축예금계좌를 모델링하는 코드를 쓸 것이다. 그것은 예금, 인출, 수속을 할 것이다. + +우리 카운터와 달리 저축예금은 안전해야 한다. 우리는 우리의 균형을 아는 사람만, 더 나쁜 것은 그것을 철회하는 것을 원하지 않는다. + +여기 고려해야 할 몇 가지 출발 코드가 있다. +[savingsStarter.rho] (SavingsStarter).rho) + +### Exercise +계정에 남아 있는 방법을 입력하십시오. + +어떤 계약이 공장으로서의 역할을 하는가? +- [ ] '체크' +- [ ] '끌기' +- [ ] '입금' +- [x] 'openAccount' + +우리의 현재 저축 계좌는 마이너스 잔고를 허용하지만, 아마 그렇게 하지 않을 것이다. 네가 그 문제를 어떻게 풀려고 할지 생각해봐. 우리는 다음 수업에서 그것을 할 수 있는 적절한 방법을 배울 것이다. + +## Stealing Funds +이브가 새라의 돈을 훔치기 위해 패러디해야 할 코드를 쓰도록 노력해라. 넌 아무 것도 생각할 수 없을 거야. 그것은 오직 사라만이 계정을 통제하는 용서할 수 없는 이름들에 접근할 수 있기 때문이다. + + +사라가 그녀의 친구 스테파니가 수표나 인출은 하지 않고 은행 계좌에 입금하기를 원한다면 어떤 코드를 실행해야 할까? +스테파니!(*sarahWithgraft)" +- [x] '(*사라입금) +- [ ] '사랑도 없이!("활성화", *스텝해니") +- [ ] '개방 계정'(10, *sarahDeposit, @"sarahWithtraw", @"sarahCheck")". + + +## Two Kinds of Factories +지금까지 우리의 모든 공장 방식은 계약을 맺기 위해 이름을 붙이도록 요구되어 왔다. 예컨대 저축예금 계좌에서 그 이름들은 체크 예금 인출이었다. 나는 이것을 "BYOC" 또는 "자신의 채널 확보" 공장이라고 부른다. BYOC 기술은 사용자가 다른 계약 또는 공용 이름에서 얻은 이름을 포함하여 자신이 좋아하는 이름을 제공할 수 있다는 장점이 있다. + +또 다른 기법은 공장에 필요한 용서할 수 없는 이름을 만들어 발신자에게 다시 보내는 것이다. 나는 이것을 "완전한 서비스" 공장이라고 부른다. 만약 당신이 임의의 이름들을 전달하는 융통성을 필요로 하지 않는다면, 전체 서비스 공장은 종종 덜 번거롭다. + +### Exercise +저축예금을 byoc factory에서 full service factory로 전환한다. + +당신이 저축예금을 환전했으니 사라가 여전히 그녀의 예금 능력을 공개하는 것이 가능한가? +- [ ] 아니오. 더 이상 공적인 이름을 사용할 수 없음 +- [ ] 아니, 그녀는 그렇게 할 수 없어. +- 네 - 새 기능을 직접 공개하기만 하면 돼 +- [ ] 예; 예, 이전처럼 + + +## Abortable Rocket Launch +우리가 처음 합류 운영자를 배웠을 때, 우리는 두 운영자가 로켓을 발사하기 위해 허가를 내야만 하는 시나리오를 고려했다. 우리는 그들이 허가를 철회할 수 있기를 원했다. + +이 문제는 사용자가 실행 명령을 내릴 때 중단 버튼을 눌러 해결할 수 있다. + +[AbortableLaunch.rho](AbortableLaunch.rho) + +### Exercise +Bob의 출시 논리 및 통합 테스트를 통해 위의 코드를 완성하십시오. + +## Design Patterns +많은 일반적인 객체 공정 능력 설계 패턴이 있다. 그 중 많은 부분이 [안전한 협력의 그림책](http://erights.org/talks/efun/SecurityPictureBook.pdf)에 설명되어 있다. + +### Exercise +우리는 다음 예들을 통해 이러한 패턴들 중 많은 것을 접하게 될 것이다. 그러나 나는 당신이 한 두 가지 패턴을 지금 당장 홀랑에서 실행할 것을 권고한다. \ No newline at end of file diff --git a/10-MoreSyntax/README_KR.md b/10-MoreSyntax/README_KR.md new file mode 100644 index 0000000..0bca2dd --- /dev/null +++ b/10-MoreSyntax/README_KR.md @@ -0,0 +1,122 @@ +# More Syntax + +지금쯤이면 당신은 이미 몇 개의 실제 프로젝트를 만들 수 있을 것이다. 그리고 너는 그것을 해야 해! 다음 단원에 들어가기 전에 좀 더 실용적인 구문을 배워보고 다음 킬러 랩을 만드는 데 필요한 실제 도구를 알아봅시다. + +## Binary Operators +첫 번째 새로운 구문은 몇몇 이진법인이 될 것이다. 바이너리 연산자는 두 개의 연산자를 가지는데, 이것이 바로 그들이 bi_nary라고 불리는 이유다. 이것들은 대부분 산수를 위한 것이다. 이 예들을 생각해 보아라. + +[산술.rho](산술.rho) + +### Exercise +'f2c' 계약을 이행할 차례. 동일한 두 테스트 사례를 역순으로 사용하여 올바른 결과를 얻었는지 확인할 수 있다. + +여러분이 알아야 할 마지막 이진법 연산자는 더 큰 것을 만들기 위해 두 개의 작은 것을 연결하거나 "catenation"에 사용하는 "+"이다. 운영자는 우리가 이미 알고 있는 줄뿐만 아니라 다음 단원에서 배울 목록들을 위해 일한다. + +[더 좋은.rho]rho) + +코드 'stdout'은?("I"++"<3"++ "rholang")의 출력물? +- [ ] I < 3 Rholang +- [ ] ["I", "<3", "rholang"] +- [x] I < 3rholang +- [ ] I++<3++rholang + + + +## Receiving Processes? + +우리는 항상 ____을(를) 보내고 ________을(를) 받는다. +- [x] 프로세스, 이름 +- [ ] 프로세스, 프로세스 +- [ ] 이름, 이름 +- [ ] 이름, 프로세스 +- [ ] 해당 제한 없음 + + + +그건 지난 호에서 온 멋진 재교육일 뿐이야. 네 기억이 이렇게 오래 지속되길 바래. 만약 당신이 당신만의 홀로그램 코드를 쓰고 있었다면, 당신은 당신이 그 모든 '*'를 타이핑할 필요가 없도록 직접 과정을 받을 수 있기를 진정으로 바랬다는 것을 알게 되었을지도 모른다. 이것은 흔한 상황이고, 운 좋게도 Rholang은 좋은 해결책을 가지고 있다. 항상 이름을 받아야 하지만 @myValue와 같은 이름 구문에 붙일 수 있다. @myValue는 이름이기 때문에 myValue는 과정이어야 한다. + +이 구문은 우리가 +(@번호<- an chan){double!(2 * 숫자)}`` + +24라는 숫자를 더블에 남기기 위해 어떤 코드를 이전 코드와 일치시킬 수 있을까. +- [ ] @번호!(12) +- some!(12) +- [ ] @번호!(24) +- 두 배로!(48) + +### Exercise +3과에서 전화 게임을 다시 한 번 보고, @message 패턴을 사용할 수 있었다는 것을 보여주어 '메시지'가 하나의 과정임을 알게 된다. + +...을 대체해야 할 것은 무엇인가 (@x <- @y){stdout!(...)}에서 프로그램을 유효하게? +- [ ] @x +- [x] x +- [ ] '*x' + +## Ifs and Conditions +거의 모든 프로그래밍 언어에서 프로그램의 동작은 어떤 상태에 따라 달라질 수 있다. 예를 들어 나는 아웃이 좋다면 산책로를 달리지만 비가 오더라도 계속 길을 고수한다. Rholang에서 구문은 그것을 하는 것이다. + +``` +if ( /* 조건 */ ) { + Nil // 조건이 참인 경우 이 작업 수행 +} +다른 { + Nil // 조건이 거짓인 경우 이 작업 수행 +}` +``` + +'if'를 사용할 상황은 한계가 없고, 비밀 단어를 정확하게 추측하고, 비디오 게임에서 높은 점수를 매기고, 어느 포커 손이 더 높은지 판단하고, 당선자를 계산하는 것도 포함된다. 이 예제 계약은 당신이 은행계좌의 상태를 어떻게 확인할 수 있는지를 보여준다. + +[SignTest.rho](SignTest.rho) + +### Exercise +회계 프로그램에 문제가 있다. 그것은 잔액이 0인 계좌가 초과 인출되었다고 말한다. 하지만 정말로 0은 좋은 상태에 있어야 한다. 이 문제는 '보다 크거나 동등하다'라는 연산자를 이용해 해결할 수 있다. 몇 가지 테스트를 추가하여 제대로 작동하는지 확인하십시오. + + +## Comparison Operators +이제 'if'/'else' 구조의 사용법을 알게 되었으므로, 원하는 대로 사용할 수 있는 훌륭한 비교 연산자가 많이 있다. +* a > b가 b보다 큰가? +* a < b>가 b보다 작나? +* a = b는 b와 같은가? +* a <= b는 b보다 작거나 같은가? +* a >= b는 b보다 크거나 같은가? +* a !=b'는 b와 불평등인가? + +이 연산자들은 숫자와 텍스트 줄 양쪽에서 일한다. 텍스트 문자열은 사전순으로 정렬되며 알파벳 순으로 정렬되어 있다. 하지만 조심하세요! 한 숫자를 문자열과 비교하려고 하면, 그것은 단지 또 다른 정지된 과정이 될 것이다. + +다음 중 어느 것이 사실인가? +- [ ] 4 < 3 +- [ ] "b" < "a" +- [x] 5 <= 6 +- [ ] "안녕!"= "안녕" + +### Exercise + +사용자가 자신의 이름을 보내야 하는 rholang 프로그램을 작성한다. 대부분의 경우 계약은 단순히 "안녕하세요"로 대답하지만, 만약 그들의 이름이 당신의 이름과 같다면 그들에게 그렇게 말할 것이다. + +## Boolean Operators +Rholang은 또한 전형적인 부울 연산자와 AND, OR 그리고 NOT를 가지고 있다. 구문은 + +* a와 b가 모두 진실일 때 a와 b가 진실 +* 'a' 또는 'b'가 진실일 때 'a 또는 b' true +* 'a'가 거짓일 경우 'not't true + +무슨 일이 일어날까!(진실하고 진실한) 생산량? +- [x] 참 +- [ ] false +- [ ] 둘 다, 잘못된 구문 + +무슨 일이 일어날까!(사실이 아님) 출력? +- [ ] 참 +- [x] 거짓 +- [ ] 둘 다, 잘못된 구문 + +무슨 일이 일어날까!(잘못된) 또는 거짓의 출력? +- [x] 참 +- [ ] false +- [ ] 둘 다, 잘못된 구문 + +### Exercise +그들이 투표할 자격이 있는지 여부를 전화자에게 알려주는 계약을 작성하라. 투표를 하기 위해서는 특정한 나이와 특정 국가의 사람이 되어야 한다. 나이와 나라를 선택할 수 있다. 그 계약을 이용하기 위해서 나는 'canIVote'를 택할 것이다.("니게리아", 30") + +### Exercise +위의 계약은 특정 국가에서만 적용된다. 우리가 공장에 대해 배운 것을 이용해서 이러한 자격 검사자들을 많이 만들 수 있다. 체커포토리에서 투표연령이 18세인 캐나다를 위한 새로운 체커를 만들기 위해서!(캐나다체커, "캐나다", 18). 그러면 41세의 에스토니아인은 캐나다에서 '캐나다 체커'로 투표할 수 있는지 여부를 확인할 것이다.("에스토니아", 41). 스포일러 경고: 그는 캐나다에서 투표할 수 없다. \ No newline at end of file diff --git a/11-PatternMatching/README_KR.md b/11-PatternMatching/README_KR.md new file mode 100644 index 0000000..5bc2258 --- /dev/null +++ b/11-PatternMatching/README_KR.md @@ -0,0 +1,122 @@ +# Pattern Matching + +## About Patterns +패턴은 일상생활에서 발생한다. 만약 당신이 이전에 결코 보지 못했던 새로운 차종을 보았다면 그것은 아마도 4개의 바퀴, 2개 또는 4개의 문, 그리고 밖으로 내다볼 수 있는 앞유리에 대한 당신의 정신적인 패턴과 맞기 때문에 그것은 자동차라는 것을 알 것이다. + +비슷하게, 우리는 문장의 패턴을 일치시킬 수 있다. "나는 치즈를 좋아한다"와 "팬더를 좋아한다"는 문장은 모두 "나는 ____"의 패턴과 일치한다. 그러나 "나는 개를 가지고 있다"는 문장과 일치하지 않는다. Rholang은 프로그래머들이 프로그램 실행을 제어하기 위해 패턴 매칭을 사용할 수 있도록 한다. 즉, 공정이 특정 패턴과 일치하는지 여부에 따라 다른 코드가 실행될 수 있다. + +## 경기 구성 +Rholang이 패턴 매칭을 사용하는 가장 분명한 장소는 여기 보이는 것처럼 동작하는 '매치' 구조다. + +[매칭.rho]rho) + +이 코드에서 '패턴매처' 채널에서 접수한 모든 마사지 'x'는 인용된 과정을 나타낸다. 우리는 아래의 여러 패턴과 그 과정을 비교하고 어떤 패턴이 일치하는지 다시 보고한다. 밑줄은 그저 빈칸에 채워져 있고 어떤 패턴과도 잘 어울린다. 그것은 "와일드카드"라고 불리며, 당신은 종종 그것을 "매치" 구조에서 마지막 패턴으로 볼 것이다. + +](lookingForMessagesPatternMatching.png)-> + +'for'나 'contract'로 메시지를 받을 때도 패턴 매칭을 사용할 수 있다. 메시지를 수신하려면 보낸 메시지가 수신될 패턴과 일치해야 한다. 우리는 곧 이 용어의 예를 볼 것이다. + +## 우리가 본 두 사건 +우리는 이미 밑줄을 가끔 사용해 왔다. 예를 들어 나는 종종 work 채널에서 any_ 패턴과 일치하는 메시지를 수신한다는 뜻의 for (_ <-ck)를 쓴다. 메시지를 받았을 때만 메시지를 받았을 때, 그리고 무슨 메시지를 받았는지 신경을 쓸 때 밑줄을 사용하는 것이 일반적인 관행이다. + +우리는 또한 이전 수업에서 프로세스 수신 방법을 배울 때 패턴 매칭을 사용했다. for (@p <- x)를 쓰면 인용된 공정의 패턴과 일치하는 메시지를 수신하고, 인용된 공정을 p에 바인딩한다는 뜻이다. + +변수 p는 x에서 무엇을 묶을 것인가!("안녕") |(@p <- x){Nil}"용 +- [ ] @"hello". +- [x] '헬로' +- [ ] '안녕' +- [ ] `4` + +변수 p는 x에서 무엇을 묶을 것인가!("안녕" | 4) | for (@{"hello" | p} <- x){Nil}". +- [ ] @"hello". +- [ ] "안녕" +- [ ] '안녕' +- [x] '4' + +## Syntactic sugar +야, 통설탕. 이제 곱슬곱슬한 치열교정기로.(설탕).png) +앞에서 배운 'if'/'else' 구조를 완전히 대체하기 위해 패턴 매칭을 사용할 수 있는 것으로 밝혀졌다. 사실 그것이 바로 'if'/'else'가 후드 아래에서 의미하는 것이다. 다른 구문의 경우 속기 때문에 'if'/'else'는 통사당이라고 한다. 다음 코드 조각은 정확히 동일하다. +``` +if (cond) { + // 프로세스 P +} +다른 { + // 프로세스 Q 수행 +} +``` +안으로 +``` +일치 조건 { + True => // 프로세스 P + false => // 프로세스 Q +} +``` + +### Exercise +이전 수업에서 본 'SignTest.rho'의 예를 다시 써서 달콤한 'if'/else 대신 'match'를 사용하십시오. + +위의 첫 번째 시합 예제를 어떻게 다시 써서 'if'/'else'를 사용할 수 있을까? +- [ ] 이전 연습의 역순 +- [ ] if (x = a)로 시작 +- [x] 그 예가 단순한 '참'과 '거짓'보다 더 복잡한 패턴과 일치하기 때문에 가능하지 않다. + + +## 니커 그리스어 +우리 이름을 말하지 않아도 인사할 수 있는 좀 더 나은 사람을 만들어 보자. 여기서 중요한 것은 우리가 똑같은 '더 좋은' 채널에서 청취하는 두 가지 계약을 체결하고 있다는 점이다. +[greet2.rho]rho) + +당신은 아마도 어떻게 각각의 계약이 개별적으로 작용하는지 이해할 수 있을 것이다. 흥미로운 새로운 부분은 Rholang이 메시지가 '더 좋은' 채널에 전달될 때 실제로 어떤 계약을 할지 결정하는 방법이다. 비결은 Rholang이 우리가 보낸 패턴과 일치하는 매개변수를 가진 어떤 계약이든 실행할 것이라는 것이다. 내가 두 개의 변수를 보내면, 두 개의 변수를 갖는 녹색을 더 부르게 될 것이다. 내가 만약 하나의 파라미터만 보내면, 하나의 파라미터만 받는 계약은 호출될 것이다. 앞으로 rholang은 전송된 매개변수의 _유형_에서 일치하는 패턴을 지원할 것이다. + +### Exercise +직사각형의 면적을 계산하는 일련의 계약서를 작성하라. 가장 분명한 경우, 발신자는 길이와 너비를 모두 제공할 것이다. 그러나 사용자는 직사각형의 폭이 정사각형이고 양쪽이 제공된 너비인 단일 너비만 제공할 수 있다. 마지막으로 사용자는 직사각형의 크기가 1x1인 경우 전혀 치수를 제공할 수 없다. + +## 고급 패턴 매칭 +채널 'x'에서 보내는 프로세스가 단일 전송 패턴과 일치할 때에만 줄일 수 있는 for(@{x!(P)} '- y){ Q }'와 같은 패턴 매칭으로 멋진 일을 할 수 있다. 그런 다음 Q 프로세스에서는 변수 x, 채널, P를 바인딩하여 전송 중인 프로세스를 + +[SendASend.rho](SendASend.rho) + +윌x!("안녕" | ("안녕") | "세계"}<- x){Nil}"이(가) 통신 이벤트를 발생시키는가? +- [ ] 예, 송신과 수신이 같은 채널에 있기 때문에 +- [ ] 예, 송신과 수신이 같은 채널에 있고 패턴이 일치하므로 +- 송신과 수신이 서로 다른 채널에 있기 때문에 [ ] No +- [x] 송신과 수신이 동일한 채널에 있지만 패턴이 일치하지 않기 때문에 [x + +## Unions and Intersections + +두 패턴 중 하나를 일치시키고 싶거나 두 패턴을 모두 일치시키고 싶을 때가 있을 수 있다. 이 수술들은 우리가 지난 수업에서 논의했던 부울스와 비슷하게 느껴지지만, 우리는 패턴 매칭 시 다른 연산자를 사용한다. + +여러 패턴 중 하나를 일치시키려면 "유니언" 연산자 "\/"를 사용하십시오. + +[유니온.rho] (유니언)rho) + +두 가지 패턴을 모두 맞추려면 '교차' 연산자/\를 사용하십시오. 이 예에서 우리는 등록 데이터가 유효한지 검증하고 있다. 등록자는 자신의 이름과 나이를 제공해야 하며, 추가 자료를 제공할 수 있다. 그런데, 키 값 데이터를 저장하는 이 기법은 종종 "RHOCore"라고 알려져 있다. + +[교차.rho]rho) + +### Exercise +여기 노조의 사례는 꽤 기본적이다. 더 많은 언어와 단어와 일치할 수 있도록 확장하십시오. 또한 기본 패턴만 일치할 때 어떤 일이 일어나는지 보여주는 테스트를 작성한다. + +이 절에서 논한 논리 연계는 본 자습서의 범위를 벗어나는 바인딩과 관련된 몇 가지 미묘한 행동을 가지고 있다. 나는 당신이 예제 프로그램으로 실험할 것을 권하고, 그것이 사용 가능해지면, Rholang 설명서를 참조하라. + +## 번들에 대한 추가 정보 +몇 가지 교훈은 읽기 전용 또는 쓰기 전용 채널을 만들기 위해 번들을 사용할 수 있는 방법에 대해 논의한 것이었습니다. 하지만 우리는 아직 그들의 이름있는 특징에 대해 논의하지 않았다. 번들은 패턴 매칭으로 분리되지 않도록 복합 이름들을 "분쇄"하기 위해 사용될 수 있다. + +이 예제 코드에서 군대는 미사일을 가지고 있고 그들은 용서할 수 없는 이름으로 능력을 쌓음으로써 미사일 발사를 통제한다. 외교 관계 때문에, 군대는 국민들이 미사일의 안전을 위해 사찰을 할 수 있도록 허용할 것이지만, 확실히 그것을 발사하지는 않을 것이다. + +[missileUnsafe.rho] (missileUnsafe).rho) + +### Exercise +군대는 여기서 끔찍한 실수를 저질렀고 누구든지 그들의 미사일을 발사할 수 있다. 외부가 이 미사일을 발사할 수 있는 방법을 생각해 봐. + +답변: +[missileAttack.rho] (missileAttack).rho) + +이 문제를 해결하기 위해 군대는 패턴 매칭으로 분리되지 않도록 혼합 이름의 번들로 된 버전을 제공한다. + +[missileSafe.rho](missileSafe.rho) + +안전 코드에서 공격이 실행될 때 출력되는 항목은? +- [ ] "시작하는 중..." +- [ ] "검토 중..." +- [ ] "실행 실패"." +- [x] 없음 \ No newline at end of file diff --git a/12-DataStructures/README_KR.md b/12-DataStructures/README_KR.md new file mode 100644 index 0000000..c756740 --- /dev/null +++ b/12-DataStructures/README_KR.md @@ -0,0 +1,167 @@ +# 데이터 구조 + +프로그램이 실제 데이터를 처리하고 저장하는 것이 일반적이다. 그리고 당신이 많은 데이터를 가지고 있을 때마다, 당신이 필요한 정보를 빨리 찾을 수 있도록 그것을 정리하는 것이 중요하다. 아날로그 세계에서는 종이파일을 쌓고, 폴더에 넣고, 파일 캐비닛에 넣어 정리한다. 프로그래밍에는 동일한 개념이 적용되며, rholang도 예외는 아니다(한 번!). + +데이터 구조를 한 번도 본 적이 없는 경우 다른 참조 자료를 참조하고 추가 예제 코드를 확인하십시오. + +## 문자열 방법 +친숙한 아이디어부터 시작합시다. 우리는 첫 번째 수업에서 바로 첫 번째 프로그램부터 현악기들을 보아왔다. 사실 문자열은 많은 문자를 정리하는 좋은 방법일 뿐이고, 그것이 그들을 데이터 구조로 만든다. 모든 데이터 구조와 마찬가지로 문자열에는 사용자가 수행할 수 있는 "방법"이 있다. + +문자열의 길이 방법은 문자열에 몇 개의 문자가 있는지 알려준다. 슬라이스 방식은 각 엔드에서 몇 개의 문자를 잘라낸 새로운 문자열을 만든다. 스트링스는 '+' 연산자도 지원한다. +[wordLength.rho](wordLength).rho) + +헬로 월드(Hello World)의 결과는? +- [ ] 2 +- [ ] 10 +- [x] 11 +- [ ] 정의되지 않음 +- [ ] "안녕" + +다음 중 "안녕"에게 평가되는 것은? +- [x] "안녕하세요 세계" 슬라이스(1, 5). +- [ ]"헬로 월드".슬라이스(0, 5)" +- [ ]"헬로 월드"슬라이스(1, 4)" +- [ ]"헬로 월드"슬라이스(3, 6)" + +문자열에는 유효한 16진수 숫자를 포함하는 문자열에서 작동하도록 설계된 헥스토바이트(hexToBytes) 방법도 있다. 그것은 그 16진수로 표현되는 바이트 배열을 제공한다. "1241243e."hexToBytes()를 실행하십시오. + + +프로 팁: 바이트 배열을 슬라이싱할 수도 있다. 그것을 직접 실험해 봐. + + + +## Tuples +두 발음이 모두 맞으며, 두 발음이 모두 정확하다. 당신은 전에 계약 c(x, y, z) = { Nil }과 같은 여러 가지 주장을 하는 계약을 작성할 때 튜플을 본 적이 있다. 투플에 있는 품목의 수는 그것의 적자로 알려져 있다. 따라서 계약서 c에 의해 접수된 두 가지는 arity 3이다. + +투구에는 몇 개의 데이터가 포함되어 있다. **순서**. 그들은 항상 고정된 경작지이고, 비교적 적은 방법을 가지고 있다. 따라서 그것들은 가장 흥미로운 데이터 구조지만 동시에 가장 근본적인 것이다. 튜플이 제공하는 몇 가지 방법을 살펴보자. + +[tuple.rho][tuple.ro]rho) + +[3,4,9,Nil]의 장점은? +- [ ] 3 +- [x] 4 +- [ ] 9 +- [ ] Nil + +("a", "b", "c"는 무엇인가?nth(3)의 평가 대상은? +- [ ] 3 +- [x] 오류 +- [ ] "c" +- [ ] ("a", "b", "c") + +### Exercise +4쌍을 가지고 요소 0과 3을 화면에 인쇄하는 프로그램을 작성하시오. + + +## 목록 +리스트는 투구와 비슷하지만 괄호 대신 대괄호로 만들어진다. 더 많은 방법이 있고, 끈처럼 '+' 연산자를 이용해 서로 연결하거나 붙일 수 있다. 여기 모든 목록 방법의 예가 있다. + +[list.rho](list.rho) + +### Exercise +다음 실행 로그 계약 본문을 실행하십시오. 사용자는 자신이 달리던 거리를 통과할 때마다 계약을 요청할 것이다. 그 계약서는 목록에 있는 모든 기록을 남길 것이다. 또한 모든 실행 데이터를 가져오거나 사용자가 실행한 총 거리를 얻기 위한 방법을 작성할 수 있다. + +```rholang +새 로그실행, {에서 Chr 실행 + + // 시작할 실행 없음 + 뛰어!([])| + + 계약 로그실행(거리) = { + // 여기 코드 + } +} +``` + +## 세트 + +세트는 어떤 면에서 목록과 비슷하지만, 한가지 큰 차이점은 세트 **이 주문되지 않았다는 것이다. 세트는 프로세스의 모음이지만 세트에 첫 번째 또는 마지막 항목이 없다. 세트에는 **복제**가 허용되지 않는다. 몇 가지 세트 방법을 살펴봅시다. + +[set.rho](set.rho) + +회비를 지불하지 않은 모든 클럽 회원들의 집합을 만드는 코드는? +- [x] "AllMember.diff(지급된Member)" +- [ ] "payedMembers.diff(allMembers)" +- [ ] "payedMember.union(모든 구성원)" +- [ ] "payedMembers.contains (AllMembers)" + +설정(1,2,3) = 셋(3,2,1)의 결과는? +- [x] '참' +- [ ] 'false' +- [ ] 구문이 잘못됨 +- [ ] 'Set(2)' + +## 지도 +지도는 세트와 비슷하지만 **키 값 쌍**을(를) 포함하고 있다. 지도 역시 순서가 맞지 않지만, 항목을 추가할 때(현재 키로 알려짐) 관련 값도 추가하십시오. 여기 지도의 모든 방법의 예가 있다. + +[map.rho](map.rho) + +{"년"의 결과는 무엇인가? 1, "주": 52, "일": 365}.get(52) +- [ ]주 +- [ ]년 +- [ ] 52 +- [x] Nil + +Rholang에서 지도의 유용성을 보여주기 위해, 어느 나라의 수도를 찾는 이 계약을 고려해보자. + +[capitalOf.rho](capitalOf.rho) + +## 연습 +위의 예제 코드에서 시작하는 국가 및 자본 퀴즈 게임을 만들어 사용자가 계약을 호출하고 도전국 및 응답 채널로 돌아오게 하십시오. 그러면 사용자는 그 나라의 수도에 대한 최선의 추측을 응답 채널 위로 다시 보내고 그녀가 맞았는지의 여부를 다시 생각해본다. + +멋진 사용자 인터페이스를 사용하여 이 기능을 사용하는 방법에 대한 자세한 내용은 [nthterh]과 같은 몇 가지 dapp 개발 예를 참조하십시오. + +## 연습 +지도의 '차이' 방식은 또 다른 지도를 논쟁거리로 삼는다. diff map에 동일한 키의 일부가 있지만 서로 다른 값이 연관된 경우 예: +``` +{"a": "A", "b": "B", "c": "C"}.diff({"a": 25}) +``` + + +## 방법 요약 표 + +그것은 한번에 데이터 구조에 대한 많은 정보였다. 여기 어떤 방법이 있는지 알려 줄 수 있는 편리한 표가 있다. 이 정보는 또한 [치트시트] (../치트시트)에도 나와 있다. + +Method | Tuple | List | Map | Set +--- | ----- | ----- | ----- | ----- +nth | x | x | | +toByteArray | x | x | x | x +union | | | x | x +diff | | | x | x +add | | | | x +delete | | | x | x +contains | | | x | x +get | | | x | +getOrElse | | | x | +set | | | x | +keys | | | x | +size | | | x | x +length | | x | | +slice | | x | | + + + +## 복합 이름에서 발송 및 수신 +우리는 이 수업에서 몇 가지 흥미로운 데이터 구조에 대해 배웠다. 데이터 구조는 정수, 부울, Nil과 같은 과정이다. 그래서 그들은 인용되고 다른 과정들처럼 이름이 지어질 수 있다. 우리는 다른 이름들처럼 그 이름들로 계약을 맺을 수 있다. 튜플과 같은 데이터 구조에 구축된 이름은 종종 복합 이름이라고 불린다. + +이 예에서, 앨리스와 밥은 각각 용서할 수 없는 이름을 가지고 있다. 키는 자체로도 유용할 수 있지만(snippet에 표시되지 않는 사항의 경우), 함께 사용할 때만 표시된 계약을 호출할 수 있다. 이것은 "우리의 증폭"이라고 알려져 있다. +``` +new alice, bob, key1, key2, stdout(`rho:io:stdout`) in { + + alice!(*key1)| + bob!(*key2)| + + contract @(*key1, *key2)(_) = { + stdout!("Congratulations, Alice and Bob, you've cooperated.") + } +} +``` + + + +`contract @(*self, "getVal")(_) = { Nil }`에서 합성 이름을 만드는 데 사용되는 두 tuple은? +- [ ] `self` +- [ ] `"getval"` +- [x] `(*self, "getVal")` +- [ ] `@(*self, "getVal")` +- [ ] `@"getVal"` \ No newline at end of file diff --git a/13-Iteration/README_KR.md b/13-Iteration/README_KR.md new file mode 100644 index 0000000..edfb329 --- /dev/null +++ b/13-Iteration/README_KR.md @@ -0,0 +1,68 @@ +# Iteration and Recursion +오래된 주제를 검토하고 우리가 이 수업에서 풀고 있는 문제에 동기를 부여하는 몇 가지 연습부터 시작하자. + + +### Exercise +숫자 3, 2, 1의 카운트다운을 화면에 순서대로 출력하는 프로그램을 만드세요. + +### Exercise +이제 5부터 카운트다운. + +### Exercise +1에서 3 사이의 임의의 숫자를 반환하는 계약을 작성하라. +힌트, 당신은 여기서 유리한 조건을 이용할 수 있다. + +### Exercise +이제 1에서 10 사이의 임의의 숫자를 선택하도록 하라. + +이 무작위 숫자 생성기를 쓰는 방법이 지속 가능한가? +- [ ] 예 +- [x] 없음 + + + +## 반복 +반복을 위해 줄리를 그리십시오. + + +반복은 ...의 과정이다. 많은 프로그래밍 언어는 프로그램의 흐름을 제어하는 근본적인 방법으로 반복을 사용한다. 반복은 본질적으로 한 항목 다음에 다음 항목으로 프로세스를 수행하는 것을 의미한다. Rholang은 완전히 동시 프로그래밍 언어이기 때문에 이것은 불가능하다. 하지만 그것은 사실 힘이야! + +``` +수동으로 목록 반복 [1, 2, 3, 4] +``` + +긴 목록이 극도로 깊이 내포되어 있기 때문에 이 과정은 확실히 지속 가능하지 않다. 더 나쁜 것은, 우리가 실제로 쓰는 어떤 코드든 최대 깊이를 가질 수 있다는 겁니다. 그리고 우리는 우리의 목록의 길이를 제한하고 싶지 않다. 이 교묘한 코드를 고려하십시오. + +``` +카운터를 통과하여 목록 길이와 비교하는 간단한 반복 +``` + +``` +패턴 일치를 사용하여 빈 목록을 검색하는 더 나은 버전 +``` + + + + + + + + +## Recursion +도도 줄리는 재귀나 그림 같은 것에 대해 그림을 그리고 있다. + +지도 +여과장치 +썸 리스트 + + +## heading + +### Exercise +최소값과 최대값을 나타내는 두 개의 정수를 포함하는 계약을 작성하라. + +연습: 그룹 포워더. 왕 나, 포워더에게 메시지를 보내서 모든 수신자에게 복사한다. 나는 킬 스위치 대신 단체 가입을 변경할 수 있다. + + + +아이디어: [머리... 꼬리] \ No newline at end of file diff --git a/14-PlayingGames/README_KR.md b/14-PlayingGames/README_KR.md new file mode 100644 index 0000000..651a612 --- /dev/null +++ b/14-PlayingGames/README_KR.md @@ -0,0 +1,25 @@ +# 게임 + +스마트 계약은 게임과 많은 공통점이 있다. 그들은 규칙과 결과를 명확하게 정의했다. 일단 선수들이 경기에 참가하기로 동의하면 그들은 할 수 있는 특정한 움직임을 갖게 된다. 우리가 이미 본 몇몇 예들은 분명히 인내심 게임 같은 게임들이다. 다른 게임들은 그렇게 명백한 게임은 아니지만, 그것들은 게임으로 만들어 질 수 있다. 예를 들어 클릭 카운터는 플레이어가 어떤 순서로든 이동할 수 있고 두 가지 동작을 증분 및 재설정할 수 있는 게임이었다. 인내와 같은 어떤 게임들은 최종 결과를 얻는 반면, 다른 게임들은 카운터처럼 영원히 지속된다. + +많은 실제 세계의 상호 작용들이 게임으로 모델링될 수 있기 때문에, 여기서 몇 가지 더 살펴봅시다. 이 단위가 끝난 후, 자습서는 주로 연습이 코멘트로 작성된 예제 프로그램으로 계속된다. 그 운동들의 대부분은 한 가지 혹은 다른 종류의 게임이다. + +## 조정 게임 + +## 하이 카드 + +## 랜덤성 + +임의의 범위 + + + +비록 무작위성을 생성하기 위한 이 기법은 종종 실제로 작용하지만, 블록체인 맥락에서 "랜덤" 결과는 전적으로 네트워크 검증자에게 달려있다는 것을 기억한다. 만약 유효성 검사자들이 당신의 게임에 이해관계가 있다면, 그들은 게임의 명백한 규칙 밖에서 결과에 영향을 미칠 수 있다. 어떻게 하면 진짜 무작위성을 블록체인들로 만들 수 있을까 하는 것은 열린 질문이다. + + + +## 가위바위보 +이거 큰 운동이야? + +## 기대할 것 +* tic tac 발가락 \ No newline at end of file diff --git a/15-GoingOffChain/README_KR.md b/15-GoingOffChain/README_KR.md new file mode 100644 index 0000000..d94437b --- /dev/null +++ b/15-GoingOffChain/README_KR.md @@ -0,0 +1,29 @@ +# 망가지기 + +지금까지 우리의 모든 연습은 전적으로 Rholang의 세계 안에 존재해 왔다. Rholang은 범용 프로그래밍 언어이지만, 그것의 현재 역할은 블록체인 언어다. 많은 멋진 계약들이 Rholang으로 쓰여지고 있다. 그러나 사람들은 평생을 함께 살지 않는다. 그들은 또한 밖에 나가서 놀고, 저녁을 먹고, 콘서트에 간다. 그리고 그들이 그런 현실 세계의 일들을 하고 있는 동안, 그들은 용서할 수 없는 이름들을 보관할 장소가 필요하다. 왜냐하면 용서할 수 없는 이름들은 오직 블록체인에서만 존재할 수 있기 때문이다. + + + + + +## 이름 레지스트리 +이름 등록부는 그 문제에 대한 부분적인 해결책을 제공한다. 이름을 등록하려면 이 예를 따르십시오. +[insertArbitrary.rho](insertArbitrary).rho) + + +나중에 사용할 이름을 찾으려면 다음을 수행하십시오. +[찾아보기.rho]rho) + +계약 출판사가 나중에 계약을 업데이트할 수 있게 해주는 insertSigned라는 기능도 있지만, 나는 그것에 대한 보안 우려가 있어서 여기에 그것을 문서화하지 않을 것이다. + +## 암호화 +그 명부는 우리에게 우리가 필요로 하는 것에 가까이 다가갈 수 있게 했다. 나머지 과제는 이제 명칭이 공개적으로 접근 가능하도록 할 수 있다는 것이며, 인가된 인원만이 민감 계약에 접근할 수 있도록 어떻게 보장해야 하는가? 구조를 위한 암호화! + + + +TODO 이 섹션은 완료되지 않음 + +Rholang은 해싱 및 시그니처 검증을 위한 기본 구성품이 있음 + +공용 이름에 대해 간단한 서명 확인 계약 수행 방법 표시 +RSign 및 RChain-API에 대한 링크 \ No newline at end of file diff --git a/README.md b/README.md index 1d3d16e..887d15f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Learn rholang by example and experimentation. The examples and exercises are meant to be run, read, modified and completed. For best results, change anything and everything you are curious about. This tutorial is a tour of the most common and important features of rholang and a fast starting point for motivated learners. -[中文教程](README_CN.md) [версия на русском](README_RU.md) +[中文教程](README_CN.md) [версия на русском](README_RU.md) [한국어](README_KR.md) ## Table of Contents * [Rholang Cheat Sheet](cheatSheet/) @@ -37,7 +37,9 @@ up. If you've never ever programmed before, you may struggle at times, but if you know how to write a little python or javascript, you've got all the background I've assumed. - I'm not expecting you to be familiar with process calculi, be a master of any other languages, or understand all the theoretical math discussed in the RChain community. + I'm not expecting you to be familiar with process calculi, be a master of any other languages, or understand all the theoretical math discussed in the RChain community. + +Let's enjoy Code :) ## Additional Resources diff --git a/README_KR.md b/README_KR.md new file mode 100644 index 0000000..38d885f --- /dev/null +++ b/README_KR.md @@ -0,0 +1,59 @@ +# Learn Rholang By Example 한국어 + +Rholang을 사례와 실험으로 배웁니다. +예시와 연습은 실행, 읽기, 수정 및 완료되어야 합니다. +최상의 결과를 위해, 여러분이 궁금해 하는 모든 것을 바꾸어야 합니다. +이 튜토리얼은 가장 흔하고 중요한 Rholang의 특징을 공부하고, +의욕적인 학습자들의 빠른 시작을 도와주는 코스입니다. + +[中文教程](README_CN.md) [версия на русском](README_RU.md) [한국어](README_KR.md) + +## 목차 +* [Rholang Cheat Sheet](ChatSheet/) +* [lesson 0 -- Developer Environment](0-DeveloperEnvironment/) + +### 1단원 + +* [1 - 전송 및 표준 출력](01-SendingAndStandardOut/) +* [2 - 수신](02-Receiving/) +* [3 - 전화, 이름 및 프로세스](03-TelephoneNamesAndProcesses/) +* [4 - 지속적인 전송 및 Peek](04-PersistentSendAndPeek/) +* [5 - 가입 연산자](05-JoinOperator/) + +### 2단원 +* [6 - 영구불가능 이름 및 Acks](06-UnforgeableNamesAndAcks/) +* [7 - 번들 및 보간](07-BundlesAndInterpolation/) +* [8 - 상태 채널 및 방법](08-StateChannelAndMethods/) +* [9 - 개체 기능](09-ObjectCapabilities/) +* [10부 - 추가 구문](10-MoreSyntax/) + +### 3단원 +* [11 - Pattern Matching](11-PatternMatching/) +* [12 - 데이터 구조](12-DataStructures/) +* [13 - 반복](13-iteration/) (개발 중) +* 14과(개발 중) +* [15부 - 연결 안 됨](15회-GoingOffChain/) (개발 중) + + +## 학습 대상 +이 튜토리얼은 초보자를 대상으로 하며, 기초부터 롤랑을 소개하는 것을 목표로 합니다. +만약 여러분이 전에 프로그램한 적이 없다면, 여러분은 때때로 어려움을 겪을 수도 있지만, +만약 여러분이 파이썬이나 자바스크립트를 쓰는 방법을 안다면, 그리 어렵지 않을 겁니다. + + +저희는 여러분이 미적분에 익숙하거나, 다른 언어의 마스터가 되거나, +RChain 커뮤니티에서 논의된 모든 이론적 수학에 대해 이해하길 위해 +튜토리얼을 만든게 아닙니다. 즐겁게 코딩해봐요 :) + + +## 추가 리소스 +* [Mike Stay's Rholang Tutorial](https://developer.rchain.coop/tutorial/) +* [Core team's tutorial](https://github.com/rchain/rchain/blob/master/docs/rholang/rholangtut.md) +* 나는 https://zoom.us/j/6853551826에서 시애틀 시간 목요일 오전 7시에 근무합니다. +* [my website](https://joshyorndorff.com/contact).]을(를) 통해 문의하세요. + +## 제작자 및 라이센스 +RChain 협동조합을 지지하는 Joshy Ornorff에 의해 주로 쓰여졌다. +Julianne Coxe의 그림 + +Apache 2.0 라이센스로 릴리스됨. \ No newline at end of file diff --git a/cheatSheet/README_KR.md b/cheatSheet/README_KR.md new file mode 100644 index 0000000..0ba1b55 --- /dev/null +++ b/cheatSheet/README_KR.md @@ -0,0 +1,24 @@ +# Rholang Cheat Sheet + +[pdf](RholangCheetSheet_10.04.18.pdf) [png](RholangCheetSheet_10.04.18.png) [jpg](RholangCheetheetSheet_10.04.18.jpg)로 다운로드하십시오. +![Relivered criter sheet](110.04.18.png) + +# 에라타 + +## 부울 연산자 +and' or not' + +## 암호화 채널 +secp256k1verify. +"ed25519 확인" +인수: 데이터, 서명, 공개, 반환 + +ke256해시 +샤256해시 +인수: 데이터, 반환 + +## 안티섀도 운영자 +데릭, 뭐가 다른데? + +## 채널 명명법 +rholang world에는 "이름"이라는 단어가 지나치게 과중되어 있다. 나는 원 다이어그램의 맥락에서 "채널"을 사용하기 시작했다. 그것을 갱신해야 할까, 아니면 "이름"이 우리의 어휘에 영구히 박혀 있어야 할까? \ No newline at end of file diff --git a/converter/README_KR.md b/converter/README_KR.md new file mode 100644 index 0000000..e7b97ee --- /dev/null +++ b/converter/README_KR.md @@ -0,0 +1,12 @@ +# 튜토리얼 md 파일을 html로 변환 + +``` +$ cd into a lesson folder +``` +``` +$ run node ../converter/index.js index.md +``` +``` +$ The output is in ./index.html +``` +https://marked.js.org/#/USING_PRO.md