主页 > imtoken官网地址是什么 > 智能合约开发以太坊代币solidity语言版本
智能合约开发以太坊代币solidity语言版本
智能合约开发是以太坊开发的核心之一,代币是区块链应用的关键环节。 下面我们用solidity语言开发一个token合约的例子,希望对大家有所帮助。
以太坊的应用称为去中心化应用(DApp)。 DApp的开发主要包括两个部分:
在本文中,我们将介绍智能合约的开发语言solidity。
让我们从一个非常基本的示例开始,如果您还不明白智能合约 以太坊,请不要担心,我们将逐步了解更多细节。
contract SimpleStorage {
uint storedData;
function set(uint x) {
storedData = x;
}
function get() constant returns (uint retVal) {
return storedData;
}
}
在 Solidity 中,合约由一组代码(合约的函数)和数据(合约的状态)组成。 合同位于以太坊区块链上的一个特殊地址。
uint 存储数据; 这行代码声明了一个state变量,变量名为storedData,类型为uint(256位无符号整数)。 你可以把它看成是数据库中的一个存储单元,就像管理数据库一样,可以通过调用函数来查询和修改。 在以太坊中,通常只有合约的所有者才能这样做。 在本例中,set 和 get 函数分别用于修改和查询变量的值。
与许多其他语言一样,在访问状态变量时,不需要像这样添加前缀。 在它的前面。
这个合约还不能做很多事情(受限于以太坊的基础设施),它只是允许任何人存储一个数字。 世界上任何人都可以访问这个号码,缺乏(可靠的)方法来保护您发布的号码。 任何人都可以调用 set 方法来设置一个不同的号码来覆盖您发布的号码。 但你的号码将保留在区块链的历史中。 稍后我们将学习如何添加访问限制,以便只有您可以修改此号码。
编写代币合约
下一个合约将以最简单的形式实施加密货币。 任何人都可以在不注册用户名和密码的情况下向他人发送货币智能合约 以太坊,只要他们拥有一对以太坊公钥和私钥。
contract Coin {
//关键字“public”使变量能从合约外部访问。
address public minter;
mapping (address => uint) public balances;
//事件让轻客户端能高效的对变化做出反应。
event Sent(address from, address to, uint amount);
//这个构造函数的代码仅仅只在合约创建的时候被运行。
function Coin() {
minter = msg.sender;
}
function mint(address receiver, uint amount) {
if (msg.sender != minter) return;
balances[receiver] += amount;
}
function send(address receiver, uint amount) {
if (balances[msg.sender] < amount) return;
balances[msg.sender] -= amount;
balances[receiver] += amount;
Sent(msg.sender, receiver, amount);
}
}
这份合约引入了一些新概念,让我们一一了解。
address public minter;`
这行代码声明了一个可公开访问的地址类型的状态变量。 地址类型的值大小为 160 位,不支持任何算术运算。 适用于存储合约地址或其他人的公私钥。 public 关键字自动为其修改的状态变量生成访问函数。 没有 public 关键字的变量将无法被其他合约访问。 此外,只能编写本合约中的代码。 自动生成的函数如下:
function minter() returns (address) { return minter; }
当然,我们自己添加这样的访问功能是不可行的。 编译器会抱怨这个函数与状态变量同名。
下一行代码创建一个公共状态变量,但具有更复杂的类型:
mapping (address => uint) public balances;
这种类型将一些地址映射到一个无符号整数。 一个映射可以被认为是一个哈希表,每个可能的键对应的值实际上被初始化为全0。 这个类比不是很严格。 对于一个映射,不可能得到一个包含它所有键或值的链表。 所以我们必须记住我们添加到映射中的内容。 更好的方法是维护这样的链表,或者使用其他更高级的数据类型。 或者仅在不受此缺陷影响的场景中使用映射,例如此示例。 本例中public关键字生成的访问函数会比较复杂,其代码大致如下:
function balances(address _account) returns (uint balance) {
return balances[_account];
}
通过这个功能我们可以方便的查询到特定账户的余额。
event Sent(address from, address to, uint value);
这行代码声明了一个“事件”。 由发送函数中的最后一行代码触发。 客户端(以及服务器应用程序)可以以很少的开销收听这些区块链触发的事件。 当事件被触发时,监听器会同时收到from、to、value的参数值,可以方便的用来跟踪交易。 要侦听此事件,您可以使用以下代码:
Coin.Sent().watch({}, '', function(error, result) {
if (!error) {
console.log("Coin transfer: " + result.args.amount +
" coins were sent from " + result.args.from +
" to " + result.args.to + ".");
console.log("Balances now:\n" +
"Sender: " + Coin.balances.call(result.args.from) +
"Receiver: " + Coin.balances.call(result.args.to));
}
}
请注意在客户端中如何调用自动生成的余额函数。
这是一个特殊功能的硬币。 它是一个构造函数,将在创建合约时运行,之后无法调用。 它永久存储合约创建者的地址。 msg(连同 tx 和 block)是一个神奇的全局变量,它包含一些属于区块链的属性,可以被合约代码访问。 msg.sender 始终保存当前函数的外部调用者的地址。
最后,真正被用户或其他合约调用来完成本合约功能的函数是 mint 和 send。 如果合约创建者之外的其他人调用 mint,则什么也不会发生。 任何人(拥有一定数量的代币)都可以调用 send 将一些代币发送给其他人。 请注意,当您通过此合约向某个地址发送一些代币时,您在区块链浏览器中查询该地址时将看不到任何内容。 由于发送代币导致的余额变化仅存储在代币合约的数据存储中。 通过事件,我们可以轻松创建一个“区块链浏览器”,可以跟踪您的 SGD 交易和余额。
分享两个教程和一些免费资料给读者:
适合区块链初学者的以太坊DApp开发教程:
使用区块链、星际文件系统 (IPFS)、Node.js 和 MongoDB 构建的电子商务平台:
收集整理了一些免费的区块链,以太坊技术开发相关文件,有需要的可以下载,文件链接:
1.中文版web3.js API官方文档:
2、以太坊官方文档中文版:
三、以太坊白皮书中文版:
4、Solidity官方文档中文版:
5、Truffle官方文档中文版:
6. C#区块链编程指南:
七、区块链技术指南:
8、精通中文版比特币:
9. Node.js区块链开发:
10.中文版geth用户指南文档:
11、搭建以太坊DApp-Ubuntu开发环境:
12、搭建以太坊DApp开发环境-windows:
13、以太坊DApp开发私链搭建-Ubuntu:
14.以太坊DApp开发私链搭建-windows: