블록체인2017.09.01 11:14


https://medium.com/@codeAMT/how-to-launch-swarm-for-dapp-testing-8003e55380e2


이더리움은 최근에 web3.0 기반 기술의 에코시스템에 포함되기 위해 쭈욱 개발되어져 왔다. 브라우저내장의 Mist지갑, dapp messaging package인 Whisper, 탈중앙화된 데이터스토리지인 Swarm등이 있다.


다음은 web3.0에서 dapp개발을 위한 거룩한 삼위일체를 보여준다.



Swarm이 무엇이고 어떻게 동작하는가?


Peer to peer, low latency, 네트웍 데이터 공유를 가능하게 하는 서버같은 노드이고  해시주소로 최종사용자가 리소스에 접근가능하게 해준다.

실서버는 불필요.

파일공유나 데이터자장소를 투명하고 비용효율이 좋은 서비스를 만들 수 있는 잠재력을 가지고 있다. 분산은 피어간의 연결을 통해서 중단없는 서비스가 가능하다.

최종사용자는 새로운 리소스를 배포하는데 비용을 지불한다.

개발자는 이 경로에 게시하는 데이터에 대한 민감도를 고려해야 한다. 데이터는 해시주소에 저장되면 삭제할 수 없다.

비트코인처럼 테스트넷에서 테스트가 가능하며 테스트넷에 swarm을 적재하고 web 3.0dapp으로 게이트웨이를 사용하는 법을 안내할것이다.


TestNet에 Swarm처음 적재하기


1 : go-ethereum 설치


go언어를 설치해야 한다. 다음 링크를 참조하라.


* Go workspace 폴더 생성

* $GOPATH환경변수에 등록

* .bash_profile에 추가

* 작업폴더 생성 (src/github.com/ethereum)

* 작업폴더로 이동 하여 go-ethereum clone

* cd go-ethereum, grab 프로젝트 의존성




2. geth 와 swarm 패키지 컴파일


geth는 노드를 적재하기 위해 swarm은 파일공유를 하기 위해 컴파일 한다.


* run "go install -v ./cmd/geth"

* run "go install -v ./cmd/swarm"



백그라운드에서 go isntall명령이 geth와 swarm 바이너리를 만든다. 



3. 데이터 폴더와 Swarm TestNet계정 만들기


* 폴더를 만들고 testnet 모드로 노드를 시작

* 계정 생성

* 비밀번호 입력



계정이 생성되면 새로 생성된 계정주소를 반환한다.


4. geth node 적재


여기서 geth에 fast 옵션을 추가로 시작하였으며 이는 fast 동기화 다운로드를 수행한다는 뜻이다.



잠시후에 테스트넷 폴더가 데이터 폴더에 자동으로 생성된것을 알 수 있다. 


5. Swarm testnet 시작

새로운 터미널탭에서 swarm을 시작한다. 3가지 옵션이 필요하다

* bzzaccount : geth 계정 주소
* 데이터폴더 경로
* ethapi(테스트넷 폴더내의 geth.ipc로 불리는 파일의 경로)

실행후 계정 비밀번호를 입력한다. 



p2p 네트웍이기 때문에 피러들과 연결되려면 조금 기다려야 한다. 연결이 완료되면 아래와 같은 화면을 볼수 있다.






이제 데이터 폴더에 블랙체인을 모두 다운받아야 한다. 그러면 브라우져를 실행할 준비가 완료된다.


6. 로컬호스트에 억세스하기 위해 브라우저 실행


브라우저를 열고 8500포트에 접속하면 다음화면을 볼수 있다.




이제 서버가 동작하고 있다.


"bzz:/"프록시로 해시나 도메인주소를 입력하면 웹컨텐츠를 볼수 있다.




web3.0브라우저를 사용하면 bzz 스키마로 바로 접근이 가능하다.


7. Web 3.0 서핑하기


swarm 개발자들의 샘플 dapp을 방문해 보아라. http://swarm-gateways.net/bzz:/photoalbum.eth/


