Solidity 가 뭐죠?

아직도 블록체인을 아는 사람들 매우 적습니다.

사람들에게 설명을 해주기도 쉽지 않은 주제이기도 합니다.

게다가 그 중에서도 이더리움 !!

더욱 더 극소수일 겁니다.

이더리움의 특징 중 하나인 Contract !!

하지만 컨트랙트를 만들기 위해서는 솔리디티(Solidity) 라는 언어를 알아야합니다.

Solidity is a contract-oriented, high-level language whose syntax is similar to that of JavaScript and it is designed to target the Ethereum Virtual Machine (EVM).

솔리디티 도큐먼트 맨 처음에 나오는 말입니다.

EVM(Ethereum Virtual Machine) 위에서 돌아가도록 설계 되어있고, 자바스크립트과 비슷한 문법을 가진다

다른 언어에 비해 문법도 적어서 자바스크립트를 아신다면 배우기는 편할 거라 예상됩니다.

다만 Dapp을 만드려면 솔리디티와 함께 이것을 보여줄 수 있는 페이지가 필요합니다.

주로 Meteor를 사용합니다.

솔리디티를 처음 접하면 생각보다 충격이 클 수도 있습니다.

첫 샘플인 투표(Voting)은 매우 간결하면서도 솔리디티에서 다룰 수 있는 모든 것을 가지고 있다고 생각됩니다.

하지만 개발의 시작인

Hello world!!

가 없습니다 ^^;;

// https://solidity.readthedocs.io/en/develop/solidity-by-example.html
pragma solidity ^0.4.11;
/// @title Voting with delegation.
contract Ballot {
// This declares a new complex type which will
// be used for variables later.
// It will represent a single voter.
struct Voter {
uint weight; // weight is accumulated by delegation
bool voted; // if true, that person already voted
address delegate; // person delegated to
uint vote; // index of the voted proposal
}
    // This is a type for a single proposal.
struct Proposal {
bytes32 name; // short name (up to 32 bytes)
uint voteCount; // number of accumulated votes
}
    address public chairperson;
    // This declares a state variable that
// stores a `Voter` struct for each possible address.
mapping(address => Voter) public voters;
    // A dynamically-sized array of `Proposal` structs.
Proposal[] public proposals;
    /// Create a new ballot to choose one of `proposalNames`.
function Ballot(bytes32[] proposalNames) {
chairperson = msg.sender;
voters[chairperson].weight = 1;
        // For each of the provided proposal names,
// create a new proposal object and add it
// to the end of the array.
for (uint i = 0; i < proposalNames.length; i++) {
// `Proposal({...})` creates a temporary
// Proposal object and `proposals.push(...)`
// appends it to the end of `proposals`.
proposals.push(Proposal({
name: proposalNames[i],
voteCount: 0
}));
}
}
    // Give `voter` the right to vote on this ballot.
// May only be called by `chairperson`.
function giveRightToVote(address voter) {
// If the argument of `require` evaluates to `false`,
// it terminates and reverts all changes to
// the state and to Ether balances. It is often
// a good idea to use this if functions are
// called incorrectly. But watch out, this
// will currently also consume all provided gas
// (this is planned to change in the future).
require((msg.sender == chairperson) && !voters[voter].voted);
voters[voter].weight = 1;
}
    /// Delegate your vote to the voter `to`.
function delegate(address to) {
// assigns reference
Voter sender = voters[msg.sender];
require(!sender.voted);
        // Self-delegation is not allowed.
require(to != msg.sender);
        // Forward the delegation as long as
// `to` also delegated.
// In general, such loops are very dangerous,
// because if they run too long, they might
// need more gas than is available in a block.
// In this case, the delegation will not be executed,
// but in other situations, such loops might
// cause a contract to get "stuck" completely.
while (voters[to].delegate != address(0)) {
to = voters[to].delegate;
            // We found a loop in the delegation, not allowed.
require(to != msg.sender);
}
        // Since `sender` is a reference, this
// modifies `voters[msg.sender].voted`
sender.voted = true;
sender.delegate = to;
Voter delegate = voters[to];
if (delegate.voted) {
// If the delegate already voted,
// directly add to the number of votes
proposals[delegate.vote].voteCount += sender.weight;
} else {
// If the delegate did not vote yet,
// add to her weight.
delegate.weight += sender.weight;
}
}
    /// Give your vote (including votes delegated to you)
/// to proposal `proposals[proposal].name`.
function vote(uint proposal) {
Voter sender = voters[msg.sender];
require(!sender.voted);
sender.voted = true;
sender.vote = proposal;
        // If `proposal` is out of the range of the array,
// this will throw automatically and revert all
// changes.
proposals[proposal].voteCount += sender.weight;
}
    /// @dev Computes the winning proposal taking all
/// previous votes into account.
function winningProposal() constant
returns (uint winningProposal)
{
uint winningVoteCount = 0;
for (uint p = 0; p < proposals.length; p++) {
if (proposals[p].voteCount > winningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal = p;
}
}
}
    // Calls winningProposal() function to get the index
// of the winner contained in the proposals array and then
// returns the name of the winner
function winnerName() constant
returns (bytes32 winnerName)
{
winnerName = proposals[winningProposal()].name;
}
}

다른 언어와 비슷하게 브라우져에서도 컴파일이 가능하도록 되어있습니다.

브라우져에서 하는 것이 더 편하기도 하고요 ~

Remix 라는 프로그램을 이용하면 개발에 매우 용이합니다.

Donation

기부는 사랑입니다.

  • Ƀ BTC : 16MdVNJgvGYbVuaC6KrjGNy2RCrNsaPaZz
  • Ξ ETH : 0x5debb97a6Cc1Fdf686a3C6aA804a623a21deD73c

개발자에게 Starize 도 사랑입니다.

Like what you read? Give Kai Park a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.