2017-09-28 17 views
0

아무도 어떻게 mapping이 작동하고 왜 정확히 사용되는지 설명 할 수 있습니까? 배열과 마찬가지로 항목 모음입니다. 나는 단호한 경험이 없다, 나는 지금 막 시작하고있다. 견고성 공식 문서 페이지에서이 코드를 발견했습니다.매핑이 어떻게 견고하게 작동하고 다른 대중 언어의 다른 개념과 유사하게 매핑됩니까

pragma solidity ^0.4.11; 

Contract CrowdFunding { 
// Defines a new type with two fields. 
struct Funder { 
    address addr; 
    uint amount; 
} 

struct Campaign { 
    address beneficiary; 
    uint fundingGoal; 
    uint numFunders; 
    uint amount; 
    mapping (uint => Funder) funders; 
} 

uint numCampaigns; 
mapping (uint => Campaign) campaigns; 

function newCampaign(address beneficiary, uint goal) returns (uint campaignID) { 
    campaignID = numCampaigns++; // campaignID is return variable 
    // Creates new struct and saves in storage. We leave out the mapping type. 
    campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0); 
} 

function contribute(uint campaignID) payable { 
    Campaign storage c = campaigns[campaignID]; 
    // Creates a new temporary memory struct, initialised with the given values 
    // and copies it over to storage. 
    // Note that you can also use Funder(msg.sender, msg.value) to initialise. 
    c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value}); 
    c.amount += msg.value; 
} 

function checkGoalReached(uint campaignID) returns (bool reached) { 
    Campaign storage c = campaigns[campaignID]; 
    if (c.amount < c.fundingGoal) 
     return false; 
    uint amount = c.amount; 
    c.amount = 0; 
    c.beneficiary.transfer(amount); 
    return true; 
} 
} 

답변

1

기본적으로 매핑은 다른 프로그래밍 언어의 사전이나지도와 같습니다. Key-to-Value 스토리지입니다.

표준 배열에서는 인덱스 검색입니다. 배열의 열 개 요소가있는 경우 인덱스는 0이다 - 9 그것은 정수의 배열로 다음과 같을 것이다 :

uint[] _ints; 

function getter(uint _idx) returns(uint) { 
    return _ints[_idx]; 
} 

모든 키가이 순서 :

[0] 555 
[1] 123 
... 
[8] 22 
[9] 5 

또는 코드

어레이에 추가 된 순서대로 처리됩니다.

매핑이 약간 다르고 가장 쉬운 방법은 키 조회를 사용한다는 것입니다. 이 정수로 주소의지도가 있다면 그래서 그것은 같이 보일 것입니다 :

[0x000000000000000A] 555 
[0x0000000000000004] 123 
.... 
[0x0000000000000006] 22 
[0x0000000000000003] 6 

또는 코드에서

그래서 기본적으로

mapping(address => uint) _map; 

function getter(address _addr) returns(uint) { 
    return _map[_addr]; 
} 

대신 정수의 객체로 값을 참조하고 짧은. 키는 순차적 일 필요는 없습니다.

+1

좋은 설명. 또한, 여기에 매핑이 설명되어 있습니다 : https://ethereum.stackexchange.com/questions/9893/how-does-mapping-in-solidity-work Solidity의 매핑 내부에 매핑이 가능하다는 것을 추가하고 싶습니다. ;) –