로컬에서 swarm홈페이지의 dapp같은 것을 볼 수 있다.



이 앱으로 사용자가 새로 게시하거나 재배치하고 삭제할 수 있다. 오픈소스 앨범이고 개인적 용도로 공유할 수도 있다.


dapp을 수정하게 되면 해시값도 변경된다. swarm은 모든 애플리케이션이 유일한 해시값을 갖기 때문이다.


앱위에 마우스를 갖다 대면 팝업으로 뜨는 메뉴가 있다. dapp의 삭제, 게시, put, get제어가 가능하다.

따라서 이미지를 아래로 이동시키면 아래처럼 새로운  dapp 주소가 생성된다.




애플리케이션 공유하기


일반 웹에서 dapp을 보려면 일반게이트웨이를 통해서 해당 고유 해시를 보아야 한다.


1. 해시 복사

2. 새브라우저 열기

3. 게이트웨이에 bzz 프로토콜 추가

4. 붙여넣기



내 노드에서 시험하기


홈스테드 버전의 Mist지갑에 Swarm이 포함되어 있으며 지갑앱을 통해서 테스트가 가능하다.


Mist지갑 > 계정 > Upload to Swarm을 선택 후 이미지 파일을 선택한다.



로컬호스트 주소에 bzz://로 생성된 해시코드를 주소로 집너 넣는다.

그러면 아래와 같이 내가 업로드한 이미지 파일을 볼 수 있다.







신고
Posted by 삼스
블록체인2017.07.11 15:06


코인 사용하기


토큰을 배포하면 토큰 목록에 추가되고 총 잔액이 계정에 표시된다. 토큰을 보내려면 보내기 탭으로 이동하여 토큰이 포함 된 계정을 선택하라. 계정에있는 토큰은 이더 아래에 나열된다. 그들을 선택하고 보내려는 토큰의 양을 입력하라.

다른 사람의 토큰을 추가하려면 계약 탭으로 이동하여 토큰보기를 클릭하라. 예를 들어, 감시 목록에 Unicorn (🦄) 토큰을 추가하려면 주소 0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7을 추가하기 만하면 나머지 정보가 자동으로로드된다. 확인을 클릭하면 토큰이 추가된다.

유니콘 토큰은 Ethereum Foundation이 관리하는 주소 0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359에 기부 한 사람들을 위해 독점적으로 만들어지는 기념품이다. 이에 대해 더 알고 싶다면 여기를 읽어보아라.


이더리움으로 토큰을 발행하는 방법을 배웠다. 원하는 토큰을 만들 수 있다. 하지만 토큰으로 무엇을 할 수 있을까? 회사의 주식이 가능합니다. 또한 중앙위원회를 사용하여 인플레이션을 제어하기 위해 새로운 동전을 ㅂ라행 할 시기에 투표할 수 있다. 또한 crowdsale을 통해 어떤문제를 위해 돈을 모으기 위해 사용가능 하다. 다음엔 무엇을 만들래?

신고
Posted by 삼스
블록체인2017.07.11 14:54

전체 코드


pragma solidity ^0.4.2;

contract owned {

    address public owner;


    function owned() {

        owner = msg.sender;

    }


    modifier onlyOwner {

        if (msg.sender != owner) throw;

        _;

    }


    function transferOwnership(address newOwner) onlyOwner {

        owner = newOwner;

    }

}


contract tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData); }


