返回首頁
當前位置: 主頁 > 精通Office > 其他教程 >

如何實現一個定制的智能合約地址

時間:2018-11-05 22:30來源:知行網www.aotfjk.live 編輯:麥田守望者

我學習智能合約的一個主要途徑就是在 DappRadar 看各個熱門應用的源代碼,前些天我在看  dice2win 的時候發現一個有趣的現象:雖然它自從上線以來已經多次部署過智能合約,不過讓人好奇的是這些地址有一個特點,都有一個和名字很像的 「D1CE」前綴(因為的地址是十六進制的,所以字母 I 被改為了數字 1)。

 

如何實現呢,其實 ethereum 源代碼里已經給出答案:

func CreateAddress(b common.Address, nonce uint64) common.Address {
data, _ := rlp.EncodeToBytes([]interface{}{b, nonce})
return common.BytesToAddress(Keccak256(data)[12:])
}

也就是說,合約地址完全是由 address 和 nonce 決定的,如果我們希望用一個全新的賬戶來部署合約,那么當它第一次部署的時候,nonce 必然是 0,于是乎可以推斷合約地址完全是由 address 決定的,順著這個思路,我們只要不斷生成新的 address,然后判斷它們第一次部署的合約地址是否滿足定制的 pattern 即可,附上 golang 源代碼:

編譯后,當執行命令行的時候,指定你想要的 pattern 即可,一旦匹配成功,我們就可以通過生成的賬戶來部署合約了,不過在部署前你需要確保賬戶里有足夠的以太來支付部署費用。我在 ropsten 測試網絡部署了一個地址前綴定制為 ABCD 開頭的合約:

 

import (
"encoding/hex"
"flag"
"fmt"
"regexp"
"sync"
"sync/atomic"

"github.com/ethereum/go-ethereum/crypto"
)

var (
concurrency = flag.Int("c", 10, "concurrency")
number = flag.Int64("n", 1, "number")
pattern = flag.String("p", "", "pattern")
)

func init() {
flag.Parse()
}

func main() {
var wg sync.WaitGroup

wg.Add(*concurrency)

reg := regexp.MustCompile("^0x" + *pattern)
nonce := uint64(0)

for i := 0; i < *concurrency; i++ {
go func() {
defer wg.Done()
run(reg, nonce)
}()
}

wg.Wait()
}

func run(reg *regexp.Regexp, nonce uint64) {
for *number > 0 {
key, _ := crypto.GenerateKey()
address := crypto.PubkeyToAddress(key.PublicKey)
contract := crypto.CreateAddress(address, nonce).Hex()

if !reg.MatchString(contract) {
continue
}

if atomic.AddInt64(number, -1) < 0 {
break
}

privateKey := hex.EncodeToString(key.D.Bytes())

fmt.Printf("Contract:\t%s\nAddress:\t%s\nPrivateKey:\t%s\n\n",
contract,
address.Hex(),
privateKey,
)
}
}


需要說明的是,源代碼匹配的時候使用了正則,這可能有點慢,如果追求更高的效率,可以犧牲一下匹配的靈活度,通過「strings.HasPrefix」來按字符串匹配。

 
 
 

package main

------分隔線----------------------------
標簽(Tag):智能合約地址
------分隔線----------------------------
推薦內容
猜你感興趣
湖南刘雪龙黑彩