操作 PIN
当用户尝试操作自己的资产时,需要 6 位 PIN 码,它的功能非常类似于私钥,丢失后无法找回资产。
警告
开发者在操作资金或更改 PIN 时必须非常谨慎。
请注意,PIN 无法恢复或重置! 错误的转移无法撤消!生产环境和测试环境必须分开,并进行全面测试。
加密 PIN
调用 API 时,为了安全地传输 PIN,必须对 PIN 进行加密。在 Go 语言中:
func EncryptPIN(ctx context.Context, pin, pinToken, sessionId, privateKey string, iterator uint64) (string, error) {
 privateBytes, err := base64.RawURLEncoding.DecodeString(privateKey)
 if err != nil {
  return "", err
 }
 private := ed25519.PrivateKey(privateBytes)
 public, err := base64.RawURLEncoding.DecodeString(pinToken)
 if err != nil {
  return "", err
 }
 var dst, curve, pub [32]byte
 PrivateKeyToCurve25519(&curve, private)
 copy(pub[:], public[:])
 curve25519.ScalarMult(&dst, &curve, &pub)
 pinByte := []byte(pin)
 timeBytes := make([]byte, 8)
 binary.LittleEndian.PutUint64(timeBytes, uint64(time.Now().Unix()))
 pinByte = append(pinByte, timeBytes...)
 iteratorBytes := make([]byte, 8)
 binary.LittleEndian.PutUint64(iteratorBytes, iterator)
 pinByte = append(pinByte, iteratorBytes...)
 padding := aes.BlockSize - len(pinByte)%aes.BlockSize
 padtext := bytes.Repeat([]byte{byte(padding)}, padding)
 pinByte = append(pinByte, padtext...)
 block, err := aes.NewCipher(dst[:])
 if err != nil {
  return "", err
 }
 ciphertext := make([]byte, aes.BlockSize+len(pinByte))
 iv := ciphertext[:aes.BlockSize]
 _, err = io.ReadFull(rand.Reader, iv)
 if err != nil {
  return "", err
 }
 mode := cipher.NewCBCEncrypter(block, iv)
 mode.CryptBlocks(ciphertext[aes.BlockSize:], pinByte)
 return base64.RawURLEncoding.EncodeToString(ciphertext), nil
}
其他语言的 SDK 请参考文档。
Setting PIN
const (
 userId     = ""
 pinToken   = ""
 sessionId  = ""
 privateKey = ""
)
func main() {
 ctx := context.Background()
 // Encrypt PIN
 encryptedPIN, err := bot.EncryptEd25519PIN(ctx, "123456", pinToken, sessionId, privateKey, uint64(time.Now().UnixNano()))
 if err != nil {
  fmt.Println(err)
  return
 }
 fmt.Println(encryptedPIN)
 // Set initial code
 err = bot.UpdatePin(ctx, "", encryptedPIN, userId, sessionId, privateKey)
 if err != nil {
  fmt.Println(err)
  return
 }
}
信息
- 参数
iterator必须是递增的并且大于 0。一般建议使用当前系统 Nano 时间,也可以自己选择一个数字,每次调用递增。 - 加密后的 PIN 只能使用一次,更改密码时需要生成两次,不可重复使用。
 - PIN 错误有时间锁定。如果一天失败 5 次,请不要再试,即使 5 次 PIN 正确,也会返回错误。重复更多次将导致更长的锁定时间。建议用户记下试过的 PIN 码,第二天再试。
 - 一旦 PIN 丢失,就永远无法找回。建议开发者让每个用户定期输入,帮助记忆。初始设置时,请务必让用户输入 3 次以上,并提醒用户丢失无法找回
 - 为了资产安全,建议提醒用户不要设置过于简单或常见的组合 PIN,如
123456、111222。