contract token {

    /* Public variables of the token */

    string public standard = 'Token 0.1';

    string public name;

    string public symbol;

    uint8 public decimals;

    uint256 public totalSupply;


    /* This creates an array with all balances */

    mapping (address => uint256) public balanceOf;

    mapping (address => mapping (address => uint256)) public allowance;


    /* This generates a public event on the blockchain that will notify clients */

    event Transfer(address indexed from, address indexed to, uint256 value);


    /* Initializes contract with initial supply tokens to the creator of the contract */

    function token(

        uint256 initialSupply,

        string tokenName,

        uint8 decimalUnits,

        string tokenSymbol

        ) {

        balanceOf[msg.sender] = initialSupply;              // Give the creator all initial tokens

        totalSupply = initialSupply;                        // Update total supply

        name = tokenName;                                   // Set the name for display purposes

        symbol = tokenSymbol;                               // Set the symbol for display purposes

        decimals = decimalUnits;                            // Amount of decimals for display purposes

    }


    /* Send coins */

    function transfer(address _to, uint256 _value) {

        if (balanceOf[msg.sender] < _value) throw;           // Check if the sender has enough

        if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows

        balanceOf[msg.sender] -= _value;                     // Subtract from the sender

        balanceOf[_to] += _value;                            // Add the same to the recipient

        Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place

    }


    /* Allow another contract to spend some tokens in your behalf */

    function approve(address _spender, uint256 _value)

        returns (bool success) {

        allowance[msg.sender][_spender] = _value;

        return true;

    }


    /* Approve and then communicate the approved contract in a single tx */

    function approveAndCall(address _spender, uint256 _value, bytes _extraData)

        returns (bool success) {    

        tokenRecipient spender = tokenRecipient(_spender);

        if (approve(_spender, _value)) {

            spender.receiveApproval(msg.sender, _value, this, _extraData);

            return true;

        }

    }


    /* A contract attempts to get the coins */

    function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {

        if (balanceOf[_from] < _value) throw;                 // Check if the sender has enough

        if (balanceOf[_to] + _value < balanceOf[_to]) throw;  // Check for overflows

        if (_value > allowance[_from][msg.sender]) throw;   // Check allowance

        balanceOf[_from] -= _value;                          // Subtract from the sender

        balanceOf[_to] += _value;                            // Add the same to the recipient

        allowance[_from][msg.sender] -= _value;

        Transfer(_from, _to, _value);

        return true;

    }


    /* This unnamed function is called whenever someone tries to send ether to it */

    function () {

        throw;     // Prevents accidental sending of ether

    }

}


contract MyAdvancedToken is owned, token {


    uint256 public sellPrice;

    uint256 public buyPrice;


    mapping (address => bool) public frozenAccount;


    /* This generates a public event on the blockchain that will notify clients */

    event FrozenFunds(address target, bool frozen);


    /* Initializes contract with initial supply tokens to the creator of the contract */

    function MyAdvancedToken(

        uint256 initialSupply,

        string tokenName,

        uint8 decimalUnits,

        string tokenSymbol

    ) token (initialSupply, tokenName, decimalUnits, tokenSymbol) {}


    /* Send coins */

    function transfer(address _to, uint256 _value) {

        if (balanceOf[msg.sender] < _value) throw;           // Check if the sender has enough

        if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows

        if (frozenAccount[msg.sender]) throw;                // Check if frozen

        balanceOf[msg.sender] -= _value;                     // Subtract from the sender

        balanceOf[_to] += _value;                            // Add the same to the recipient

        Transfer(msg.sender, _to, _value);                   // Notify anyone listening that this transfer took place

    }



    /* A contract attempts to get the coins */

    function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {

        if (frozenAccount[_from]) throw;                        // Check if frozen            

        if (balanceOf[_from] < _value) throw;                 // Check if the sender has enough

        if (balanceOf[_to] + _value < balanceOf[_to]) throw;  // Check for overflows

        if (_value > allowance[_from][msg.sender]) throw;   // Check allowance

        balanceOf[_from] -= _value;                          // Subtract from the sender

        balanceOf[_to] += _value;                            // Add the same to the recipient

        allowance[_from][msg.sender] -= _value;

        Transfer(_from, _to, _value);

        return true;

    }


    function mintToken(address target, uint256 mintedAmount) onlyOwner {

        balanceOf[target] += mintedAmount;

        totalSupply += mintedAmount;

        Transfer(0, this, mintedAmount);

        Transfer(this, target, mintedAmount);

    }


    function freezeAccount(address target, bool freeze) onlyOwner {

        frozenAccount[target] = freeze;

        FrozenFunds(target, freeze);

    }


    function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner {

        sellPrice = newSellPrice;

        buyPrice = newBuyPrice;

    }


    function buy() payable {

        uint amount = msg.value / buyPrice;                // calculates the amount

        if (balanceOf[this] < amount) throw;               // checks if it has enough to sell

        balanceOf[msg.sender] += amount;                   // adds the amount to buyer's balance

        balanceOf[this] -= amount;                         // subtracts amount from seller's balance

        Transfer(this, msg.sender, amount);                // execute an event reflecting the change

    }


    function sell(uint256 amount) {

        if (balanceOf[msg.sender] < amount ) throw;        // checks if the sender has enough to sell

        balanceOf[this] += amount;                         // adds the amount to owner's balance

        balanceOf[msg.sender] -= amount;                   // subtracts the amount from seller's balance

        if (!msg.sender.send(amount * sellPrice)) {        // sends ether to the seller. It's important

            throw;                                         // to do this last to avoid recursion attacks

        } else {

            Transfer(msg.sender, this, amount);            // executes an event reflecting on the change

        }               

    }

}


