Solidity语言

发布时间:2019-08-06 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Solidity语言脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
知道更多区块链技,请搜索【链客区块链技术问答社区】
链客,有问必答!!

SolidITy是以太坊智能合约的编程语言,我自己也是学习了很久,感觉是有些难度,所以需要去认真的去了解并理解,今天所讲的有基础也有深入的分析,阅读之前,需要对以太坊、智能合约进行初步或者深入的了解。

结构体
Solidity提供struct来定义自定义类型,自定义的类型是引用类型。 
我们看看下面的例子:
PRagma solidity ^0.4.11;

contract CrowDFunding {

// 定义一个包含两个成员的新类型
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) public returns (uint campaignID) {
    campaignID = numCampaigns++; // campaignID 作为一个变量返回
    // 创建一个结构体实例,存储在storage ,放入mapping里
    campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);
}

function contribute(uint campaignID) public payable {
    Campaign storage c = campaigns[campaignID];
    // 用mapping对应项创建一个结构体引用
    // 也可以用 Funder(msg.sender, msg.value) 来初始化.
    c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});
    c.amount += msg.value;
}

function checkGoalReached(uint campaignID) public 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;
}

}
上面是简单版的众筹合约,但可以让我们去理解structs基础概念,其可以用映射和数组中作为元素。其本身也包括映射和数组等类型。
不能声明一个struct同时将自生作为成员,这个限制是基于 结构体大小必须是有限的。但struct可以作为mapping的值类型成员。
注意在函数中,将一个struct赋值给一个局部变量,实际是拷贝的引用,所以修改局部变量值的同时,会影响到原变量。
当然,也可以直接通过访问成员修改值,而不用一定赋值给一个局部变量,如campaigns[campaignID].amount = 0

映射

映射类型,一种键值对的映射关系存储结构。定义方式为mapping(_KeyTyPE => _KeyValue)。键类型允许除映射、变长数组、合约、枚举、结构体外的几乎所有类型。值类型没有任何限制,可以为任何类型包括映射类型。
映射可以被视作为一个哈希表,所有可能的键会被虚拟化的创建,映射到一个类型的默认值。在映射表中,并不存储键的数据,仅仅存储它的keccak256哈希值,这个哈希值在查找值时需要用到。 
映射是没有长度的,也没有键集合或值集合的概念。
映射类型,仅能用来作为状态变量,或在内部函数中作为storage类型的引用。
可以通过将映射标记为public,来让Solidity创建一个访问器。通过提供一个键值做为参数来访问它,将返回对应的值。 
映射的值类型也可以是映射,使用访问器访问时,要提供这个映射值所对应的键,不断重复这个过程。 
来看一个例子:
pragma solidity ^0.4.0;

contract MappingExample {

mapping(address => uint) public balances;

function update(uint newBalance) public {
    balances[msg.sender] = newBalance;
}

}

contract MappingUser {

function f() public returns (uint) {
    MappingExample m = new MappingExample();
    m.update(100);
    return m.balances(this);
}

}
注意: 
映射并未提供迭代输出的方法,可以自行实现一个这样的数据结构。

好了,今天就先写这么多,自己在写的时候都出了些小问题,毕竟不是特别的熟练,都可以算是学了没多久,凑凑活活的写了出来,有不对的希望大家留言指出,多交流。

脚本宝典总结

以上是脚本宝典为你收集整理的Solidity语言全部内容,希望文章能够帮你解决Solidity语言所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。