Ming-der Wang, twitter @mingderwang
ming@Log4Analytics.com
JULY 17, 2016
王銘德
如果你做了你的客製化 "tokens" (代幣)
blockchain 網路
如何在 blockchain 網路上開發應用 (app)?
也就是寫一個所謂的"智能合約“
Bitcoin 這個 blockchain 只能
執行它現有的功能, 不能開發程式
比如:
轉帳(A, B, 多少錢)
Ethereum 網路
Ethereum 是一個 blockchain
可以轉帳 (Ether幣), 也能寫程式
也就是寫一個所謂的"智能合約“
那什麼是 "智能合約" - Smart Contracts ?
舉一個簡單的例子
你跟你的好朋友, 賭明天是好天氣或壞天氣, 輸的人給對方 50 塊
舉一個簡單的例子
你跟你的好朋友, 賭明天是好天氣或壞天氣, 輸的人給對方 50 塊
但如果跟一個不認識的賭呢?
對方可能會不認帳
舉一個簡單的例子
你跟你的好朋友, 賭明天是好天氣或壞天氣, 輸的人給對方 50 塊
那先一個人交出 50 塊, 有第三人來仲裁?
第三人可能拿了錢落跑 !!
舉一個簡單的例子
這麼簡單的問題, 就寫成一個 "智能合約"
合約可寫成以下三個功能:
繳錢(帳號位址)
檢查結果
發錢
例如:
開發程式, 你不會用真 Ether幣, 在真的 Ethereum 網路跑程式, 你要用 TEST-NET
建議用 Ethereum 官方網站的 Wallet (mist) 選用 TEST-NET 來測試程式
確定都沒問題, 再到真的 Ethereum 網路去執行
微軟的 Visual Studio 也可以開發 Ethereum, 但不確定成熟度如何
Solidity Realtime Compiler 是一個 online 編輯器和編譯器, 也可以用用看
Ethereum Wallet
Solidity Realtime Compiler
contract mortal {
address owner;
function mortal() {
owner = msg.sender; }
/* Function to recover the funds on the contract */
function kill() {
if (msg.sender == owner)
selfdestruct(owner); }
}
contract helloworld is mortal {
/* helloworld inherits all behaviors of mortal, such as function mortal(), kill() and owner */
string storeData;
function set(string x) {
storeData = x; }
function get() constant returns (string data) {
return storeData; }
}
bool
int8, int16, int24 ... int256
uint8, uint16, ... uint256
uint and int are aliases for uint256 and int256,
address
string
bytes1, bytes2, bytes3, ..., bytes32.
byte is an alias for bytes1
struct Funder { address addr; uint amount; }
int8 y = -3; uint x = uint(y);
uint20 x = 0x123; var y = x;
// y will be unit20 too
uint32 a = 0x12345678; uint16 b = uint16(a); // b will be 0x5678 now
contract MyToken { /* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
function MyToken() {
balanceOf[msg.sender] = 21000000; }
}
contract C { function f(uint len) { uint[] memory a = new uint[](7); bytes memory b = new bytes(len);// memory // Here we have a.length == 7 and b.length == len a[6] = 8; } }
Variables of type bytes and string are special arrays. A bytes is similar to byte[], but it is packed tightly in calldata. string is equal to bytes but does not allow length or index access (for now).
contract Sharer { function sendHalf(address addr) returns (uint balance) { if (!addr.send(msg.value/2)) throw; // also reverts the transfer to Sharer return this.balance; } }
// 後註: throw 已經改用 require 或 assert.
// 詳見: https://medium.com/taipei-ethereum-meetup/solidity-weekly-7-587ccd90ec3e
To create a new contract, such as "Greeter"
https://www.ethereum.org/token#the-code
To use "MyToken" contract to send tokens
address holds a 20 byte value (size of an Ethereum address). Address types also have members, like send()
address x = 0x123; address myAddress = this; if (x.balance < 10 && myAddress.balance >= 10) x.send(10);
All contracts inherit the members of address, so it is possible to query the balance of the current contract using this.balance.
address nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2; nameReg.call("register", "MyName"); nameReg.call(bytes4(sha3("fun(uint256)")), a);
“calldata”, which is a non-modifyable non-persistent area where function arguments are stored. Function parameters (not return parameters) of external functions are forced to “calldata” and it behaves mostly like memory.
Every complex type, i.e. arrays and structs, has an additional annotation, the “data location”.
// 後記:memory 省 gas
contract c {
uint[] x; // the data location of x is storage
// the data location of memoryArray is memory
function f(uint[] memoryArray) {
x = memoryArray; // works, copies the whole array to storage
var y = x; // works, assigns a pointer, data location of y is storage
y[7]; // fine, returns the 8th element
y.length = 2; // fine, modifies x through y
delete x; // fine, clears the array, also modifies y
y = memoryArray; // not working
delete y; // not working
g(x); // calls g, handing over a reference to x
h(x); // calls h and creates an independent, temporary copy in memory
}
function g(uint[] storage storageArray) internal {}
function h(uint[] memoryArray) {}
}
contract DeleteExample {
uint data;
uint[] dataArray;
function f() {
uint x = data;
delete x; // sets x to 0, does not affect data
delete data; // sets data to 0, does not affect x which still holds a copy
}
uint[] y = dataArray;
delete dataArray; // this sets dataArray.length to zero, but as uint[] is a complex object, also
// y is affected which is an alias to the storage object
// On the other hand: "delete y" is not valid, as assignments to local variables
// referencing storage objects can only be made from existing storage objects.
}
}
[ { "constant": false, "inputs": [], "name": "kill", "outputs": [], "type": "function" }, { "constant": false, "inputs": [ { "name": "x", "type": "string" } ], "name": "set", "outputs": [], "type": "function" }, { "constant": true, "inputs": [], "name": "get", "outputs": [ { "name": "data", "type": "string", "value": "hello CCLiang" } ], "type": "function" } ]
寄給他們 Contract JSON
點擊
Contract Address
點擊
http://dapps.ethercasts.com/
Ethereum-based
Bitcoin-based
EtherTW.slack.com 線上討論
https://goo.gl/S6nhKv <---- 加入slack
ming@log4analytics.com
Further Reading: https://medium.com/@ConsenSys/a-101-noob-intro-to-programming-smart-contracts-on-ethereum-695d15c1dab4#.wxbzewj7w