배포


아래로 스크롤하면 배포에 드는 예상 비용이 표시된다. 원한다면 작은 수수료를 설정하도록 슬라이더를 변경할 수 있지만 가격이 평균 시장 가격보다 너무 낮으면 거래가 성사되는데 더 오래 걸릴 수 있다. 배포를 클릭하고 암호를 입력한다. 몇 초 후에 대시 보드로 리디렉션되고 최신 트랜잭션에 "계약 생성"이라고 표시된다. 누군가가 거래를 선택하기까지 잠깐 기다리면 얼마나 많은 다른 노드가 거래를보고 확인했는지 나타내는 푸른 색 직사각형이 보일 것이다. 확인 사항이 많을수록 코드가 배포되었음을 확신 할 수 있다. 



Admin 페이지 링크를 클릭하면 새로 만든 통화로 원하는 모든 것을 할 수있는 세계에서 가장 간단한 중앙 은행 대시 보드를 이용할 수 있다.

계약서 읽기 아래 왼쪽에는 무료로 계약 정보를 읽을 수있는 모든 옵션과 기능이 있다. 토큰에 소유자가 있으면 여기에 주소가 표시된다. 해당 주소를 복사하여 잔액에 붙여 넣으면 모든 계정의 잔액이 표시된다 (잔액은 토큰이있는 계정 페이지에도 자동으로 표시됨).

오른쪽 계약서에 쓰기에서 어떤 방식으로든 블록 체인을 변경하거나 변경할 수있는 모든 기능을 볼 수 있다. 이것들은 가스를 소비 할 것이다. 새로운 동전을 만들 수있는 계약을 만든 경우 "민트 토큰"이라는 기능이 있어야한다. 그것을 선택한다.



새 통화가 생성 될 주소를 선택한 다음 금액을 입력한다 (소숫점이 2로 설정된 경우 금액 뒤에 2 개의 숫자를 추가하여 정확한 수량을 생성한다). 선택에서 소유자로 설정된 계정을 실행하고 이더 금액을 0으로두고 실행을 누른다.

몇 가지 확인 후 수취인 잔액은 새로운 금액을 반영하도록 업데이트된다. 그러나 수령인 지갑에 자동으로 표시되지 않을 수 있다. 사용자 정의 토큰을 인식하려면 지갑을 수동으로 감시 목록에 추가해야 한다. 토큰 주소를 복사한다 (관리자 페이지에서 사본 주소를 누르면된다). 아직 계약 탭으로 이동하지 않았다면 시계 토큰을 누른 다음 주소를 추가한다. 표시되는 이름, 기호 및 십진수는 최종 사용자가 사용자 정의 할 수 있다. 특히 비슷한 (또는 동일한) 이름을 가진 다른 토큰이있는 경우에 유용합니다. 기본 아이콘은 변경 가능하지 않으므로 토큰을 보내고받을 때 주의해야 한다. 토큰을 모방하지 않으면 실제 거래를 처리 할 수 있습니다.



신고
Posted by 삼스

티스토리 툴바